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
^^^^^^^^
- 硬件:树莓派 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
确实使用了新版本的库,但仍然出现相同的错误消息。
此功能从内核 5.3 开始可用,但 Raspberry 选择不在提供的内核中编译它。
由于我没有找到内核配置文件(通常作为内核存在
/boot/config-xxx
或来自内核),我提取了安装映像以直接验证这一点。以下是 Raspbian 内核中可用模块的比较(来自官方网站下载的zip 图像):与具有相同架构的类似 Debian 内核相比:
如您所见,在 RaspberryPi OS 的默认内核上,conntrack 部分和 nftables 部分提供的所需 Netfilter 支持
nf_conntrack_bridge
不可用(而且nft_meta_bridge
它也不是内置的:没有结果)。还必须构建具有这些功能的内核: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
。