前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「Linux路由实践」之实现跨多网段通信【网络路由篇】

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

作者头像
用户1456517
发布2019-03-05 16:15:17
8K0
发布2019-03-05 16:15:17
举报
文章被收录于专栏:芝麻实验室

环境说明:

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

好了,我们开始吧~

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

  • 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各自的路由表:

代码语言: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.成功。


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/08/24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档