现有DELL R710服务器称其为S1,操作系统为linux系统,S1的eth1/eth2网卡做bond0,IP地址为172.30.1.13/24,连接思科catalyst4948交换机的VLAN2,VLAN2的IP地址为:172.30.1.1/24,S1以VLAN2地址为其默认网关。S1的eth0单独一块网卡,配置IP地址为:172.30.2.85/24,连接交换机的VLAN3,VLAN3的IP地址为:172.30.2.1。
现在的问题是:
1.S2 ping S1的172.30.2.85 通
2.S2 ping S1的172.30.1.13 不通
3.S1 使用172.30.2.85 ping S2 通 (ping -I命令来制定ping使用的源地址)
4.S1 使用172.30.1.13 ping S2 不通
禁止掉S1的172.30.2.85后
5.S1 使用172.30.1.13 ping S2 通
6.S2 ping S1的172.30.1.13 通
7.S1 使用172.30.1.13 ping 非2网段的其他网段(如172.30.3.3) 通
8.S1 使用172.30.2.85 ping 非2网段的其他网段 不通
至此可以得知开启S1 eth0(172.30.1.13)后,就影响了此拓扑中1网段和2网段的联通。 那么为什么会这样呢?我们顺着ping的流程来细细排查。
对于1的解释:
首先要知道在上述1序号的测试中S2与S1为什么是联通的?因为S2与S1的172.30.2.85是在一个网段,且在一个VLAN3中,当S2请求172.30.2.85的ARP广播是可达的不被阻隔的,反之S1的172.30.2.85的ARP回复应答同样。这也就证明了同一VLAN是一个大的广播域。
对于2的解释:
S2当ping 172.30.1.13时,因为ping的目的地址和S2其本身不再一个网段,S2会把ping的路由交给172.30.2.1这个网关,当到达三层交换机后,在路由表中是存在172.30.1.0这个路由的,路由表显示是直连,事实也确实是这样,交换机会在1网段,也就是VLAN2做一个ARP广播,1网段的172.30.1.13肯定会受到此广播请求的。但是,当172.30.1.13要回应这个ARP请求时,问题出现了,S1本身虽然是一台linux主机,但是它也是有路由表的,比如命令:route -n。S1会查询自己本身的路由表,发现自己就存在要回复的S2的2网段,在路由概念里有这样一个规则,就是最佳匹配规则,那么S1本身既然存在2网段,S1就不会再通过其默认路由172.30.1.1来回复S2的请求,他会认为我既然有2网段直连,那么我就已经和整个2网段直连,S2会发起一个ARP广播来寻找172.30.2.8,发起此次广播的一定是172.30.1.13,因为起始是S2对172.30.1.13做的ping请求。但是172.30.1.13在VLAN2,S2的172.30.2.8在VLAN3,不同VLAN之间是隔离广播的。这也说明了禁止掉172.30.2.85后的步骤6虽然和步骤2相同,但步骤6却通了。因为S1不存在2网段的直连信息,S1不会再进行本地对2网段的ARP广播,S1会使用路由判断2网段非本网段,且本网段没有可用静态路由,所以就把回复交给172.30.1.1这个默认路由(这也是默认路由的作用),这也同样解释了S1使用172.30.1.13ping非2网段的可用地址时是联通的原因。综上所述这个2步骤的ping测试是不通的。
对于3的解释:
参考1
对于4的解释:
同样也是本地172.30.1.13对2网段进行ARP广播无果造成不通的原因
参考2
对于8步骤做一个解释:
为什么S1没有对2网段设置路由,没有到其他网段路由就不能和非本网段通讯。
那么怎样在S1两个网口都开启情况下,可以和2网段有一个双向联通呢?
回忆一下上面的问题解释,其实对于2和4步骤的不连通原因,就是当数据包从172.30.1.13上返回到172.30.2.8的时候没有找到正确的回复出口,也可以理解为回程路由。在进一步说明情况的前提下,我们理解一个概念,就是静态路由和默认路由
默认路由是当路由表中不存在任何可匹配的路由时,把数据包交给默认路由。
静态路由是手工配置路由指向,把对未知网段的路由交给自己的下一跳。静态路由级别高于默认路由。
在S1上已经有172.30.1.1这样一条默认路由,但是为什么就不能把到2网段的回程数据交给此默认路由?就是因为S1查找2网段是直连的。不是符合默认路由使用规则(当路由表中不存在任何可匹配的路由时使用默认路由)
所以现在我们需要S1上配置一个静态路由,但是是配置到172.30.2.1的静态路由还是172.30.1.1的静态路由?我们需要理解一下,如果配置到172.30.2.1的静态路由是不符合路由规则的,S1本身就存在2网段,那么不能在对2网段的路由指定给本网段。
最终指定172.30.1.1作为静态路由,当2步骤ping中S1的回程路由会指定到172.30.1.1。以上问题得以解决。
其实对于上面我的很多解释是有不少牵强之处的,没有扎实的理论作为讲解是一大遗憾,希望更多理解TCP/IP等协议后,回头我会丰富修正一下我对此片文章的讲解。
谢谢!