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 --version
:v0.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_bridge
和nftablesRaspberryPi OS 的默认内核中没有该部分(并且它也不是内置的:grep bridge lib/modules/5.10.92-v8+/modules.builtin
没有结果)。必须构建一个同时启用了这些功能的内核:
很可能还缺少其他罕见功能。例如模块nft_synproxy
和nft_xfrm
(用于 IPSec 过滤)也不存在。
与此同时,人们仍然可以使用已弃用的方法(一旦实现功能奇偶校验,该方法将被删除),这也会影响nftables不管是好是坏:br_netfilter
内核模块. 但本土nftables缺乏对该方法的特定支持,因为它设计为使用较新的内核 5.3 方法。特别是它没有等效于iptables‘-m physdev --physdev-is-bridged
。