1053 words
5 minutes
nftables_1
2025-10-18

nftables statements#

Terminal window
1. 裁决类 (Verdict statements)
accept 放行数据包。
nft add rule inet filter input tcp dport 22 accept
drop 丢弃数据包,不回应。
nft add rule inet filter input tcp dport 23 drop
reject [with ...] 拒绝并返回 ICMP/ICMPv6/TCP RST 等响应。
nft add rule inet filter input tcp dport 80 reject with tcp reset
jump <chain> 跳转到用户自定义链,执行完继续返回。
goto <chain> 跳转到链后不返回。
return 从当前链返回上一级。
2. 控制/修改类
queue 把包交给用户空间的 NFQUEUE 程序处理。
set <meta/mark> 修改包的元数据,比如打标记:
nft add rule inet filter output ip daddr 8.8.8.8 meta mark set 1
dup / fwd 复制或转发包到其他接口。
snat / dnat / masquerade / redirect NAT 动作:
snat:源地址转换
dnat:目的地址转换
masquerade:源地址伪装(常用于动态 IP 出口)
redirect:重定向到本机端口
3. 记录/统计类
counter 统计匹配到的包和字节数。
nft add rule inet filter input tcp dport 22 counter
log 把匹配的包记录到内核日志。
nft add rule inet filter input tcp dport 22 log prefix "SSH attempt: "
limit 限速匹配,用于防止日志风暴或 DoS。
nft add rule inet filter input icmp type echo-request limit rate 10/second accept
4. 连接跟踪/状态类
ct state 匹配连接状态(new, established, related, invalid)。
nft add rule inet filter input ct state established accept
ct mark / ct zone 设置或匹配连接跟踪的标记/区域。
5. 其他动作
meter 定义一个计量器,用于限速或统计。
flowtable 用于硬件加速转发。
map / set / verdict map 高级用法,可以根据集合映射到不同动作。

nftables 簇、表、动作#

familytablehookstatementsinstruction
ip ip6 inetfilterinput forward outputaccept drop log counter queue limit set map决定包的去留
ip ip6 inetnatprerouting postrouting outputdnat snat masquerade rediret地址转换
arparpinput outputaccept drop log counter二层arp相关
bridgebridgeprerouting forward outputaccept drop vlan log counter二层以太网帧
netdevnetdevingressaccept drop queue log counter网卡接口过滤
NOTE

nftables中表只是一个容纳链的容器,属于某个簇。
才是具体功能的实现,通过设置不同的优先级。

匹配与执行流程#

  • 逐条规则顺序执行: 进入某个链后,会从上到下从左至右依次执行规则。
  • 动作的类型不同,行为也不同:
    • 终止性动作(如accept,drop,reject): 一旦数据包命中,直接对这个数据包做出最终处理,处理立即结束,不再继续匹配后面的规则。
    • 非终止性动作(如counter,log,mark): 执行完动作后,仍然会继续往下匹配下一条规则。
    • 控制流动作(如jump,goto): 跳转到子链执行,jump执行完子链后会return回来继续匹配,goto则不会返回。
    • NAT类动作(如dnat,snat): 匹配到规则后,修改包头并继续走路由和后续链。
    • 链的默认策略: 如果数据包走完整个链,没有命中任何规则,执行链的policy

写nftables规则时的一些问题#

  1. 规则顺序要合理: 最严格或最宽松的规则不应该放在过滤或限速规则之前。
  2. 规则不应自相矛盾: 如既想要限制新连接,又要无条件接受,又想丢弃特定的包。
  3. 规则的冗余: 多条规则匹配相同的流量,又使用终止性动作

一般的配置思路#

  • 要明确自己的真实意图,规则的大概顺序: 丢弃明确的恶意流量 —> 限制可疑的流量 —> 接受合法的流量
  • 不要一次添加大量的规则
  • 从最简单宽松的规则开始
  • 逐步添加和测试规则
  • 每添加一次新规则,立即测试效果。
  • 观察网络行为,确保新的规则没有出现意外的动作
  • 在关键的位置添加log动作
  • 使用nft monitor实时监视事件
  • 查看计数器counter
  • 使用nft trace手动跟踪特定数据包
    1. 在想要跟踪链的开头添加这条规则:nft insert rule family_name table_name chain_name position 0 meta nftrace set 1
    2. 使用nft monitor trace查看实时输出
    3. 测试完成后删除跟踪规则

#

Terminal window
在使用sets时注意空格,一些版本(我所使用的)的nft不能将{80,443}正确识别,要写成 { 80, 443 }
nftables_1
https://infini.cv/posts/nftable/nftables_1/
Author
infini
Published at
2025-10-18
License
CC BY-SA 4.0

Some information may be outdated