道歉,如果您已经在服务器故障中看到了这一点,但它已经在那里停留了好几天了,而且我已经完全没有牵引力......
我正在构建一个基于iptables的防火墙配置工具,并尝试在线路中加入一个"情景工作。
在网桥eth0
和第三个接口eth1
中设置了br0
和eth2
的设置:
| | |
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 informatino。
(还有第三种情况:桥接器包含三个似乎适用的接口,然后它仍然无法建立单个接口来发送数据包,只是排除源接口。)< / p>
所以,问题是,我怎样才能可靠地匹配eth0
以外的数据包?
鉴于我在开始时提供的示例,仅仅匹配将通过多个接口路由出的数据包是不够的,其中一个接口是eth0
(尽管这在其他情况下会很有用)。我希望能够以不同方式处理eth0
和eth1
的流量,允许流量为eth1
,而不是eth0
。
答案 0 :(得分:1)
观察到的行为的原因
当数据包从非桥接接口到达时iptables没有获得物理网桥信息的原因是数据包从未接近桥接机制,即使此时我们知道我们正在发送它在桥上。
如果数据包确实通过桥接端口到达,但它是一个N> 2桥接器,问题是iptables PHYSDEV扩展只提供了它们作为&#34; out&#34;的一个值,所以它只是没有告诉我们是否有两个。
<强>解决方案强>
使用ebtables而不是iptables。 ebtables OUTPUT
链将知道它正在发送数据包的物理桥接接口。
在上面的场景中,您希望过滤通过特定桥接接口(eth0
)离开的数据包,无论它如何进入系统,请按以下行添加ebtables规则:
-A OUTPUT -o eth0 -j <target>
在一个更复杂的场景中,您希望过滤从特定接口到达的数据包,并通过桥接接口离开,这会变得更加困难。假设我们要将所有流量从eth2
(非桥接)转移到eth0
(桥接为br0
的一部分)我们需要将此规则添加到 iptables :
-A FORWARD -i eth2 -o br0 -j MARK --set-mark 1234
这将标记来自eth2
并绑定到网桥的任何数据包。然后我们将此规则添加到 ebtables :
-A OUTPUT -physdev-out eth0 --m mark --mark 1234 -j DROP
其中DROP
将由iptables标记的任何数据包(来自eth2
)通过特定网桥端口eth0
发送。
<强>致谢强>
感谢Pascal Hambourg在netfilter iptables邮件列表中提供帮助,以便提供此解决方案。