直接用nft -f加载新规则集可原子切换策略,不中断现有连接;关键在于整套规则一次性生效,且需用ct state new精准拦截新连接,避免逐条命令导致策略空窗。

直接用 nft -f 加载新规则集,就能在不中断现有连接的前提下关闭高危端口。关键不是“删掉某条规则”,而是整套规则一次性切换——旧连接照常通行,新连接按新策略处理。
必须用文件加载,不能逐条执行命令
原子替换只在 nft -f /path/to/rules.nft 时触发。如果用 nft add rule 或 nft delete rule 增删单条规则,内核会实时修改当前规则集,可能造成短暂策略空窗或状态不一致。
- 正确做法:把所有规则(包括表、链定义和端口控制逻辑)写进一个
.nft文件,再执行sudo nft -f /etc/nftables.conf - 错误做法:
sudo nft add rule inet filter input tcp dport 23 drop—— 这类操作无法保证原子性,也不便于回滚
关闭高危端口的规则要放在合适位置
比如要封 Telnet(23端口)、FTP(21端口)、SMB(445端口),规则应加在 input 链靠前位置,且明确匹配协议和状态:
-
tcp dport 23 ct state invalid, new drop -
tcp dport 21 ct state new drop -
tcp dport 445 ct state new drop
这样能拦截新建连接,但不影响已建立的 SSH、HTTP 等会话。ct state new是重点,它确保只拦新请求,放行已有连接。
用 set 管理动态高危端口列表,方便批量更新
如果需频繁开关一批端口(如临时封禁 21/23/139/445/3389),建议定义一个端口集合:
nft add set inet filter blocked_ports { type inet_service\; }
nft add element inet filter blocked_ports { 21, 23, 139, 445, 3389 }
nft add rule inet filter input tcp dport @blocked_ports ct state new drop
后续只需更新集合内容并重载文件,不用改链结构,也不影响其他规则。
配合 include 实现端口策略独立维护
把端口控制规则单独拆到 /etc/nftables.d/99-blocked-ports.nft,主配置中写:
include "/etc/nftables.d/*.nft"
要关闭某几个高危端口,只需编辑子文件、保存,再运行 sudo nft -f /etc/nftables.conf —— 修改隔离、加载可控、出错易定位。
不复杂但容易忽略











