核心思路是结合云服务商ip段、端口协议与连接频率实施精准拦截,避免误伤;优先使用官方ip源,通过ipset管理地址集,配合connlimit和recent模块限速,辅以xt_string匹配http头特征,并建立更新与日志机制保障有效性。

直接用 iptables 拦截特定云服务商段的爬虫流量,核心思路是:识别这些服务商常被滥用的 IP 地址范围(如 AWS、阿里云、腾讯云、OVH 等的公网出口段),再结合访问行为特征(如高频 HTTP 请求、非常规 User-Agent、无 Cookie 或 Referer)做精准过滤。单纯靠 IP 段容易误伤正常用户,所以推荐“IP 段 + 协议/端口 + 连接频率”组合策略。
一、获取目标云服务商的公网 IP 段
不要依赖第三方整理的列表,优先使用官方或权威来源:
-
AWS:从 https://www.php.cn/link/d8e2b37ccb003d5e67f51aa291722a44 解析
prefixes中"service": "AMAZON"或"service": "CLOUDFRONT"的 IPv4 段 -
阿里云:参考 APNIC 分配数据,或使用其公开 CIDR 列表(如
203.208.39.0/24等常被扫描的出口段;注意区分真实 ECS 出口与 CDN 回源段) -
腾讯云 / 华为云 / OVH / DigitalOcean:同样查各自官网 IP 汇总页,或用
whois查 AS 号后聚合(例如 OVH 的 AS16276)
获取后建议转成单行空格分隔格式,便于批量导入:
ipset create cloud-ips hash:netipset add cloud-ips 52.95.245.0/24
ipset add cloud-ips 54.230.128.0/17
...
二、设置带速率限制的拦截规则
仅 DROP 所有云段流量风险高(可能封掉合法云上运维请求)。更稳妥的是对 HTTP/HTTPS 流量加连接频控:
- 先放行已知可信的云内管理流量(如 SSH、内网 API)——用
-i eth0 -p tcp --dport 22 -s [可信段] -j ACCEPT - 对 Web 端口(80/443)启用连接速率限制:
iptables -I INPUT -p tcp -m multiport --dports 80,443 -m set --match-set cloud-ips src -m recent --name cloudbot --set
iptables -I INPUT -p tcp -m multiport --dports 80,443 -m set --match-set cloud-ips src -m recent --name cloudbot --update --seconds 60 --hitcount 20 -j DROP
三、配合 User-Agent 和请求头做二次过滤
iptables 本身不解析 HTTP 头,但可与 xt_string 模块配合匹配简单特征(需内核支持):
- 屏蔽明显伪造的爬虫标识:
iptables -I INPUT -p tcp --dport 80 -m string --algo bm --from 40 --string "Go-http-client" -j DROP
iptables -I INPUT -p tcp --dport 80 -m string --algo bm --from 40 --string "curl/" -j DROP
⚠️ 注意:--from 40 是跳过 TCP/IP 头后大致定位到 HTTP 头区域,实际偏移需用抓包确认;该方式对 HTTPS 无效(TLS 加密后不可见)。
四、验证与持续维护
规则上线前务必测试并留好逃生通道:
- 用
iptables -L -n -v查看规则命中数,确认未误杀自身运维流量 - 临时放行自己 IP:
iptables -I INPUT -s YOUR_IP -j ACCEPT(放在最前) - 定期更新 IP 段:写脚本每月自动拉取 AWS/Aliyun 等最新段,diff 后增量更新 ipset
- 日志辅助判断:
iptables -A INPUT -p tcp --dport 80 -m set --match-set cloud-ips src -j LOG --log-prefix "CLOUD-BOT-DROP: "











