迫使networkingstream量通过特定的非默认接口进行路由

我有一堆带有多个(3)NIC和相关networking接口的Linux服务器。 我绊倒了一个奇怪的路由问题,在那里应该使用默认路由的stream量不是,因此无法路由。 这是我的路由表看起来像:

# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.31.96.1 0.0.0.0 UG 0 0 0 em3 10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 em1 10.31.96.0 0.0.0.0 255.255.252.0 U 0 0 0 em3 10.31.96.0 0.0.0.0 255.255.252.0 U 0 0 0 em4 # ip route list default via 10.31.96.1 dev em3 proto static 10.0.0.0/8 dev em1 proto kernel scope link src 10.0.0.100 10.31.96.0/22 dev em3 proto kernel scope link src 10.31.97.100 10.31.96.0/22 dev em4 proto kernel scope link src 10.31.96.61 

10.31.96.1是我所有stream量都应该使用的默认路由(em#是Fedora的东西,如果能让它更容易遵循,你可以安全地用'eth'代替'eth')。 这里是ifconfig输出:

 em1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.100 netmask 255.0.0.0 broadcast 10.255.255.255 inet6 fe80::b6b5:2fff:fe5b:9e7c prefixlen 64 scopeid 0x20<link> ether b4:b5:2f:5b:9e:7c txqueuelen 1000 (Ethernet) RX packets 283922868 bytes 44297545348 (41.2 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 538064680 bytes 108980632740 (101.4 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device memory 0xfeb60000-feb80000 em3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.31.97.100 netmask 255.255.252.0 broadcast 10.31.99.255 inet6 fe80::b6b5:2fff:fe5b:9e7e prefixlen 64 scopeid 0x20<link> ether b4:b5:2f:5b:9e:7e txqueuelen 1000 (Ethernet) RX packets 3733210 bytes 1042607750 (994.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1401537 bytes 114335537 (109.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device memory 0xfea60000-fea80000 em4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.31.96.61 netmask 255.255.252.0 broadcast 10.31.99.255 inet6 fe80::b6b5:2fff:fe5b:9e7f prefixlen 64 scopeid 0x20<link> ether b4:b5:2f:5b:9e:7f txqueuelen 1000 (Ethernet) RX packets 2416588 bytes 196633917 (187.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 205038 bytes 19363499 (18.4 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device memory 0xfeae0000-feb00000 

em1 / 10.0.0.100转到连接到同一机架中的服务器的交换机。 它仅用于机架中的服务器进行通信。 em3和em4都路由到相同的子网。 它们之间的唯一区别是,em3并不总是(它与一个基于哪个服务器当前处于“主”angular色的浮动IP地址相关联)。 基本上所有的stream量都应该通过em3出去,除非它在本地10.0.0.1/8子网上的其他地方发送,在这种情况下,它应该通过em1。 但是,这不是发生的事情。 10.31.96.1/16,10.31.97.1/16和10.31.99.1/16stream量正在经过em3,但是注入10.31.45.1/16的东西正在试图通过em1,因为没有办法路由交通有效。

这也用以下命令说明:#tcptraceroute cuda-linux traceroute到cuda-linux(10.31.45.106),最多30跳,60字节数据包1 cuda-fs1a-内部(10.0.0.100)3006.650 ms!H 3006.624 ms! H 3006.619 ms!H

然而,当从与上面的方框相同的networking上运行时,只有一个networking接口,它工作:#tcptraceroute cuda-linux traceroute到cuda-linux(10.31.45.106),最多30跳,40字节的数据包1 10.31 .96.2(10.31.96.2)0.345ms 0.403ms 0.474ms 2 cuda-linux(10.31.45.106)0.209ms 0.208ms 0.201ms

我认为我可以通过为em3添加一个到10.31.45.1的path来解决这个问题,但是失败了:

 # route add default gw 10.31.45.1 em3 SIOCADDRT: Network is unreachable 

我在这一点上失去了什么尝试。 帮帮我?

路由从最具体的路由处理到最不具体的(又名默认)路由。

 default via 10.31.96.1 dev em3 proto static 10.0.0.0/8 dev em1 proto kernel scope link src 10.0.0.100 10.31.96.0/22 dev em3 proto kernel scope link src 10.31.97.100 10.31.96.0/22 dev em4 proto kernel scope link src 10.31.96.61 

你说你想should be going out through em3 unless its destined for something else on the local 10.0.0.1/8 subnet 。 这正是发生的事情。 IP地址10.31.45.110.0.0.0/8内,所以它通过em1离开。 10.0.0.0/8路由匹配该地址更具体,然后默认路由。 该地址与10.31.96.0/22路由不匹配。 因此select了em1路由。

您真正的问题是,您在em1接口上有一个子网掩码,对于您可能需要的接口来说太大了,而且与其他networking冲突。 任何发往10.0.0.1-10.255.255.254范围内的IP地址的东西都会尝试使用em1,就好像它是本地的一样,这是10.31.96.0/22中通过em3 / em4离开的地址的例外。

您的解决scheme是修复em1子网/networking,使其不会与其他networking发生冲突,或者添加大量路由。

ip route add 10.31.45.0/24 via 10.31.96.1可能做你想做的。