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 改动详解

  • 说明:改进了内部缓存逻辑,在执行如 add ruledelete 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
    ```citeturn0view0
    

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),可和 logmark 等组合使用。

  • 示例

    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 hooksnetdev 家族中可分别列出 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. 下载

2. 依赖项

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