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 }
      }