Nftables 更新 1.1.4

nftables 1.1.4 – Commodore Bullmoose #5

nftables 1.1.4(“Commodore Bullmoose #5”)于 2025 年 8 月 06 日发布。这个版本继续延续了1.1 的版本名字,加了 #5, 与之前预测一样,按照 #1, #2, #3, #4 发布了多个小版本(marc.info)。

从git commit记录(Netfilter Git)来看,这个版本增强了稳定性、增加少量实用功能为主的版本,重点在于 trace/conntrack 输出、fib 路由判断、时间段匹配恢复、错误报告改进,以及 JSON / netlink 解析的健壮性改进。

下面根据官方的 Announce 梳理下具体更新的新功能.

nftables 1.1.4 改动详解

1. 增加 conntrack 信息在 monitor trace 输出中

在 tracing/monitor 模式下,新增输出连接追踪(conntrack)相关信息。原本 trace 路径只显示 packet 路径、规则匹配、verdict 等,不包含 conntrack 细节;1.1.4 增加了类似下面这样的行:

trace id 32 t PRE_MANGLE conntrack: ct direction original ct state new ct id 2641368242
...
trace id 32 t INPUT conntrack: ct direction original ct state new ct status dnat-done ct id 2641368242

也就是说,trace 输出中新增 conntrack: 这一行,指示包在这个 hook 时刻对应的连接追踪方向(direction)、状态(state)、ID、以及状态标志(如 dnat-done)等。 LWN.net+2netfilter.org+2

这个增强对于调试 nf_tables 与 conntrack 交互、理解包的连接状态流转非常有帮助。

2. 支持在 map / set / 表达式中检查路由存在性(fib check)

增加 fib … check exists / missing 的语法,用来判断某地址是否在路由表中(是否可达),然后可以在 maps / set / 表达式 / 设置语句里使用这个结果。

  • ... fib daddr . iif check existscheck missing

  • 可以把这个 check 用作 map 键或条件,比如:

    map m1 {
        type fib daddr check : verdict;
        elements = { exists : accept, missing : drop }
    }
    
  • 甚至可以在 set / mark 赋值语句中使用:

    meta mark set fib daddr check . ct mark map {
      exists . 0x0 : 0xA,
      missing . 0x1 : 0xB
    }
    

这样做的意义在于,可以在规则中依据 “目的地址是否有路由” 这个条件来判断是否接受或丢弃包,而不必事先写一个额外的路由前置测试。LWN 公告也特别提到这个点。 (LWN.net)

在变更日志里也有提到:fib: allow to check if route exists in mapsfib: allow to use it in set statements too。([netfilter.org][3])

3. 恢复跨日(跨午夜)时间段匹配的 meta hour 语义

在 1.1.3 中,meta hour "21:00"-"02:00" (即从晚上 21 点到次日凌晨 2 点) 这一类跨日范围匹配在某些情形下有问题。1.1.4 重新恢复对这种跨日范围的正确匹配。(LWN.net)

示例:

rule ip filter myrule {
    meta hour "21:00"-"02:00" drop
}

这条规则在 1.1.4 下将能正确在晚上 21:00 到次日凌晨 2:00 这段时间生效。(之前版本可能失败或不匹配)

4. 在 nft list / 列出集合时显示元素数量

1.1.4 在 list 输出时会在集合(set / map)旁边显示其当前的元素个数,这有助于用户更直观地了解集合的规模。(LWN.net)

例如:

table ip t {
    set s {
        type ipv4_addr
        elements = { 10.0.0.1, 10.0.0.2 }
    }
}

nft list table ip t 时,可能会看到类似 s (2 elements) 这样的注释。

5. 更好的错误报告:当对同名 set / map 做不同类型重声明时,错误信息更明确

之前如果你写了两个同名的集合,但类型(data 类型、标志等)不一致,错误报告可能较晦涩。1.1.4 在这类冲突时提供更清晰的错误信息,以帮助定位配置错误。(LWN.net)

变更日志中写道 “Better error reporting with re-declarations set/map with different types”。([netfilter.org][3])

此外,还对内存/占用做了一些优化(如日志中提到从 ~74 M 减少到 ~62 M)以减小开销。(LWN.net)

nftables 1.1.4 编译安装指引

1. 依赖项

2. 下载

3. 编译与安装

# 解压源码包
tar xf nftables-1.1.4.tar.xz
cd nftables-1.1.4

# 配置,指定安装前缀(可选)
./configure --prefix=/usr \
            --sysconfdir=/etc \
            --localstatedir=/var

# 编译并测试
make
make check

# 安装
sudo make install

提示:如需卸载,可在源码目录内运行 sudo make uninstall

4. 更新 manpage 和重建库缓存

sudo mandb
ldconfig