nftables 从入门到不误伤自己

2026-10-28 · 运维

把机器从 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 型规则, 否则回程包会被当成“新连接”丢掉,表现为“连上了但什么都收不到”。

二、一次把自己锁在门外

改远端机器的防火墙,最稳的做法是给自己留一条退路:

我漏掉最后一步的那个下午,是靠控制台的 VNC 救回来的。

三、排查先看计数器

规则没生效时,先问“包有没有到”。给可疑规则挂 counter,或者临时在链尾加一条 带计数器的 drop:

nft add rule inet filter input counter drop

计数涨了说明包到了本机被丢,没涨就是上游/链路的问题——这个二分比对着配置文件猜快得多。

顺带一提,nft list ruleset 的输出和文件里的写法不一定一一对应:内核态会把 集合展开、把匿名集合并,别拿输出当源文件的 diff 依据。