Nftables 更新 1.1.1
nftables 1.1.1 – Commodore Bullmoose #2
这个版本继续延续了1.1.0的版本名字,加了 #2
, 按照开发者的习惯,后续应该还会有 #3
相比上个版本隔了8-9个月,这个小版本2个月左右就发了。
目前Debian源已经有 1.1.1 的Deb包, 可以按需下载进行测试. (注意本次版本限制 libnftnl >= 1.2.8
)
根据官方的 Announce 总结如下
- 减小 Netlink 缓存依赖,提升增量更新速度;
- 修复 UDP 校验和为零时的包篡改问题;
- 完善
nft reset
命令的行为,支持更多场景; - JSON 解析器与 优化器(
-o/--optimize
) 的多处修复; - 允许 byte ratelimiter 使用 0 burst;
- 新增
list hooks
在 egress 方向的支持及其文档与一致性改进; - 以及若干内存、双重释放(double‑free)和测试套件的更新。
nftables 1.1.1 改动详解
1. 减少 Netlink 缓存依赖,提升增量更新速度
-
说明:改进了内部缓存逻辑,在执行如
add rule
、delete rule
等命令时,减少对全量缓存的依赖,显著提升了增量更新效率。 -
示例:
# 执行增量更新时,不再每次都重载整个规则集 sudo nft add rule inet filter input tcp dport 80 accept
2. 修复 UDP 校验和为零时的包篡改
-
说明:之前内核在 UDP 校验和字段为 0 时不会正确重算校验和,导致部分 NAT/篡改规则失效。
-
示例:
table ip nat { chain postrouting { type nat hook postrouting priority 100; policy accept; udp dport 53 snat to 10.0.0.2 } } # 现在即使原包 checksum=0,也能正确生成新的 checksum ```citeturn0view0
3. 完善 nft reset
命令
-
说明:修复了在重置规则集、集合(sets)、计数器(counters)和配额(quota)时的多处边界问题,保证
nft reset
能完整清理所有对象。 -
示例:
# 清空所有规则、集合及相关计数器 sudo nft reset ruleset
4. JSON 解析器修复
-
说明:修复了
nft --json
模式下的多处内存泄漏与解析崩溃,保证输出 JSON 格式的规则集时更健壮。 -
示例:
sudo nft --json list ruleset | jq .
5. 优化器(-o/--optimize
)中不支持变量的问题
-
说明:之前在使用
-o/--optimize
时,如果规则中包含变量(define
),会被跳过导致不一致行为。现已修复,变量在优化阶段被正确忽略。 -
示例:
define PORT = 8080 table inet filter { chain input { tcp dport $PORT accept } } # 使用 -o 时,仍会跳过带变量的规则以确保正确性 sudo nft -c -o -f ruleset.nft
6. 允许 byte ratelimiter 使用 0 burst
-
说明:在限速(limit)或字节速率限制(byte rate)语句中,允许将 burst 设置为 0,精确控制初始突发流量。
-
示例:
table netdev filter { set test123 { typeof ip saddr limit rate over 1 mbytes/second elements = { 1.2.3.4 limit rate over 1 mbytes/second } } } # 允许 `burst 0`: nft add rule netdev filter input ip saddr 1.2.3.4 limit rate over 1 mbytes/second burst 0 drop
7. 修复双重释放(double‑free)
-
说明:修复了在用户调用内部 API
nft_ctx_clear_vars()
后再调用nft_ctx_free()
时的重复释放问题,避免潜在崩溃。 -
示例(C API):
struct nft_ctx *ctx = nft_ctx_create(...); /* ... */ nft_ctx_clear_vars(ctx); nft_ctx_free(ctx); /* 之前会 double-free,现已修复 */
8. tproxy 声明非终止特性说明
-
说明:文档中明确指出,
tproxy
语句相较于 iptables 不是终止(non‑terminal),可和log
、mark
等组合使用。 -
示例:
table ip nat { chain prerouting { type nat hook prerouting priority 0; policy accept; tcp dport 80 tproxy to :8080 log prefix "TPROXY: " } }
9. 为 list hooks
新增 egress 支持
-
说明:
nft list hooks
在netdev
家族中可分别列出 ingress 与 egress 两个方向的钩子(hook)。 -
示例:
sudo nft list hooks netdev device eth0 # family netdev { # hook ingress device eth0 { … } # hook egress device eth0 { … } # }
10. 修复 list hooks
列表不一致与遍历所有接口
-
说明:
- 修复了当未指定接口时,
nft list hooks netdev
只列出首个接口的问题; - 现在会自动遍历系统中所有接口并逐一列出各自钩子。
- 修复了当未指定接口时,
-
示例:
sudo nft list hooks netdev # 依次输出 eth0、eth1、… 等所有接口的 ingress/egress 钩子
11. 文档与测试套件的增强
- 说明:包括 manpage 的更新与大量 shell、Python 测试用例的扩充,覆盖 VLAN、flowtable、超时更新等场景,提升整体可靠性。
nftables 1.1.1 编译安装指引
1. 下载
-
官方下载页面:https://www.netfilter.org/projects/nftables/downloads.html
-
直接获取 1.1.1 源码包:
https://www.netfilter.org/pub/nftables/nftables-1.1.1.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.1.tar.xz
cd nftables-1.1.1
# 配置,指定安装前缀(可选)
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var
# 编译并测试
make
make check
# 安装
sudo make install
提示:如需卸载,可在源码目录内运行
sudo make uninstall
。