本站使用了 Pjax 等基于 JavaScript 的开发技术,但您的浏览器已禁用 JavaScript,请开启 JavaScript 以保证网站正常显示!

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

环境说明:

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

好了,我们开始吧~

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

  • Host A:192.168.11.100/24
  • Host B:192.168.14.100/24
  • Server 1:

    • A: 192.168.11.1/24
    • B: 192.168.12.1/24
  • Server 2:

    本文转自数字漩涡。

    • C: 192.168.12.2/24
    • D: 192.168.13.1/24
  • Server 3:

    • E: 192.168.13.2/24
    • F: 192.168.14.1/24

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

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

[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是无法通信的

[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,以下为指令实现:

本文来源:数字漩涡

[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:

Waning: Unauthorized Copied! Source:数字漩涡
[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条网络路由:

[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上添加路由条目:

请保留出处

[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上:

[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。

请联系作者获得授权!

[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流量)

[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测试

[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
[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.成功。

转载请先获得授权


 继续浏览关于 的文章

 本文最后更新于 2018/04/30 04:32:03,可能因经年累月而与现状有所差异

 引用转载请注明:数字漩涡 > > 「Linux路由实践」之实现跨多网段通信【网络路由篇】

发现共鸣

如是说:你看这个碗他又大又圆~