题 Iptables:匹配桥接接口的数据包


我正在构建一个基于iptables的防火墙配置工具,并试图让“线上爆炸”场景正常工作。

鉴于设置 eth0 和 eth1 在一座桥上 br0 和第三个界面 eth2

    |          |         |
   eth0       eth1      eth2
    | == br0== |         |
          |              |
          |              |
         --- linux node ---

在这种情况下,假设我希望TCP端口80流量在它连接到网络时被丢弃 eth0,但允许它 eth1

因此,我试图可靠地匹配通过特定接口发出的数据包 eth0

如果我在中添加以下iptables规则 filter 表:

-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。

(还有第三种情况:桥接器包含三个似乎适用的接口,然后它仍然无法建立单个接口来发送数据包,只是排除源接口。)

所以,问题是,我怎样才能可靠地匹配出去的数据包 eth0 而不管?

鉴于我在开始时提供的示例,仅仅匹配将通过多个接口路由出的数据包是不够的,其中一个是 eth0 (尽管这在其他场景中很有用)。我希望能够处理流量 eth0 和 eth1 不同的是,允许流量 eth1, 但不是 eth0


6
2018-06-23 10:15






答案:


观察到的行为的原因

当数据包从非桥接接口到达时iptables没有获得物理网桥信息的原因是数据包从未接近桥接机制,即使此时我们知道我们正在桥上发送它。

如果数据包确实通过桥接端口到达,但它是一个N> 2网桥,问题是iptables PHYSDEV扩展只提供了它们为“out”的一个值,所以它只是不打扰告诉我们,如果有两个。

使用ebtables而不是iptables。 ebtables OUTPUT chain将知道它正在发送数据包的物理桥接接口。

在上面的场景中,您要过滤通过特定桥接接口离开的数据包(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邮件列表上寻求帮助,提出了这个解决方案。


7
2018-06-25 12:43