iptables recent模块防慢速端口扫描,核心是检测同一IP在时间窗口内发送多个TCP SYN包试探不同端口,需加--syn限定、合理设--seconds与--hitcount,并严格遵循--rcheck先于--set的规则顺序。

用 iptables 的 recent 模块防慢速端口扫描,核心是抓住“同一 IP 在时间窗口内试探多个端口”这一行为特征。它不依赖日志、不启动额外进程,直接在内核包路径中完成识别与封禁,响应快、资源开销极低。
明确检测目标:只盯 TCP SYN 新连接
慢扫工具(如 custom Python 脚本、slowloris 变种)常故意拉长间隔、错开端口,避开秒级限流。recent 模块必须聚焦于真正代表“试探意图”的流量——即未完成三次握手的 SYN 包:
- 务必加上 --syn 限定,排除 ACK、RST 等后续包干扰
- 避免匹配所有 TCP 流量,否则合法重传、Keep-Alive 包也会被误计
- 若服务仅开放特定端口(如 22/80/443/3000),建议显式加 --dport,缩小作用范围
设置合理的时间窗口与触发阈值
60 秒 + 10 端口是通用起点,但需按实际业务调整:
- --seconds 60:从该 IP 首次触发 --set 开始计时(用 --rcheck 时),适合捕获短周期集中试探
- --hitcount 10:表示 60 秒内收到 10 个不同目标端口的 SYN 包即触发封禁
- 对管理严格环境(如后台 API),可收紧为 --seconds 30 --hitcount 5
- 对高并发 Web 服务,可放宽至 --seconds 120 --hitcount 15,减少误判
规则顺序与链位置不能错
recent 规则必须成对出现,且顺序固定:
- 先写检测规则:-m recent --rcheck --seconds X --hitcount Y -j DROP
- 再写记录规则:-m recent --set -j ACCEPT(或 -j RETURN,视策略而定)
- 这两条必须放在 INPUT 链靠前位置,但要在 ESTABLISHED/RELATED 放行之后、具体服务放行规则之前
- 切勿把 --set 和 --rcheck 写在同一行,否则新 IP 永远无法进列表
增强可观测性与防御纵深
单靠封禁不够,要便于排查和联动:
- 在 DROP 前加一条 LOG 规则:-j LOG --log-prefix "SLOWSCAN-ALERT: ",方便用 journalctl 或 dmesg 追踪
- 可配合 connlimit 限制单 IP 并发连接数,堵住“建连后不发数据”的慢速耗尽类攻击
- 封禁后建议用 REJECT --reject-with tcp-reset 替代 DROP,让扫描器快速失败,降低隐蔽性
- 如需长期黑名单,可将触发 IP 导出到 ipset,再由其他规则统一拦截

















