Nftables 更新 1.1.3
nftables 1.1.3 – Commodore Bullmoose #4
nftables 1.1.3(“Commodore Bullmoose #4”)于 2025 年 4 月 22 日发布。这个版本继续延续了1.1 的版本名字,加了 #4
, 与之前预测一样,按照 #1
, #2
, #3
, #4
发布了多个小版本(marc.info)。
从git commit记录(Netfilter Git)来看,本次发布是一次以修复为主的次要版本更新,对 1.1.2 中引入的几个重要问题进行了修正,并恢复了部分此前被意外禁用的功能
下面根据官方的 Announce 梳理下具体更新的新功能.
nftables 1.1.3 改动详解
1. 修复 netdev 家族链(如 ingress/egress)中 VLAN PCP 操作生成的错误字节码
-
问题描述:之前对 VLAN PCP 字段的写入使用 1 字节操作,而内核接口
nft_payload_set_vlan()
仅支持 2 或 4 字节写入,导致执行失败或不生效。 -
示例:
# 旧版本(字节码写入为 1 字节,内核不支持) nft add rule netdev ingress vlan pcp set 6 counter
修复后生成正确的 2 字节写入指令,例如在 VM 字节码中表现为:
[ payload load 2b @ link header + 14 => reg 1 ] [ bitwise reg 1 = ( reg 1 & 0x0000001f ) ^ 0x00000020 ]
内核能够正确识别并应用。
-
关联测试:已更新现有 vlan id 测试用例,以验证新写入方式。
2. 修复在大范围连接集合(concatenated set ranges)中产生的伪元素
-
问题描述:当用户定义包含多个范围或元素的集合时,如果 Netlink 消息缓冲区大小不足,会发生字节序切换错误,导致第一个元素被替换成数值
16777216
(即 0x1000000),而非预期的"lo"
或其他字符串。 -
示例:
# 旧版本输出 nft list set inet filter myset # 看到错误元素 16777216 . 00:11:22:33:44:55 . 10.1.2.3 comment "123456789012345678901234567890" # 修复后正确输出 "lo" . 00:11:22:33:44:55 . 10.1.2.3 comment "123456789012345678901234567890"
问题根源在于临时变量未正确保存切换前的值,现已修正为先保存再切换再写入。
3. 恢复带超时(timeouts)情况下的集合自动合并功能
-
问题描述:在 1.1.2 中,为解决某些用例误合并的问题,错误地禁用了“带超时的区间自动合并”功能,导致新增的重叠区间无法与已有区间合并。
-
示例:
# 定义带超时的集合 nft add set inet filter timeout_set { type ipv4_addr\; timeout 10s\; flags interval\; } nft add element inet filter timeout_set { 10.0.0.0/24 timeout 10s } nft add element inet filter timeout_set { 10.0.0.128/25 timeout 20s } # 1.1.2 中,这两段区间不会合并;1.1.3 中将自动合并为: # [10.0.0.0-10.0.0.255 timeout 20s]
自动合并可减少规则数量并提高效率。
nftables 1.1.3 编译安装指引
1. 依赖项
-
libnftnl ≥ 1.2.9:https://netfilter.org/projects/libnftnl/index.html
-
libmnl ≥ 1.0.4:https://netfilter.org/projects/libmnl/index.html
-
需要内核支持
nf_tables
(≥ Linux 3.14)。
2. 下载
-
官方下载页面:https://www.netfilter.org/projects/nftables/downloads.html
-
直接获取 1.1.3 源码包:
-
https://www.netfilter.org/pub/nftables/nftables-1.1.3.tar.xz
3. 编译与安装
# 解压源码包
tar xf nftables-1.1.3.tar.xz
cd nftables-1.1.3
# 配置,指定安装前缀(可选)
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var
# 编译并测试
make
make check
# 安装
sudo make install
提示:如需卸载,可在源码目录内运行
sudo make uninstall
。
4. 更新 manpage 和重建库缓存
sudo mandb
ldconfig