直接从 apache 日志识别恶意爬虫并封禁ip:一查异常ua(排除主流浏览器,盯seo工具及扫描特征);二用setenvifnocase精准拦截并放行搜索引擎;三用python脚本统计高频ip+路径特征生成deny规则;四推荐fail2ban实现持久化防火墙封禁。

直接从 Apache 日志里揪出恶意爬虫,再一键封掉它们的 IP,这事不难,但得踩对几个关键点:看准真实 UA 模式、区分真假扫描行为、封禁动作要快且不伤正常流量。
一、先从 access.log 里挖出真实的可疑 UA
别凭经验写规则,先让日志说话。打开你的 Apache 日志(通常是 /var/log/apache2/access.log),用这几条命令快速定位高频异常 UA:
- 查近 24 小时非浏览器类 UA(排除 Chrome/Firefox/Safari 等):
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 - 重点盯这些典型标识:ahrefsbot.*SEO、semrushbot.*site_audit、dotnetcurl、python-requests/2.31、go-http-client/2.0、masscan、sqlmap
- 注意伪装行为:有些爬虫把 UA 设成 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0",但 Referer 是 "-",又只扫 /wp-login.php 或 /api/v1/user?id= 这类路径——这种要结合字段交叉判断
二、Apache 配置中精准拦截 UA(不误杀搜索引擎)
在站点配置或 .htaccess 中加入以下逻辑,核心是“匹配+放行”双保险:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 用 SetEnvIfNoCase 标记恶意 UA:
SetEnvIfNoCase User-Agent "ahrefsbot|semrushbot|dotnetcurl|python-requests|go-http-client|masscan|sqlmap|nikto" bad_bot - 同时放行主流搜索爬虫(避免影响 SEO):
SetEnvIfNoCase User-Agent "Googlebot|Baiduspider|YandexBot|Sogou|bingbot" good_bot - 最终只拒绝被标记为 bad_bot 且未被 good_bot 覆盖的请求:
Order Allow,Deny
Allow from all
Deny from env=bad_bot
Allow from env=good_bot
三、自动提取 IP 并一键封禁(Python 脚本实战)
光拦 UA 不够,高频恶意 IP 得彻底拉黑。下面是一个轻量 Python 脚本思路,可直接运行:
- 脚本读取 access.log,按 IP 统计 1 小时内请求次数,过滤出超阈值(如 500 次)的 IP
- 同时检查该 IP 是否满足“空 Referer + 扫描路径”组合特征(如 GET /xmlrpc.php 或 POST /wp-comments-post.php)
- 生成 Nginx 或 Apache 可用的封禁列表:
deny 192.168.5.100;
deny 203.0.113.44/24; - 执行 systemctl reload apache2 或 nginx -s reload 热加载生效
四、进阶推荐:用 fail2ban 实现持久化动态封禁
如果希望封禁跨重启有效、还能联动系统防火墙,fail2ban 是更稳的选择:
- 在 /etc/fail2ban/jail.local 中新增自定义 jail:
[apache-bad-ua]
enabled = true
filter = apache-bad-ua
logpath = /var/log/apache2/access.log
maxretry = 3
bantime = 86400 - 对应写好 filter 规则(/etc/fail2ban/filter.d/apache-bad-ua.conf),匹配 UA 中含 sqlmap|python-requests|masscan 且状态码为 200/404 的行
- 启动后,fail2ban 会自动调用 iptables 或 ufw 把 IP 加入系统级黑名单









