Nftables 更新 1.0.7
Old Doc Yak
Netfilter 项目组在 03/13 更新了 Nftables 1.0.7 版本, 版本定义为 Old Doc Yak (命名来自会说话的山羊为中心的漫画). 目前Debian源已经有 1.0.7 的Deb包, 可以按需下载进行测试. 下面根据官方的 Announce 梳理下具体更新的新功能.
新功能
支持隧道协议 (vxlan/geneve/gre/gretap) 匹配识别 (kernel >= 6.2)
隧道封装后,如果要识别原始的 IP则需要解包才能匹配,这个功能正是识别隧道包内 IP包的匹配, 例如
vxlan ip protocol udp .... # 识别udp包
vxlan ip saddr 1.2.3.0/24 # 识别来源ip网段
自动合并处理 set 数据内容(kernel >= 5.10)
set y {
typeof tcp dport
flags interval
auto-merge
elements = { 24-30, 40-50 }
}
# 若删除一个端口 25, 则
# nft delete element ip x y { 25 }
- 注意set中需额外添加 auto-merge 标记 才有该功能
NAT 映射支持 聚合以及范围对应
table ip nat {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
dnat to ip daddr . tcp dport map { 10.1.1.136 . 80 : 1.1.2.69 . 1024, \
10.1.1.10-10.1.1.20 . 8888-8889 : 1.1.2.69 . 2048-2049 } persistent }
}
注意
10.1.1.10-10.1.1.20
对应了1.1.2.69
8888-8889
对应2048-2049
支持获取set中element使用的最近时间(kernel >= 5.14)
set y {
typeof ip daddr . tcp dport
size 65535
flags dynamic,timeout
last
timeout 1h
}
chain z {
type filter hook output priority filter; policy accept;
update @y { ip daddr . tcp dport }
}
- update 指令将 daddr、dport信息注入到 set中
- set定义了 last 标记
限制流量
set y {
type ipv4_addr
size 65535
quota over 10000 mbytes
elements = { 8.8.8.8 quota over 10000 mbytes used 196 bytes }
}