1053 words
5 minutes
nftables_1
Some information may be outdated
nftables statements
1. 裁决类 (Verdict statements)
accept 放行数据包。
nft add rule inet filter input tcp dport 22 acceptdrop 丢弃数据包,不回应。
nft add rule inet filter input tcp dport 23 dropreject [with ...] 拒绝并返回 ICMP/ICMPv6/TCP RST 等响应。
nft add rule inet filter input tcp dport 80 reject with tcp resetjump <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 1dup / fwd 复制或转发包到其他接口。
snat / dnat / masquerade / redirect NAT 动作:
snat:源地址转换
dnat:目的地址转换
masquerade:源地址伪装(常用于动态 IP 出口)
redirect:重定向到本机端口
3. 记录/统计类counter 统计匹配到的包和字节数。
nft add rule inet filter input tcp dport 22 counterlog 把匹配的包记录到内核日志。
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 accept4. 连接跟踪/状态类ct state 匹配连接状态(new, established, related, invalid)。
nft add rule inet filter input ct state established acceptct mark / ct zone 设置或匹配连接跟踪的标记/区域。
5. 其他动作meter 定义一个计量器,用于限速或统计。
flowtable 用于硬件加速转发。
map / set / verdict map 高级用法,可以根据集合映射到不同动作。nftables 簇、表、动作
| family | table | hook | statements | instruction |
|---|---|---|---|---|
ip ip6 inet | filter | input forward output | accept drop log counter queue limit set map | 决定包的去留 |
ip ip6 inet | nat | prerouting postrouting output | dnat snat masquerade rediret | 地址转换 |
arp | arp | input output | accept drop log counter | 二层arp相关 |
bridge | bridge | prerouting forward output | accept drop vlan log counter | 二层以太网帧 |
netdev | netdev | ingress | accept drop queue log counter | 网卡接口过滤 |
NOTEnftables中表只是一个容纳链的容器,属于某个簇。
链才是具体功能的实现,通过设置不同的优先级。
匹配与执行流程
- 逐条规则顺序执行: 进入某个链后,会从上到下从左至右依次执行规则。
- 动作的类型不同,行为也不同:
- 终止性动作(如
accept,drop,reject): 一旦数据包命中,直接对这个数据包做出最终处理,处理立即结束,不再继续匹配后面的规则。 - 非终止性动作(如
counter,log,mark): 执行完动作后,仍然会继续往下匹配下一条规则。 - 控制流动作(如
jump,goto): 跳转到子链执行,jump执行完子链后会return回来继续匹配,goto则不会返回。 - NAT类动作(如
dnat,snat): 匹配到规则后,修改包头并继续走路由和后续链。 - 链的默认策略: 如果数据包走完整个链,没有命中任何规则,执行链的
policy。
- 终止性动作(如
写nftables规则时的一些问题
- 规则顺序要合理: 最严格或最宽松的规则不应该放在过滤或限速规则之前。
- 规则不应自相矛盾: 如既想要限制新连接,又要无条件接受,又想丢弃特定的包。
- 规则的冗余: 多条规则匹配相同的流量,又使用终止性动作。
一般的配置思路
- 要明确自己的真实意图,规则的大概顺序: 丢弃明确的恶意流量 —> 限制可疑的流量 —> 接受合法的流量
- 不要一次添加大量的规则
- 从最简单宽松的规则开始
- 逐步添加和测试规则
- 每添加一次新规则,立即测试效果。
- 观察网络行为,确保新的规则没有出现意外的动作
- 在关键的位置添加
log动作 - 使用
nft monitor实时监视事件 - 查看计数器
counter - 使用
nft trace手动跟踪特定数据包- 在想要跟踪链的开头添加这条规则:
nft insert rule family_name table_name chain_name position 0 meta nftrace set 1 - 使用
nft monitor trace查看实时输出 - 测试完成后删除跟踪规则
- 在想要跟踪链的开头添加这条规则:
坑
在使用sets时注意空格,一些版本(我所使用的)的nft不能将{80,443}正确识别,要写成 { 80, 443 } 。 nftables_1
https://infini.cv/posts/nftable/nftables-1/