Iptables:匹配数据包离开桥接接口

时间:2014-06-24 22:25:28

标签: linux-kernel iptables netfilter

道歉,如果您已经在服务器故障中看到了这一点,但它已经在那里停留了好几天了,而且我已经完全没有牵引力......


我正在构建一个基于iptables的防火墙配置工具,并尝试在线路中加入一个"情景工作。

在网桥eth0和第三个接口eth1中设置了br0eth2的设置:

    |          |         |
   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(尽管这在其他情况下会很有用)。我希望能够以不同方式处理eth0eth1的流量,允许流量为eth1,而不是eth0

1 个答案:

答案 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邮件列表中提供帮助,以便提供此解决方案。