1053 words
5 minutes
nftables_1
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/ Some information may be outdated