【发布时间】:2023-03-08 14:15:01
【问题描述】:
抱歉,如果您已经在 serverfault 上看到了这个问题,但它已经存在好几天了,我完全没有任何吸引力......
我正在构建一个基于 iptables 的防火墙配置工具,并试图让“线路中的碰撞”场景正常工作。
假设在网桥br0 和第三个接口eth2 中设置eth0 和eth1:
| | |
eth0 eth1 eth2
| == br0== | |
| |
| |
--- linux node ---
在这种情况下,假设我希望 TCP 端口 80 流量流向连接到eth0 的网络,但允许它流向eth1。
因此,我试图可靠地匹配通过特定接口 eth0 发出的数据包。
如果我在filter 表中添加以下 iptables 规则:
-A FORWARD -o br0 --physdev-out eth0 -j LOG
给定一个来自eth1(网桥的另一半)的数据包,那么规则匹配得很好,记录:
... IN=br0 OUT=br0 PHYSIN=eth2 PHYSOUT=eth1 ...
但是,如果数据包来自eth2,则规则不再匹配。
我似乎路由算法无法确定选择哪个桥接接口,因此数据包通过桥接中的两个接口发送出去。
如果我添加另一个更混杂的日志规则,那么我会得到该数据包的以下日志输出:
... IN=eth2 OUT=br0 ...
我的猜测是,在第一种情况下,路由算法可以选择网桥上的另一个接口,因为该数据包不应该按照它来的方式出去。在第二种情况下,它没有选择特定的接口,然后你就根本没有得到任何 physdev 信息!
但是,如果网桥已获知目标 MAC 地址(如brctl showmacs br0 所示),则它可以确定正确的接口,并且您会再次获得 physdev 信息。
(还有第三种情况:如果网桥包含三个似乎适用于的接口,那么它仍然无法建立单个接口来发送数据包,只是排除源接口。)
那么,问题是,无论如何,我怎样才能可靠地匹配通过eth0 发出的数据包?
鉴于我在开始时给出的示例,仅匹配将通过多个接口路由出去的数据包是不够的,其中一个接口是eth0(尽管这在其他场景中很有用)。我希望能够以不同的方式处理eth0 和eth1 的流量,允许eth1 的流量,但不允许eth0。
【问题讨论】:
标签: linux-kernel iptables netfilter