在 apache 反向代理中过滤恶意爬虫需先通过 mod_remoteip 还原真实 ip,再结合 ua、referer、请求路径等多维度条件拦截,并配合 fail2ban 实现持久封禁,同时防范 x-forwarded-for 伪造等绕过风险。

在 Apache 反向代理环境中过滤恶意爬虫,不能只拦 UA,得结合请求来源、行为特征和代理链路特性来设防——因为真实客户端 IP 往往被前置 CDN 或负载均衡掩盖,单纯依赖 %{HTTP_USER_AGENT} 容易误判或失效。
确认真实客户端 IP 是前提
反向代理下,%{REMOTE_ADDR} 通常是上游代理(如 Nginx、Cloudflare、ALB)的 IP,不是真实访客。必须先还原真实 IP,否则所有封禁都可能打偏:
- 确保上游代理在转发时设置了
X-Forwarded-For(或X-Real-IP),例如 Nginx 中加:proxy_set_header X-Real-IP $remote_addr; - 在 Apache 的
httpd.conf或虚拟主机配置中启用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,或用%{X-Forwarded-For}i做条件判断(注意:需校验头是否可信,避免伪造)
在 ProxyPass 前拦截恶意请求(推荐位置)
把过滤逻辑放在 ProxyPass 指令之前,可避免无效请求穿透到后端服务。使用 SetEnvIfNoCase + Deny from env=... 组合最轻量稳定:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 标记常见恶意 UA(含 SEO 工具与扫描器):
SetEnvIfNoCase User-Agent "(ahrefsbot|semrushbot|dotnetcurl|python-requests|go-http-client|masscan|sqlmap|nikto)" BAD_CRAWLER - 放行主流搜索引擎(保护收录):
SetEnvIfNoCase User-Agent "(Googlebot|Baiduspider|YandexBot|bingbot|Sogou)" GOOD_CRAWLER - 叠加空 Referer + 敏感路径双重验证(防 UA 伪装):
SetEnvIfNoCase Referer "^-$" EMPTY_REF<br>SetEnvIf Request_URI "(wp-login\.php|xmlrpc\.php|/admin/|/api/v1/.*\?id=|\.env$)" SENSITIVE_REQ<br>SetEnvIfExpr "env('EMPTY_REF') && env('SENSITIVE_REQ')" BAD_BEHAVIOR - 最终拒绝逻辑(允许 good_crawler,拒绝其余 bad 类型):
Order Allow,Deny<br>Allow from all<br>Deny from env=BAD_CRAWLER<br>Deny from env=BAD_BEHAVIOR<br>Allow from env=GOOD_CRAWLER
配合 fail2ban 对高频恶意 IP 持久封禁
仅靠 Apache 配置无法持久封 IP,且对突发扫描响应滞后。建议用 fail2ban 监控反向代理日志,自动拉黑:
- 确保 Apache 日志记录真实 IP,例如自定义日志格式:
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxycombined - 新建
/etc/fail2ban/filter.d/apache-proxy-scan.conf,匹配空 Referer + 扫描路径:[Definition]<br>failregex = ^<host> .*"(GET|POST) /(wp-login\.php|xmlrpc\.php|admin|\.env) HTTP</host>
- 在
jail.local中启用:[apache-proxy-scan]<br>enabled = true<br>logpath = /var/log/apache2/proxy-access.log<br>maxretry = 3<br>findtime = 600<br>bantime = 7200
注意反向代理特有的绕过风险
恶意爬虫常利用代理链路漏洞绕过规则:
- 不要仅依赖
X-Forwarded-For做白名单——该头可被客户端伪造;应只信任已知可信代理段(如上文RemoteIPTrustedProxy配置) - 若后端服务也做 UA 校验,需在反向代理层统一清洗或重写 UA,避免重复判断或冲突,例如:
RequestHeader set User-Agent "Apache-Proxy/1.0" early(慎用,可能影响业务逻辑) - 禁用不必要的 HTTP 方法(如 TRACE、TRACK),防止被用于探测:
TraceEnable off,并在<location></location>中限制:LimitExcept GET HEAD POST> deny from all









