nftables:如何获得像 ebtables 遗留那样的 BROUTING 行为?

nftables:如何获得像 ebtables 遗留那样的 BROUTING 行为?

在 ebtables 中,表BROUTING中的链broute具有特殊行为ACCEPTDROP操作:ACCEPT表示桥接/转发路径,DROP表示路由/输入路径。例如,要强制所有非 IPv6 数据包通过 NAT,使用适当的 iptables 设置,同时 IPv6 数据包全部直接桥接,可以执行以下操作:

ebtables -t broute -A BROUTING -p ! ipv6 -j DROP -i wan

我如何在 nftables 中获得这种行为?

几篇帖子和旧帖子nftables 手册页建议不要实施。此外,还有nftables 邮件列表中的帖子最终并没有得到真正有效的答复。

它还没有实现吗?如果是,有什么解决方法吗?还是我必须使用 ebtables-legacy?谢谢。

答案1

它还没有实现吗?

是的,但仍然只持续几周(Linux 内核 6.4 应该在 2023-06 年底或 2023-07 年初发布)。经过几次迭代后,接受的提议是使用布罗特nftables在 netfilter-devel 中来自2023-02-24

更新:现已正式实施nftnftables)> = 1.0.8 甚至ebtables-nft> = 1.8.10,请参阅本答案末尾的更新。

它一直已添加至尚未发布Linux 内核 6.4于 2023-04-26:

网络过滤器:

  • 添加 nf_tables 'brouting' 支持,强制对数据包进行路由而不是桥接

并正在筹备尚未发布的下一部nftables版本,可能是 1.0.8

meta: 引入 meta broute 支持

可用于桥接预路由挂钩,将数据包转移到 IP 堆栈进行路由。

这是功能的替代ebtables -t broute

没有ebtables使用 accept/drop 的特殊之处布罗特类型。它通过设置布罗特在规则中的标志家庭类型筛选预路由钩:

meta broute set 1

因此ebtables-legacy,不要使用(因为ebtables-nft缺乏对布罗特直到最近):

ebtables-legacy -t broute -A BROUTING -p ! ipv6 -j DROP -i wan

可以这样做:

table bridge b {
    chain prerouting {
        type filter hook prerouting priority -250; policy accept;
        ether type != ip6 iifname wan meta broute set 1 accept
    }
}

此外, (通过来源ebtables-nft运送iptablesnftables后端版本)也获得了尚未发布的下一版本的等效补丁

ebtables-nft:添加 broute 表模拟

使用 newmeta broute set 1来模拟-t broute。如果-t broute给出 ,则自动 内部转换-j DROP为。meta broute set 1 accept

这将允许使用(ebtables-nft仍然ebtables-legacy使用内核 >= 6.4)来接受原样:

ebtables -t broute -A BROUTING -p ! ipv6 -j DROP -i wan

更新

  • 如上所述,内核6.4 于 2023-06-25 左右发布收到了该功能

  • 如上所述,nftables1.0.8 于 2023-07-14 左右发布现在支持 broute:

    • broute 支持从桥接预路由挂钩短路桥接逻辑并将数据包传递到本地 IP 堆栈。

      ... meta broute set 1
      
  • iptables:1.8.10 于 2023-10-10 左右发布(还提供二进制ebtables) 现在支持 broute ebtables-nft

    • ebtables-nft 中的 Broute 表支持

    从这个版本开始,下面的命令将会成功:

    ebtables-nft -t broute -A BROUTING -p ! ipv6 -j DROP -i wan
    

    上面写的DROP实际上代表broute set 1 accept如下所示(显示通常可以,但更改通常不可以):

    # nft list ruleset
    table bridge broute {
      chain BROUTING {
          type filter hook prerouting priority -2147483648; policy accept;
          iifname "wan" ether type != ip6 counter packets 0 bytes 0 meta broute set 1 accept
      }
    }
    

    (优先级 -2147483648 可能看起来很奇怪,但这是相同的使用的钩子优先级ebtables-legacyNF_BR_PRI_FIRST

相关内容