iptables 限制单ip暴力探测需结合 recent、connlimit 和日志联动:用 recent 基于 syn 频率识别慢速扫描,connlimit 控制半开连接数,再通过 nginx 日志+ipset 实现路径级精准封禁,并注意规则顺序、日志验证及 cdn 场景适配。

用 iptables 限制单 IP 对 Web 接口的暴力探测,核心是识别“高频、低并发、跨路径”的异常访问模式——这类行为不像 CC 攻击那样堆连接,而是用少量请求反复试探登录、注册、短信等敏感接口。单纯靠端口或协议过滤没用,得结合 recent、connlimit 和日志联动。
用 recent 模块识别慢速扫描式探测
暴力探测常表现为:同一 IP 在 60 秒内对 /login、/api/send-sms、/register 等路径发起 10+ 次 HTTP 请求(哪怕只走 80/443 端口)。iptables 本身不解析 URL,但可通过 SYN 包频率间接捕捉:
- 对每个新 TCP 连接(SYN)记录源 IP:
iptables -A INPUT -p tcp --dport 80 -m tcp --syn -m recent --name webprobe --set -j ACCEPT - 60 秒内累计 8 次新连接即拉黑:
iptables -A INPUT -p tcp --dport 80 -m tcp --syn -m recent --name webprobe --rcheck --seconds 60 --hitcount 8 -j DROP - 加一条日志规则便于确认效果:
iptables -A INPUT -p tcp --dport 80 -m tcp --syn -m recent --name webprobe --rcheck --seconds 60 --hitcount 8 -j LOG --log-prefix "WEB-PROBE-DROP: "
用 connlimit 控制半开连接数防试探性堆积
攻击者常使用工具(如 curl 脚本、Burp Intruder)以低频但持续方式维持多个未完成握手的连接,消耗服务资源。针对 Web 端口做轻量级并发控制:
- 拒绝单 IP 同时超过 4 个未完成的 TCP 连接(非已建立):
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 4 --connlimit-mask 32 -j REJECT --reject-with tcp-reset - 注意这条规则要放在 “允许 ESTABLISHED” 规则之后、“开放 80 端口” 规则之前,否则会误伤正常用户重连
配合 Nginx 日志 + ipset 实现精准路径级封禁
recent 只能看连接层,真正判断“是否在暴力调用 /api/login”还得靠应用日志。推荐组合方案:
- 用 shell 脚本每 2 分钟分析 Nginx access.log,提取 120 秒内访问 /api/login 超过 15 次的 IP:
awk '$9==200 && $7~/\/api\/login/ {print $1}' /var/log/nginx/access.log | sort | uniq -c | awk '$1>15 {print $2}' - 将这些 IP 加入 ipset 黑名单:
ipset add web-brute-ips 192.168.5.23 - iptables 直接丢弃黑名单 IP 的所有 Web 流量:
iptables -I INPUT -m set --match-set web-brute-ips src -p tcp --dport 80 -j DROP - 脚本通过 crontab 每 2 分钟执行一次,响应快、无漏判
加固要点与避坑提醒
这几条规则不是设完就一劳永逸,要注意实际部署细节:
- 所有限速规则必须放在 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 之后,否则会把合法回包也拦掉
- 不要用 -j DROP 直接上线,先换成 -j LOG 观察 10 分钟,用 dmesg -T | grep WEB-PROBE-DROP 确认拦截逻辑合理
- recent 模块默认最多存 100 个 IP,若并发探测 IP 多,需调大:
echo 'options ipt_recent ip_list_tot=2000' > /etc/modprobe.d/ipt_recent.conf - 若后端有负载均衡或 CDN,real IP 是 X-Forwarded-For,此时 iptables 层无法识别真实攻击源,应改在 Nginx 或应用层做限流











