直接从apache日志识别并封禁恶意爬虫需三步:一查异常ua(排除主流浏览器,盯seo工具及扫描特征),二用setenvifnocase精准拦截并放行搜索引擎,三用python脚本统计高频ip+路径特征生成deny规则,四在反向代理下通过mod_remoteip还原真实ip再封禁。

直接从 Apache 日志里识别并封锁恶意爬虫,核心是“先看日志、再定规则、最后封 IP”,不靠猜,靠数据驱动。重点不是拦所有非浏览器 UA,而是揪出真实在扫你网站的异常行为——比如高频请求 + 空 Referer + 敏感路径,三者叠加才动手。
一、从 access.log 里挖出真实可疑 UA
别凭印象写拦截规则。打开你的访问日志(通常是 /var/log/apache2/access.log 或 /var/log/httpd/access_log),用命令快速筛出高频异常 UA:
- 查近 24 小时非主流浏览器 UA(排除 Chrome/Firefox/Safari/Edge):
awk '$9==200 || $9==404 {print $12}' /var/log/apache2/access.log | grep -v -E "(Chrome|Firefox|Safari|Edge|Opera)" | sort | uniq -c | sort -nr | head -20 - 重点关注含以下关键词的 UA:ahrefsbot、semrushbot、dotnetcurl、python-requests、go-http-client、masscan、sqlmap、nikto、ltx71
- 警惕伪装行为:UA 写成 “Mozilla/5.0…Chrome/120”,但 Referer 是 "-",且只扫
/wp-login.php、/xmlrpc.php、/api/v1/user?id=这类路径——这种必须结合字段交叉判断
二、用 SetEnvIfNoCase 精准拦截 UA(不伤搜索引擎)
在站点配置或 .htaccess 中加规则,轻量、可审计、支持正则和大小写忽略:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 标记恶意 UA:
SetEnvIfNoCase User-Agent "ahrefsbot|semrushbot|dotnetcurl|python-requests|go-http-client|masscan|sqlmap|nikto" bad_bot - 同时放行主流搜索爬虫(避免影响 SEO):
SetEnvIfNoCase User-Agent "Googlebot|Baiduspider|YandexBot|bingbot|Sogou" good_bot - 最终拒绝逻辑(允许 good_bot,拒绝其余 bad_bot):
Order Allow,Deny<br>Allow from all<br>Deny from env=bad_bot<br>Allow from env=good_bot
三、自动提取高频恶意 IP 并一键封禁
光拦 UA 不够,得拉黑真实发起扫描的 IP。一个轻量 Python 脚本就能做到:
- 读取 access.log,统计 1 小时内每个 IP 的请求次数,超阈值(如 500 次)即标记
- 叠加行为验证:该 IP 是否同时满足“Referer 为空”+“请求路径含
/wp-admin/、/xmlrpc.php、.env等敏感目标” - 生成标准 deny 规则:
deny 192.168.5.100;<br>deny 203.0.113.44/24;
- 写入 Apache 配置文件(如 /etc/apache2/conf-available/blocked-ips.conf),然后热加载:
systemctl reload apache2
四、反向代理环境下还原真实 IP 再封禁
如果你用了 Nginx/CDN/ALB 做前置代理,%{REMOTE_ADDR} 拿到的是代理 IP,不是真实访客。必须先还原:
- 确保上游代理设置了
X-Real-IP或X-Forwarded-For(如 Nginx 加proxy_set_header X-Real-IP $remote_addr;) - Apache 启用
mod_remoteip,并在配置中声明可信代理段:RemoteIPHeader X-Forwarded-For<br>RemoteIPTrustedProxy 10.0.0.0/8<br>RemoteIPTrustedProxy 172.16.0.0/12<br>RemoteIPTrustedProxy 192.168.0.0/16
- 之后就能用
%{REMOTE_ADDR}获取真实 IP,所有封禁才真正打在攻击源上










