使用ebtables的时候碰到一个问题,本地简化复现大概如下:
本地实际存在的,转发icmp报文的linux bridge是br_test,而规则中“ --logical-in test ”涉及的bridge “test” 是其他网桥或者是一个不存在的网桥,按道理是匹配不到的,icmp报文可以正常转发,但是配置了这个“-p IPv4 --logical-in test --ip-proto icmp -j DROP”之后,机器上所有的其他网桥都无法转发icmp报文了。
[root@sheng3 ~]# ebtables -t nat -L
Bridge table: nat
Bridge chain: PREROUTING, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Bridge chain: POSTROUTING, entries: 1, policy: ACCEPT
-j LOOPDETECT_FULL
Bridge chain: LOOPDETECT_FULL, entries: 1, policy: RETURN
-p IPv4 --logical-in test --ip-proto icmp -j DROP
Bridge chain: LOOPDETECT_br-gw2, entries: 1, policy: RETURN
-p IPv4 --ip-proto icmp -j DROP
原因是,POSTROUTING 、OUTPUT 链中是不匹配入接口,入网桥。PREROUTING、INPUT是不匹配出接口、出网桥。当然也没有相关数据,所以回直接忽略掉相关字段,但是仍然会匹配其他字段,所以“-p IPv4 --logical-in test --ip-proto icmp -j DROP” 实际上是“-p IPv4 --ip-proto icmp -j DROP”导致所有网桥都丢弃了icmp报文。
正常在PREROUTING或者PREROUTING上配置规则都会做检查,如:
ebtables -t nat -A POSTROUTING -i veth1_out DROP
Use -i only in INPUT, FORWARD, PREROUTING and BROUTING chains.
但是自建链表无法检查,所以在这种情况下一定要清楚自己创建的链表工作在哪条系统链表下,否则会出现莫名其妙的错误。
ebtables、iptables都有这个问题。
网友评论