nftables 从入门到不误伤自己
把机器从 iptables 换成 nftables,一半的坑不在语法,而在“我以为它会从上到下执行”。
一、策略是 chain 的属性,不是规则
iptables 习惯里我们写 -A INPUT -j DROP 当兜底;nftables 里兜底写在 chain 的
policy drop 上。区别很实在:policy drop 是链走完所有规则后的默认动作,
而一条 drop 规则会把后续规则全部吃掉。
table inet filter {
chain input {
type filter hook input priority filter; policy drop
iif "lo" accept
ct state established,related accept
tcp dport { 22, 443 } accept
}
}
这段的顺序有意义:ct state established,related accept 必须早于任何 drop 型规则,
否则回程包会被当成“新连接”丢掉,表现为“连上了但什么都收不到”。
二、一次把自己锁在门外
改远端机器的防火墙,最稳的做法是给自己留一条退路:
- 先
systemctl stop nftables别急,把新规则写进临时文件; - 用
nft -c -f /tmp/new.nft只做语法检查; - 起一个
at now + 5 minutes的定时任务,把旧规则恢复; - 应用新规则,确认仍在会话里,再取消定时任务。
我漏掉最后一步的那个下午,是靠控制台的 VNC 救回来的。
三、排查先看计数器
规则没生效时,先问“包有没有到”。给可疑规则挂 counter,或者临时在链尾加一条
带计数器的 drop:
nft add rule inet filter input counter drop
计数涨了说明包到了本机被丢,没涨就是上游/链路的问题——这个二分比对着配置文件猜快得多。
顺带一提,nft list ruleset 的输出和文件里的写法不一定一一对应:内核态会把
集合展开、把匿名集合并,别拿输出当源文件的 diff 依据。