用 nftables 实现“多余端口静默拦截”的核心是使用 drop 规则匹配新连接(ct state new)且目标端口不在白名单中的 tcp/udp 报文,不响应 syn 也不发 rst,使扫描器超时;需先梳理真实开放端口(如 22/80/443),排除本地回环和容器端口,确保 conntrack 启用,并将规则置于 input 链靠前位置。

用 nftables 实现“多余端口静默拦截”,核心是:不回复 SYN(即不发 SYN-ACK),也不发 RST,让连接请求直接超时——这比拒绝(reject)更隐蔽,能降低被扫描识别的风险。
明确哪些端口属于“多余”
先梳理本机实际需要对外开放的端口(如 Web 服务用 80/443、SSH 用 22),其余未主动监听或业务无关的端口,都可视为“多余”。注意:只封入站(input chain),不影响本机主动外连;同时确保已启用 conntrack,避免误伤已有连接。
- 用
ss -tln或netstat -tln查看当前 LISTEN 端口 - 用
cat /proc/sys/net/ipv4/ip_forward确认是否为纯主机(非路由),默认应为 0 - 避免封掉本地回环(127.0.0.1)和 Docker/容器常用端口(如 2376、53),除非明确不需要
编写静默丢弃规则(drop,非 reject)
关键在于使用 drop,而非 reject with tcp reset 或 icmp-host-prohibited。drop 不产生任何响应包,扫描器收不到反馈,会等待超时,从而降低暴露面。
一款AI开发辅助工具,主要用于从 AI 编程会话日志(Clawdbot、Claude Code、Codex)中提取对话记录。该功能用于在用户要求导出提示词历史、会话日志或 `.jsonl` 格式的会话文件时使用,适合需要提升相关任务效率的用户。
- 基础规则示例(IPv4):
说明:
– tcp dport != {...} 匹配所有非指定 TCP 目标端口
– ct state new 仅作用于新连接请求(避免干扰已建立连接)
– 若需包含 UDP(如关闭无用 DNS、SNMP),再加一条:
nft add rule ip filter input udp dport != {53} ct state new drop
(此处仅放行 53,按需调整)
构建可复用的 nftables 脚本
把规则写成脚本(如 /etc/nftables-silent-block.nft),便于加载、审查和重置:
- 开头声明表与链(确保 filter 表和 input 链存在)
- 清空旧规则(可选,用于调试):
nft flush chain ip filter input - 插入静默拦截规则在 input 链靠前位置(早于 ACCEPT 规则)
- 保留 SSH 免死锁:在 drop 规则前,显式允许本机 IP 或特定网段的 22 端口
最小可行脚本片段:
#!/usr/sbin/nft -fflush ruleset
table ip filter {
chain input {
type filter hook input priority 0;
ct state established,related accept
iifname "lo" accept
tcp dport {22, 80, 443} ct state new accept
tcp dport != {22, 80, 443} ct state new drop
udp dport != {53} ct state new drop
}
}
验证与长期生效
执行后立即测试:
– 从外部用 telnet 服务器IP 9999(一个未开放端口),应卡住数秒后超时(非“Connection refused”)
– 用 nft list ruleset 确认规则已载入
– 检查日志(dmesg | grep nft 或 journalctl -u nftables)有无语法错误
- 开机自启(Debian/Ubuntu):
systemctl enable nftables,并确保脚本路径在/etc/nftables.conf中被 include - Red Hat/CentOS:将脚本保存为
/etc/sysconfig/nftables.conf,启用nftables服务 - 定期复查:新增服务时同步更新端口白名单,避免“静默拦截”误伤自身业务










