环境说明:
好了,我们开始吧~
我们向看一下相关的网络配置信息:
为了实现,主机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.通过网络拓扑图,我们发现:
因此,如果想实现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:
[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.成功。