在 ebtables 中,表BROUTING
中的链broute
具有特殊行为ACCEPT
和DROP
操作: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。
更新:现已正式实施nft
(nftables)> = 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
运送iptables
nftables后端版本)也获得了尚未发布的下一版本的等效补丁:
ebtables-nft:添加 broute 表模拟
使用 new
meta 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-legacy
:NF_BR_PRI_FIRST
)