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. 依赖项

2. 下载

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