应监控未监听端口上大量ct state new但极少established的tcp syn流量,通过nftables为各关闭端口配置独立命名计数器(如portscan-22),在input链established规则前匹配dport+ct state new并计数,再定时比对new与established包量差值识别扫描行为。

直接用 nftables 的 counter 功能监控“被关闭端口的非法扫描”,关键不是盯住端口是否开放,而是捕获那些**试图连接未监听端口、且未建立合法连接**的流量特征——最典型的就是大量 ct state new 包发往非业务端口,同时几乎不产生 established 流量。
明确监控目标:识别“扫端口”而非“连服务”
操作系统不会对未监听端口主动回包(如 TCP RST),但扫描器仍会持续发送 SYN。nftables 能通过 conntrack 状态精准区分:
- new:SYN 到达,但本机无对应监听 socket → 极可能是扫描行为
- invalid:SYN 后迟迟无响应,或分片/校验异常 → 常见于暴力探测或畸形包
- established:真正完成三次握手的连接 → 正常业务流量,应明显少于 new
为关闭端口配置带命名的计数器规则
不要用通配规则笼统统计,而是按端口或端口组精细划分,便于定位异常源:
- 创建专用计数器(名称体现用途):
nft add counter inet filter portscan-22、nft add counter inet filter portscan-3389 - 在 INPUT 链中添加规则(放在 established 规则之前):
nft add rule inet filter input tcp dport 22 ct state new counter name portscan-22 - 同理覆盖常见高危关闭端口:
23, 135, 139, 445, 3389, 5900,每条都绑定独立命名计数器
用差值比识别扫描行为并持续观察
单看 new 包数量意义有限,需结合 established 对比,发现“只发不答”的异常模式:
- 定时执行:
nft list chain inet filter input -a | grep -E "(portscan|established)" - 提取计数后计算比值,例如:
portscan-22: packets 127 / established-22: packets 3 → 比值约 42:1 - 若某端口的 new 计数在 5 分钟内增长超 100 且 established 增长
联动日志与限速实现轻量闭环
counter 本身只计数,需搭配其他动作才能形成防御反馈:
- 记录扫描源 IP:
nft add rule inet filter input tcp dport 22 ct state new counter name portscan-22 log prefix "SCAN-22: " drop - 配合 meter 实现自动限速:
nft add rule inet filter input ip saddr @scan-block-set ct state new drop(先用脚本将高频扫描 IP 加入 ipset) - 导出数据供告警:每 30 秒采集一次各 portscan-* 计数器增量,写入 CSV,触发阈值即发通知










