nftables 实战:给一台小机器写一套够用的防火墙
手上有台 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 会自己建表)互不干扰。