【问题标题】:Iptables: Matching packets leaving a bridged interfaceiptables:匹配离开桥接接口的数据包
【发布时间】:2023-03-08 14:15:01
【问题描述】:

抱歉,如果您已经在 serverfault 上看到了这个问题,但它已经存在好几天了,我完全没有任何吸引力......


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

假设在网桥br0 和第三个接口eth2 中设置eth0eth1

    |          |         |
   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(尽管这在其他场景中很有用)。我希望能够以不同的方式处理eth0eth1 的流量,允许eth1 的流量,但不允许eth0

【问题讨论】:

    标签: linux-kernel iptables netfilter


    【解决方案1】:

    观察到的行为的原因

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

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

    解决方案

    使用 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 -o eth0 --mark 1234 -j DROP
    

    这将DROP 任何由iptables 标记的数据包(来自eth2)通过特定的桥接端口eth0 传出。

    致谢

    感谢来自 netfilter iptables 邮件列表的 Pascal Hambourg 帮助他提出这个解决方案。

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 2012-07-26
      • 2011-08-19
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      相关资源
      最近更新 更多