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