生产级nftables规则:默认拒绝+最小放行+双栈统一处理+持久化。创建inet表及input/forward/output链并设策略,依次添加lo、established/related、invalid、ICMP/ICMPv6、SSH(ct state new)、HTTP/HTTPS等规则,最后导出至/etc/nftables.conf并启用systemctl服务。

直接上一套能用、安全、重启不丢的生产级 nftables 规则。核心思路是:默认拒绝 + 最小放行 + IPv4/IPv6 统一处理 + 规则持久化。
1. 创建统一双栈表和基础链
用 inet 协议族,一条规则同时管 IPv4 和 IPv6:
- nft add table inet filter
- nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
- nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
- nft add chain inet filter output { type filter hook output priority 0 \; policy accept \; }
注意末尾的 \; 是 shell 要求的转义,policy drop 是安全基线——不显式允许的,一律拒绝。
2. 加入关键基础规则(顺序不能乱)
这些规则必须按以下顺序添加,否则连接会中断:
-
允许回环通信:
nft add rule inet filter input iifname "lo" accept -
放行已建立和关联连接:
nft add rule inet filter input ct state established,related accept -
拦截无效连接状态:
nft add rule inet filter input ct state invalid drop -
允许 ICMP(含 IPv6 的 ping 和邻居发现):
nft add rule inet filter input ip protocol icmp icmp type { echo-request, echo-reply } accept
nft add rule inet filter input ip6 protocol ipv6-icmp icmpv6 type { nd-neighbor-solicit, nd-neighbor-advert, echo-request, echo-reply } accept
3. 开放必要服务端口
只开真正需要的端口,避免宽泛匹配:
-
SSH(限制新连接,防暴力扫描):
nft add rule inet filter input tcp dport 22 ct state new accept -
HTTP/HTTPS:
nft add rule inet filter input tcp dport { 80, 443 } accept -
如需 NTP 或 DNS 查询出站:
nft add rule inet filter output udp dport { 53, 123 } accept
不建议用 tcp dport 22 accept 这种写法——它会匹配所有 TCP 包,包括已建立连接的 ACK,容易绕过连接跟踪逻辑;加 ct state new 更精准、更安全。
4. 持久化保存与开机生效
命令行规则只在内存中,必须导出并启用服务:
-
导出当前规则到标准配置文件:
nft list ruleset > /etc/nftables.conf -
确保服务开机启动:
systemctl enable nftables -
立即加载配置:
systemctl restart nftables -
验证是否生效:
systemctl status nftables看 Loaded 行是否指向/etc/nftables.conf,再执行nft list ruleset确认规则完整。
不要用 rc.local 或自定义脚本 reload——nftables 服务本身就在启动时读取该文件并加载,这是唯一推荐路径。

















