iptables的recent模块是识别慢速端口扫描最实用、无需额外软件的内建方案,它通过--set与--rcheck在60秒内检测同一源ip向10个不同端口发起syn请求即封禁,响应快、开销低,且直接在内核包处理路径中完成标记与判断。

iptables 的 recent 模块是识别慢速端口扫描最实用、无需额外软件的内建方案。它不依赖日志分析或外部进程,直接在内核包处理路径中完成标记与判断,响应快、开销低。关键在于抓住慢扫的核心特征:同一源 IP 在短时间(如 60 秒)内向多个不同端口发起 SYN 请求,且多数不完成握手。
基础检测逻辑:用 --set 和 --rcheck 配合实现计数
recent 模块本身不提供“计数器”,而是通过时间窗口内的匹配次数来模拟。典型做法是:
- 对每个新收到的 TCP SYN 包(
--syn),先尝试检查该 IP 是否已在 recent 列表中达到阈值——用--rcheck --seconds 60 --hitcount 10 - 若命中,立即
-j DROP封禁后续所有入向流量 - 若未命中,则用
--set将该 IP 加入列表(记录首次匹配时间)
注意:这两条规则顺序不能颠倒,否则新连接永远进不了列表,检测失效。
推荐生产可用规则(防跨端口试探)
以下规则组合兼顾有效性与兼容性,适用于大多数 Linux 发行版(需内核 ≥ 2.6.20,iptables ≥ 1.4.0):
# 先创建专用列表名(可选,但建议) iptables -N PORTSCAN-DETECT <h1>检查是否已达阈值:60秒内出现10个SYN即封</h1><p>iptables -A PORTSCAN-DETECT -p tcp --syn -m recent --name portscan --rcheck --seconds 60 --hitcount 10 -j DROP</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/1464" title="服务器远程桌面端口修改器 v2.0"><img src="https://img.php.cn/upload/manual/000/000/001/5a991c86282e6420.png" alt="服务器远程桌面端口修改器 v2.0" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/gongju/1464" title="服务器远程桌面端口修改器 v2.0" class="overflowclass">服务器远程桌面端口修改器 v2.0</a> <p class="overflowclass">服务器远程桌面端口修改器 v2.0</p> </div> <a rel="nofollow" href="/xiazai/gongju/1464" title="服务器远程桌面端口修改器 v2.0" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><h1>未达阈值则记录该IP(仅对新SYN生效)</h1><p>iptables -A PORTSCAN-DETECT -p tcp --syn -m recent --name portscan --set -j ACCEPT</p><h1>将检测链挂载到INPUT主链末尾(务必放在允许SSH/HTTP等规则之后)</h1><p>iptables -A INPUT -j PORTSCAN-DETECT </p>
效果:某 IP 在 60 秒内向任意 10 个不同端口发 SYN,第 10 次触发时即被 DROP;此后该 IP 所有入向 TCP 包(包括已建立连接)都会被丢弃,直到其在 recent 列表中自然过期(默认超时 600 秒,可通过 --seconds 调整)。
增强防护:结合 conntrack 与日志定位
单纯靠 SYN 数量可能误伤合法客户端(如多线程爬虫)。建议叠加状态判断和日志辅助:
- 加
-m conntrack --ctstate NEW,只统计真正的新连接请求,排除重传或干扰包 - 在 DROP 前加一条 LOG 规则:
-j LOG --log-prefix "PORTSCAN_BLOCK: ",便于排查误封 - 配合
ipset替代纯 recent:把命中 IP 自动加入 ipset 集合,再用-m set --match-set scanner-set src统一拦截,更利于长期封禁或集成 fail2ban
注意事项与调优建议
实际部署时需避开几个常见坑:
- recent 列表默认大小为 100 条,高并发场景下可能溢出,用
sysctl -w net.netfilter.nf_conntrack_max=65536并调整/proc/sys/net/netfilter/nf_conntrack_expect_max - 不要把 recent 规则放在
ESTABLISHED,RELATED规则之前,否则已建连的包也会被重复检查,浪费性能 - 云服务器要注意:部分厂商的底层防火墙会提前响应 ICMP 或 RST,导致扫描者绕过检测,此时应关闭
net.ipv4.icmp_echo_ignore_all = 1并禁用tcp_abort_on_overflow










