Nftables 更新 1.0.8

Old Doc Yak #2

Netfilter 项目组在 07/14 更新了 Nftables 1.0.8 版本, 版本定义为 Old Doc Yak #2 (命名来自会说话的山羊为中心的漫画) 目前Debian源已经有 1.0.8 的Deb包, 可以按需下载进行测试. (注意本次版本限制 libnftnl > 1.2.6 )

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

新功能

支持动态设置数据包 “信息元/连接” 标签 (meta/ct mark)

在之前,我们常常这样子定义 meta mark

# 对snat的连接,源数据包如果理连接标签不为0, 那么修改数据包的信息元标签为连接标签 (可命中策略路由)
ct status snat ct direction original ct mark != 0 meta mark set ct mark

现在我们可以读取数据包的其他字段,例如 dscp,甚至可以进行计算

ct status snat meta mark set ip dscp

ct status snat meta mark set ip dscp and 0x0f
ct status snat meta mark set ip dscp << 8
ct status snat meta mark set (ip dscp and 0x0f) << 8

注意,这个版本还增加了 broute 支持

[verse]

-*meta* {*mark* | *priority* | *pkttype* | *nftrace*} *set* 'value'

+*meta* {*mark* | *priority* | *pkttype* | *nftrace* | *broute*} *set* 'value'

其中 broute 用于控制进来的数据包是需要进行bridge转发还是进行route转发,即2层转发和3层转发

提高了optimize输出在nat的优化能力

例如合并

# old
ip saddr 10.141.11.0/24 masquerade
ip saddr 10.141.13.0/24 masquerade

# merged
ip saddr { 10.141.11.0/24, 10.141.13.0/24 } masquerade

使用 -o/--optimize 指令来查看

针对匿名的maps支持counters等能力

## 增加counter
meta mark { 0xa counter, 0xb counter }

ip saddr vmap { 127.0.0.1 counter : drop, * counter : accept }

ct state vmap { established counter : accept, \
                related counter : accept, \
                invalid counter : drop }

支持重置计时器

reset element t m '{ 1.2.3.4 }'
reset map ip t m
reset set ip t m

需要 Linux kernel >= 6.5-rc1 才能支持

支持dccp选项

# dccp option* 'dccp_option_type'

dccp option 40 exists counter

动态修改netdev链关联的设备

# 新增
# nft add chain netdev x y '{ devices = { eth1 }; }'

# 删除
# nft delete chain netdev x y '{ devices = { eth0 }; }'

初始化时候可以注册一个空的链表(空的devices),然后动态注册devices

其他要点

  • 使用 -t/--terse 可以在 list sets 时候不打印元素
  • 使用 nft list hooks 可以查看注册的 bpf hooks