如何使用 nftables 创建有状态桥接文件墙?

如何使用 nftables 创建有状态桥接文件墙?

nftables wiki 有一个例子,但它对我来说似乎不起作用。

该页面显示它应该从内核 5.3 开始工作,但是当我尝试页面上的确切命令时,它显示“协议错误”:

# nft add table bridge filter
# nft add chain bridge filter forward '{type filter hook forward priority 0; }'
# nft add rule bridge filter forward ct state established,related accept
Error: Could not process rule: Protocol error
add rule bridge filter forward ct state established,related accept
                               ^^^^^^^^
  • 硬件:Raspberry Pi 4
  • 内核:5.10.92-v8+
  • nft --versionv0.9.8 (E.D.S.)

在构建最新版本的 nftables 及其库之后,我也尝试过:

  • nftables 1.0.1
  • libnftnl 1.2.1
  • libmnl-1.0.4

我确认ldd nft确实使用了新版本的库,但仍然出现相同的错误消息。

答案1

此功能自内核 5.3 起可用,但 Raspberry 选择不在提供的内核中编译它。

由于我找不到内核配置文件(通常存在于/boot/config-xxx内核中),我提取了安装映像来直接验证这一点。以下是 Raspbian 内核中可用模块的比较(来自压缩图像从官方网站下载):

$ ls -1 lib/modules/5.10.92-v8+/kernel/net/bridge/netfilter/nf*
lib/modules/5.10.92-v8+/kernel/net/bridge/netfilter/nf_log_bridge.ko
lib/modules/5.10.92-v8+/kernel/net/bridge/netfilter/nft_reject_bridge.ko

相对于类似 Debian 内核对于相同的架构:

$ ls -1 lib/modules/5.10.0-10-arm64/kernel/net/bridge/netfilter/nf*
lib/modules/5.10.0-10-arm64/kernel/net/bridge/netfilter/nf_conntrack_bridge.ko
lib/modules/5.10.0-10-arm64/kernel/net/bridge/netfilter/nf_log_bridge.ko
lib/modules/5.10.0-10-arm64/kernel/net/bridge/netfilter/nft_meta_bridge.ko
lib/modules/5.10.0-10-arm64/kernel/net/bridge/netfilter/nft_reject_bridge.ko

可以看出,需要nf_conntrack_bridge连接跟踪部分nft_meta_bridgenftablesRaspberryPi OS 的默认内核中没有该部分(并且它也不是内置的:grep bridge lib/modules/5.10.92-v8+/modules.builtin没有结果)。必须构建一个同时启用了这些功能的内核:

很可能还缺少其他罕见功能。例如模块nft_synproxynft_xfrm(用于 IPSec 过滤)也不存在。

与此同时,人们仍然可以使用已弃用的方法(一旦实现功能奇偶校验,该方法将被删除),这也会影响nftables不管是好是坏:br_netfilter内核模块. 但本土nftables缺乏对该方法的特定支持,因为它设计为使用较新的内核 5.3 方法。特别是它没有等效于iptables-m physdev --physdev-is-bridged

相关内容