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 }
    ``` citeturn2view0  
    
  • 修复 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
    }
    ``` citeturn2view0  
    
  • 恢复 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 }'
    ``` citeturn2view0  
    
  • 恢复流表添加网卡
    现在可重新向 flowtable 添加或移除设备:

    create flowtable inet filter f1 { hook ingress priority 0; counter }
    add flowtable inet filter f1 { devices = { dummy1 } }
    ``` citeturn2view0  
    

功能增强

  • tproxy 非值表达式端口
    支持在非固定数值上下文中应用 tproxy,例如:

    meta l4proto 6 tproxy ip to 127.0.0.1:symhash mod 2 map { 0 : 8000, 1 : 8010 }
    ``` citeturn2view0  
    
  • {ct,meta} 字节序转换
    在连接跟踪标记与元数据语句中均可执行 hton/ntoh 转换:

    map mapv6 { typeof ip6 dscp : meta mark }
    meta mark set ip6 dscp map @mapv6
    ``` citeturn2view0  
    
  • 映射与区间下的字节序
    在带连接状态映射(vmap)的区间集合中进行字节序转换:

    map ipsec_in {
        typeof ipsec in reqid . iif : verdict
        flags interval
    }
    ipsec in reqid . iif vmap @ipsec_in
    ``` citeturn2view0  
    
  • Meter 转动态集合
    meter 语句自动转换为动态、带超时的集合,并生成更新规则:

    add rule t c tcp dport 80 meter m size 128 { ip saddr timeout 2s limit rate 10/second }
    # → 隐式生成动态集合 m 并在规则中使用 update @m
    ``` citeturn2view0  
    
  • 支持 CT 超时/期望/助手
    map 中可定义包含 ct timeoutct expectationct helper 的映射:

    map m {
        typeof ct timeout . ct expectation : verdict
        flags interval
    }
    ``` citeturn2view0  
    
  • 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
    ``` citeturn2view0  
    

表达式改进

  • 禁止空接口名
    meta iifname "" 之类的空字符串名给出错误:

    nft add rule ... meta iifname ""
    # Error: Empty string is not allowed
    ``` citeturn2view0  
    
  • 拒绝超长原始负载拼接
    防止无上限拼接导致缓冲区溢出:

    udp length . @th,0,512 . @th,512,512 {}  
    # Error: Concatenation of size 544 exceeds maximum size of 512
    ``` citeturn2view0  
    
  • 否定时不合并 payload
    确保如 tcp sport != 22 tcp dport != 23 被正确拆分:

    tcp sport != 22 tcp dport != 23
    ``` citeturn2view0  
    
  • 跨日时间范围
    解决跨时区或跨午夜的 meta hour 范围匹配:

    TZ=EADT nft add rule t c meta hour "03:00"-"14:00"
    ``` citeturn2view0  
    
  • 恢复标志位位运算语法
    list ruleset 中仍可见诸如:

    tcp flags & (fin | syn | rst | ack) == syn
    ``` citeturn2view0  
    
  • 输出数字化 ICMP 码
    在规则列表中使用数字而非符号常量表示 ICMP 类型与码。

JSON 支持

  • 多设备链的 JSON 导出
    nft --json list chain 现在可正确显示绑定了多个设备的 netdev 链。

  • 集合 auto-merge 与拼接支持
    JSON 输出中新增对 auto-merge 标志的描述,及对带拼接数据的映射支持。

  • Synproxy 对象与持久化
    synproxy 与表级 persist 标志已在 JSON 中可用。

性能与用户体验

  • 加速列出表
    nft list tables 仅获取表名,不再全量拉取所有对象,提高响应速度。

  • -t/--terse 加速
    list tablelist 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. 下载

2. 依赖项

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