「Linux路由实践」之实现跨多网段通信【网络路由篇】

您所在的位置:网站首页 路由转发怎么设置网络 「Linux路由实践」之实现跨多网段通信【网络路由篇】

「Linux路由实践」之实现跨多网段通信【网络路由篇】

2024-07-13 07:23| 来源: 网络整理| 查看: 265

环境说明:

四个不同的网段![alt]目标通信的2台Linux主机(不同网段)3台用作中间路由的Linux主机,且每台主机有2张网卡,分别连接不同其左右的两个网段拓扑图 netRoutenetRoute

好了,我们开始吧~

我们向看一下相关的网络配置信息:

Host A:192.168.11.100/24Host B:192.168.14.100/24Server 1: A: 192.168.11.1/24B: 192.168.12.1/24Server 2: C: 192.168.12.2/24D: 192.168.13.1/24Server 3: E: 192.168.13.2/24F: 192.168.14.1/24

为了实现,主机A和主机B的跨网段访问,我们需要通过路由把各个网段连接起来。并利用Linux Kernel的内部机制实现转发,以下为具体实现:

1.我们先看下主机A和主机B各自的路由表:

代码语言:javascript复制[root@host_A ~]# route -n #主机A的路由信息 Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Ifac e 192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 [root@host_b ~]# route -n #主机B的路由信息 Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Ifac e 192.168.14.0 0.0.0.0 255.255.255.0 U 100 0 0 ens3 3

正如我们所知道的那样,主机AB是无法通信的

代码语言:javascript复制[root@host_A ~]# ping 192.168.14.100 connect: Network is unreachable [root@host_b ~]# ping 192.168.11.100 connect: Network is unreachable

2.通过网络拓扑图,我们发现:

在主机A和B之间,一共有3台Server,中间没有交换机及路由等网络设备因此主机A和主机B分别同Server1、Server3同一个网段Server 1的网卡A-B分别位于11.0/24和12.0/24网段;Server 2的网卡C-D分别位于12.0/24和13.0/24网段;Server 3的网卡E-F分别位于13.0/24和14.0/24网段

因此,如果想实现AB主机的通信,我们可以通过Linux Kernel自带的内核转发功能,实现主机网卡流量转发。具体的实现,如下文

3.首先,我们要赋予主机“寻路”的能力。为此,我们需要设置路由表,将默认路由指向Server1,以下为指令实现:

代码语言:javascript复制[root@host_A ~]# route add default gw 192.168.11.1 [root@host_A ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Ifac e 192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 192.168.11.1 0.0.0.0 UG 0 0 0 eth0

同样的,将主机B的默认网关指向Server3:

代码语言:javascript复制[root@host_b ~]# route add default gw 192.168.14.1 [root@host_b ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Ifac e 0.0.0.0 192.168.14.1 0.0.0.0 UG 0 0 0 ens3 3 192.168.14.0 0.0.0.0 255.255.255.0 U 100 0 0 ens3 3

4.接下来,我们设置Server 1。我们都知道,如果两个网络设备之间是直连线路,那就意味着它们在同一个网络中;如果不是,则将网关指向下一跳路由(或具有路由功能)设备的最邻近网口。如拓扑图所示,Server1的网卡分别同主机A和Server2同一个网络,我们需要做的就是将目标网络为13.0/24和14.0/24的流量传递给Server2的网口C,即分别设置2条网络路由:

代码语言:javascript复制[root@server_1 ~]# route add -net 192.168.13.0/24 gw 192.168.12.2 [root@server_1 ~]# route add -net 192.168.14.0/24 gw 192.168.12.2 [root@server_1 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Ifac e 192.168.14.0 192.168.12.2 255.255.255.0 UG 0 0 0 eth1 192.168.13.0 192.168.12.2 255.255.255.0 UG 0 0 0 eth1 192.168.12.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

类似的,我们在Server2上添加路由条目:

代码语言:javascript复制[root@server2 ~]# route add -net 192.168.11.0/24 gw 192.168.12.1 [root@server2 ~]# route add -net 192.168.14.0/24 gw 192.168.13.2 [root@server2 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Ifac e 192.168.11.0 192.168.12.1 255.255.255.0 UG 0 0 0 ens3 3 192.168.12.0 0.0.0.0 255.255.255.0 U 0 0 0 ens3 3 192.168.13.0 0.0.0.0 255.255.255.0 U 0 0 0 ens3 7 192.168.14.0 192.168.13.2 255.255.255.128 UG 0 0 0 ens3 7

Server3上:

代码语言:javascript复制[root@server_3 ~]# route add -net 192.168.12.0/24 gw 192.168.13.1 [root@server_3 ~]# route add -net 192.168.11.0/24 gw 192.168.13.1 [root@server_3 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Ifac e 192.168.14.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 192.168.13.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.12.0 192.168.13.1 255.255.255.0 UG 0 0 0 eth0 192.168.11.0 192.168.13.1 255.255.255.0 UG 0 0 0 eth0 [root@server_3 ~]#

5.仅仅配置了路由表还是不够的,因为Serer1、2、3虽然都配有双网卡,但终究是不同网段,路由表不能突破硬件,这时候就需要调用Kernel同物理硬件的联系功能了,也就是打开内核转发功能,实现网口1收到的流量转向网口2。

代码语言:javascript复制[root@server_1 ~]# cat /proc/sys/net/ipv4/ip_forward 0 [root@server_1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@server_1 ~]# cat /proc/sys/net/ipv4/ip_forward 1

同样,依次在Server2和3上也打开内核转发功能,这里不再赘述。

6.记得关闭转发用Server的防火墙(或放行icmp流量)

代码语言:javascript复制[root@server_1 ~]# service iptables stop # Server2/3类似 iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ]

7.现在,我们开始PING测试

代码语言:javascript复制[root@host_A ~]# ping 192.168.14.100 PING 192.168.14.100 (192.168.14.100) 56(84) bytes of data. 64 bytes from 192.168.14.100: icmp_seq=1 ttl=61 time=1.30 ms 64 bytes from 192.168.14.100: icmp_seq=2 ttl=61 time=2.01 ms 64 bytes from 192.168.14.100: icmp_seq=3 ttl=61 time=1.00 ms代码语言:javascript复制[root@host_b ~]# tcpdump -i ens33 -nn icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes 23:23:01.134677 IP 192.168.11.100 > 192.168.14.100: ICMP echo request, id 23559, seq 7, length 64 23:23:01.134708 IP 192.168.14.100 > 192.168.11.100: ICMP echo reply, id 23559, seq 7, length 64 23:23:02.136686 IP 192.168.11.100 > 192.168.14.100: ICMP echo request, id 23559, seq 8, length 64

8.成功。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3