核心是“白名单思维+静默丢弃”:只放行明确需要的端口(如22、80、443、53),其余新连接一律不响应;通过nft匿名集合规则(tcp/udp dport != {x,y,z} ct state new drop)实现静默拦截,且必须置于ACCEPT规则之前,配合回环、已建立连接等基础规则确保安全与可用性。

用匿名集合在单行规则里封闭漏洞端口,核心是“白名单思维+静默丢弃”:只放行明确需要的端口,其余新连接一律不响应。这不是靠堆规则数量,而是靠结构精简把策略表达得更准、更稳。
先理清哪些端口该保留
别凭感觉列白名单。执行 ss -tln 查本机真实监听的 TCP 端口,ss -uln 查 UDP 端口。重点关注:
- 业务必需端口(如 22、80、443、3306)
- 本地回环专用端口(如 127.0.0.1:9000)——这些不用放行给外网
- Docker 或容器平台常用端口(如 2376、53、8443),若非必要对外,也应排除
写一条带匿名集合的 drop 规则
直接用 nft add rule 加入 input 链,位置必须靠前(在所有 ACCEPT 规则之前):
nft add rule inet filter input tcp dport != {22, 80, 443} ct state new drop
说明:
-
tcp dport != {22, 80, 443}表示“目标端口不是这三个中的任意一个” -
ct state new确保只影响新发起的连接请求,已建立的会话不受干扰 -
drop是关键——不发 SYN-ACK,也不发 RST,扫描器收不到任何响应,只能等待超时
UDP 端口也需同步处理
TCP 封了不代表安全闭环。常见暴露面还有 DNS(53)、SNMP(161)、NTP(123)等 UDP 服务。确认无业务依赖后,加一行:
nft add rule inet filter input udp dport != {53} ct state new drop
注意:!= 后的大括号里只放你真正在用的 UDP 端口;没用的就别写,让它被规则自动覆盖。
配套基础规则不能少
匿名集合再高效,也不能脱离防火墙基本逻辑。确保以下几条已在 input 链中且顺序合理:
- 允许回环:
nft add rule inet filter input iifname "lo" accept - 允许已有连接返回:
nft add rule inet filter input ct state established,related accept - 显式放行 SSH(避免自己被锁):
nft add rule inet filter input tcp dport 22 ct state new accept - 最后才是你的静默 drop 规则
顺序错了,比如把 drop 放在 established 规则前面,会导致所有新连接都被拦住,连 SSH 都连不上。

















