nftables 实战:给一台小机器写一套够用的防火墙

2026-05-30 · 运维

手上有台 1 核的小机器跑着几个服务,一直裸奔。趁周末把 iptables 那套换成了 nftables,顺手记一下几个真正用得上的特性。

一张表,一条默认拒绝的 input 链

table inet fw {
  chain input {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    iif "lo" accept
    ct state invalid drop
    tcp dport { 22, 80, 443 } accept
  }
}

inet 族让同一套规则同时管 IPv4 和 IPv6,不用写两遍。

用 meter 做单源限速

nftables 的动态集合 + meter 可以做到"每个源 IP 独立限速",不需要额外的模块:

tcp dport { 80, 443 } ct state new \
  meter conncap { ip saddr ct count over 1000 } drop

这条的意思是:单个源 IP 到 80/443 的并发连接超过 1000 就丢。防慢速连接占满句柄很有用。踩过的一个坑是——命名集合里内嵌 ct count 某些内核版本会报 Operation not supported,改用匿名 meter 就好了。

持久化

别指望 nft flush ruleset 之后一切还在。我的做法是把规则写进一个文件,用一个 oneshot 的 systemd 单元在开机时 nft -f 加载,这样和容器(Docker 会自己建表)互不干扰。

← 返回首页