问题陈述
我有一个名为cni0
的网桥,它连接到它们自己的网络名称空间中的容器。
当我尝试创建到这些容器之一的静态路由时, Linux内核的较旧版本将路由流量并将其桥接到该容器(通过ping和tcpdump测试)。新版本则没有。
复制步骤
我在cni0
上有一个桥接接口,该接口正在网络命名空间内的10.5.2.19
上监听。同一接口也在10.233.1.18
上监听。我也有一个外部接口eth1
,上面没有任何内容或无关的地址。 cni0
上有10.233.64.1/24
个地址,上面有通常的本地路由以及指向该地址的路由10.233.64.0/24
。
在主机名称空间中,我创建一条路由,如下所示:
ip route add 10.5.2.19 via 10.233.1.18
我可以从主机名称空间ping 10.5.2.19
,并且数据包到达我测试过的所有内核版本的网络名称空间。
使用静态ARP,我无法从某些较新版本的内核上的远程主机ping。 ICMP数据包从eth1
接口进入,然后无路可走。我能够找到的任何柜台上都没有下落。我看不到试图找到10.5.2.19
的任何ARP,如果我尝试路由到eth3
这样的普通接口,就会发生这种情况。
我为所有接口设置了rp_filter=0
,log_martians=1
和accept_local=1
。 (以及all
和default
)没有道者被记录。
我检查了一下,ebtables
和iptables
中没有任何干扰。 ip route show table 0 | grep 10.5.2.19
仅显示我在上面添加的路线。
工作和不工作的内核版本
有效的内核版本:
3.10.0-862.14.4.el7.x86_64 # Centos 7.5.1804
此行内核中的先前版本也可以使用。
无效的内核版本:
3.10.0-957.1.3.el7.x86.64 #CENTOS 7.6.1810
也无法正常工作:Fedora行中的4.11.x
经测试无法正常工作
(考虑到RedHat的樱桃小贴士最近从4.x带回来的东西,这不会令我感到惊讶)。
所以要 重申我的问题 :为什么路由到网桥会起作用,而不再适用于较新的内核版本?是否因为Linux不支持此功能而我才很幸运?