Nftables 更新 1.1.0
nftables 1.1. – Commodore Bullmoose
这个版本名字还是挺奇怪的,组合在一起怪怪的,于是问了ChatGPT:
“Commodore Bullmoose” 并不是一个常见的历史或文化人物,也没有明显的背景信息。如果开发人员确实使用了这个名字,可能是出于幽默或对某个特定事物的参考。
这个版本拖了8~9个月才发布,算是一个中版本的累积更新。
目前Debian源已经有 1.1.0 的Deb包, 可以按需下载进行测试. (注意本次版本限制 libnftnl >= 1.2.7
)
下面根据官方的 Announce 梳理下具体更新的部分新功能.
nftables 1.1.0 改动详解
兼容性恢复
-
兼容老版本集合转储
恢复了与 nftables ≤ 0.9.8 的集合元素转储兼容性,支持如下等价写法:add element t s { 23 counter packets 10 bytes 20 timeout 10s } add element t s { 42 timeout 10s counter packets 10 bytes 20 } ``` citeturn2view0
-
修复
create set
重新修复了使用define
变量创建带区间和auto-merge
的集合:define ip-block-4 = { 1.1.1.1 } create set netdev filter ip-block-4-test { type ipv4_addr flags interval auto-merge elements = $ip-block-4 } ``` citeturn2view0
-
恢复
replace rule
支持如下带匿名映射的规则替换:replace rule ip t1 c1 handle 3 \ 'jhash ip protocol . ip saddr mod 170 vmap { 0-94 : goto wan1, 95-169 : goto wan2, 170-269 }' ``` citeturn2view0
-
恢复流表添加网卡
现在可重新向 flowtable 添加或移除设备:create flowtable inet filter f1 { hook ingress priority 0; counter } add flowtable inet filter f1 { devices = { dummy1 } } ``` citeturn2view0
功能增强
-
tproxy
非值表达式端口
支持在非固定数值上下文中应用tproxy
,例如:meta l4proto 6 tproxy ip to 127.0.0.1:symhash mod 2 map { 0 : 8000, 1 : 8010 } ``` citeturn2view0
-
{ct,meta}
字节序转换
在连接跟踪标记与元数据语句中均可执行hton/ntoh
转换:map mapv6 { typeof ip6 dscp : meta mark } meta mark set ip6 dscp map @mapv6 ``` citeturn2view0
-
映射与区间下的字节序
在带连接状态映射(vmap
)的区间集合中进行字节序转换:map ipsec_in { typeof ipsec in reqid . iif : verdict flags interval } ipsec in reqid . iif vmap @ipsec_in ``` citeturn2view0
-
Meter 转动态集合
将meter
语句自动转换为动态、带超时的集合,并生成更新规则:add rule t c tcp dport 80 meter m size 128 { ip saddr timeout 2s limit rate 10/second } # → 隐式生成动态集合 m 并在规则中使用 update @m ``` citeturn2view0
-
支持 CT 超时/期望/助手
在map
中可定义包含ct timeout
、ct expectation
与ct helper
的映射:map m { typeof ct timeout . ct expectation : verdict flags interval } ``` citeturn2view0
-
VLAN 语句与 QinQ 匹配
增加对单层与双层 VLAN 的payload
语句:ip saddr 10.1.1.1 icmp type echo-request vlan id set 321 ether type 8021ad vlan id 10 vlan type 8021q vlan id 100 vlan type ip accept ``` citeturn2view0
表达式改进
-
禁止空接口名
对meta iifname ""
之类的空字符串名给出错误:nft add rule ... meta iifname "" # Error: Empty string is not allowed ``` citeturn2view0
-
拒绝超长原始负载拼接
防止无上限拼接导致缓冲区溢出:udp length . @th,0,512 . @th,512,512 { … } # Error: Concatenation of size 544 exceeds maximum size of 512 ``` citeturn2view0
-
否定时不合并 payload
确保如tcp sport != 22 tcp dport != 23
被正确拆分:tcp sport != 22 tcp dport != 23 ``` citeturn2view0
-
跨日时间范围
解决跨时区或跨午夜的meta hour
范围匹配:TZ=EADT nft add rule t c meta hour "03:00"-"14:00" ``` citeturn2view0
-
恢复标志位位运算语法
在list ruleset
中仍可见诸如:tcp flags & (fin | syn | rst | ack) == syn ``` citeturn2view0
-
输出数字化 ICMP 码
在规则列表中使用数字而非符号常量表示 ICMP 类型与码。
JSON 支持
-
多设备链的 JSON 导出
nft --json list chain
现在可正确显示绑定了多个设备的netdev
链。 -
集合 auto-merge 与拼接支持
JSON 输出中新增对auto-merge
标志的描述,及对带拼接数据的映射支持。 -
Synproxy 对象与持久化
synproxy
与表级persist
标志已在 JSON 中可用。
性能与用户体验
-
加速列出表
nft list tables
仅获取表名,不再全量拉取所有对象,提高响应速度。 -
-t/--terse
加速
在list table
与list set
时可启用简略模式,进一步缩减输出冗余。 -
跳过 8 字节字段字节序转换
对 8 字节域无须显式转换,减少不必要操作。 -
主机字节序查找
在集合查找中可直接使用主机字节序常量(host-endian
)。 -
增量更新缓存复用
若缓存 generation ID 不变,则复用现有缓存以加快增量规则更新。
稳健性修复
-
强化输入校验
将多处assert()
转为错误处理,修复 parser 和 evaluator 中的内存泄漏与越界。 -
监控模式修复
nft monitor
现可正确报告带区间与拼接的集合事件。 -
TCP 选项数字支持
恢复对如tcp option 254
的处理。 -
{meta,ct} mark
与映射
修复标记语句结合映射时的崩溃。 -
改链与销毁报错增强
错误信息中准确指出链/表/命令不匹配或内核版本不足。 -
变量支持问题
修复define
变量在映射表达式与多次更新时的兼容性。 -
IPv4‑映射 IPv6 更广泛支持
支持如aaaa::1.2.3.4
格式的 IPv4‑映射 IPv6 地址。 -
集合元素删除修复
解决在映射中删除带区间元素时的双重释放崩溃。 -
-o/--optimize
与计数器合并
修复在带counter
语句时合并优化的错误行为:nft -c -o -f ruleset.nft # 正确将多条 counter 规则合并为 map/vmap
nftables 1.1.1 编译安装指引
1. 下载
-
官方下载页面:https://www.netfilter.org/projects/nftables/downloads.html
-
直接获取 1.1.0 源码包:
https://www.netfilter.org/pub/nftables/nftables-1.1.0.tar.xz
2. 依赖项
-
libnftnl ≥ 1.2.8:https://netfilter.org/projects/libnftnl/index.html
-
libmnl ≥ 1.0.4:https://netfilter.org/projects/libmnl/index.html
-
需要内核支持
nf_tables
(≥ Linux 3.14)。
3. 编译与安装
# 解压源码包
tar xf nftables-1.1.0.tar.xz
cd nftables-1.1.0
# 配置,指定安装前缀(可选)
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var
# 编译并测试
make
make check
# 安装
sudo make install
提示:如需卸载,可在源码目录内运行
sudo make uninstall
。