自建 VPS 防火墙备忘:nftables 最小可用规则

运维2026-08-30 · 阅读 6 分钟

每次开新机器都要翻一遍文档,干脆记下来:一套只放行必要端口的 nftables 规则,附带防 SSH 爆破的限速写法,开箱即用。

规则文件

写到 /etc/nftables.conf,然后 systemctl enable --now nftables:

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;

    ct state established,related accept
    iif lo accept

    icmp type { echo-request } accept

    # SSH 限速:每分钟最多 5 个新连接
    tcp dport 22 ct state new \
      meter ssh_flood { ip saddr limit rate 5/minute } accept

    tcp dport { 80, 443 } accept
    udp dport 443 accept

    counter drop
  }

  chain forward { type filter hook forward priority 0; policy drop; }
  chain output { type filter hook output priority 0; policy accept; }
}

几个细节

ct state established,related accept 必须放在最前面,否则回包会被丢掉;iif lo accept 别忘了,很多本机服务走回环通信。ICMP 建议保留 echo-request,路径 MTU 探测靠它。

上线前先验证

最稳妥的做法是先在测试机上跑一遍 nft -c -f /etc/nftables.conf 做语法检查,再正式加载。规则里一定先放行你的 SSH 来源 IP,或者确保有 VNC 控制台兜底,别问我怎么知道的。

IPv6 别漏

table inet 同时覆盖 v4/v6,这是推荐写法。如果机器没开 v6,把 icmp 换成只匹配 ipv4 即可,但别把整个 v6 入口一起 drop 了又留着 v6 地址监听。

规则不复杂,关键是养成“先验证、再加载、留后路”的习惯。存个档,下次直接抄。

← 返回首页