我正在构建一个基于 iptables 的防火墙配置工具,并试图让“线路中的颠簸”场景工作。
给定一个设置有eth0
和eth1
在桥梁br0
和第三界面eth2
:
| | |
eth0 eth1 eth2
| == br0== | |
| |
| |
--- linux node ---
Run Code Online (Sandbox Code Playgroud)
在这种情况下,假设我希望 TCP 端口 80 流量在进入连接到的网络时被丢弃eth0
,但允许它进入eth1
.
因此,我试图可靠地匹配通过特定接口发出的数据包eth0
。
如果我在filter
表中添加以下 iptables 规则:
-A FORWARD -o br0 --physdev-out eth0 -j LOG
Run Code Online (Sandbox Code Playgroud)
给定一个来自eth1
(桥的另一半)的数据包,那么规则匹配得很好,记录:
... IN=br0 OUT=br0 PHYSIN=eth2 PHYSOUT=eth1 ...
Run Code Online (Sandbox Code Playgroud)
但是,如果数据包来自eth2
,则规则不再匹配。
我似乎路由算法无法确定选择哪个桥接接口,因此数据包通过桥接器中的两个接口发送出去。
如果我添加另一个更混杂的日志规则,那么我会得到该数据包的以下日志输出:
... IN=eth2 OUT=br0 ...
Run Code Online (Sandbox Code Playgroud)
我的猜测是,在第一种情况下,路由算法可以只选择网桥上的另一个接口,因为该数据包不应该按照它来的方式出去。在第二种情况下,它没有选择特定的接口,然后您根本没有得到 physdev 信息!
但是,如果网桥已获知目标 MAC 地址(如 …