apache自身不支持请求特征指纹识别,但可通过mod_evasive+自定义日志分析脚本+fail2ban构建“采集→分析→封禁→清理”闭环:先扩展logformat记录ua/referer等字段,再用脚本提取空referer+异常ua等恶意特征并输出ip至临时文件,由fail2ban匹配封禁,同时需启用mod_remoteip、避免mod_evasive替代指纹分析、设置iptables白名单及定期解封。

Apache 本身不内置“请求特征指纹”识别能力(如 User-Agent 异常、Referer 缺失、URL 参数模式、请求头组合等),但可通过 mod_evasive + 自定义日志分析脚本 + fail2ban 三者协同,在 Apache 层实现基于行为特征的动态 IP 黑名单自动拦截。关键不是单靠 Apache 配置,而是构建“采集 → 分析 → 封禁 → 清理”的闭环。
第一步:让 Apache 记录足够细的请求特征日志
默认 combined 日志不够用,需扩展字段,暴露可用于指纹识别的关键信息:
- 在 httpd.conf 或 VirtualHost 中定义自定义日志格式,包含:
%{User-Agent}i、%{Referer}i、%r(完整请求行)、%{X-Forwarded-For}i(配合 mod_remoteip 获取真实 IP) - 示例配置:
<ifmodule log_config_module> LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D" fingerprinted CustomLog /var/log/apache2/access_fingerprint.log fingerprinted </ifmodule> - 若使用 CDN 或反向代理,必须启用
mod_remoteip并设置RemoteIPHeader X-Forwarded-For,否则所有请求都显示为 CDN 节点 IP
第二步:用脚本提取高风险请求指纹并输出可疑 IP
写一个轻量 Python 或 Bash 脚本(例如每分钟执行一次),扫描最新日志,匹配典型恶意特征:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 常见可量化指纹示例:
- 空 Referer + 非主流 UA(如不含 Chrome/Firefox/Safari/Edge 字样)且访问 .php/.asp/.jsp 等敏感后缀
- 同一 IP 在 60 秒内请求 ≥5 个不同 URL,且路径含
?id=、?page=、/wp-、/admin/等扫描关键词 - User-Agent 为已知爬虫黑名单(如 sqlmap、nikto、dirbuster、masscan)或为空/超长乱码
- 请求中 Host 头与 ServerName 不符,或含非法字符
- 脚本输出格式建议为一行一 IP,追加到临时文件(如
/tmp/suspicious_ips.log),便于 fail2ban 读取 - 避免实时解析全量日志:只 tail -n 1000 或用 journalctl -u apache2 --since "1 minute ago"
第三步:用 fail2ban 关联日志与封禁动作
fail2ban 是衔接 Apache 日志与系统级封禁(iptables 或 nftables)的核心桥梁:
- 新建 jail 配置(如
/etc/fail2ban/jail.d/apache-fingerprint.conf):[apache-fingerprint] enabled = true filter = apache-fingerprint logpath = /tmp/suspicious_ips.log maxretry = 1 findtime = 60 bantime = 3600 action = iptables[name=ApacheFinger, port=http,protocol=tcp]
- 新建 filter(
/etc/fail2ban/filter.d/apache-fingerprint.conf),正则匹配你脚本输出的 IP:[Definition] failregex = ^<host>$ ignoreregex = </host>
- 重启 fail2ban:systemctl restart fail2ban;它会自动读取新 IP 并调用 iptables 封禁
第四步:补充防御与避坑要点
仅靠上述流程还不够稳健,需注意几个硬性约束:
- 不要依赖 mod_evasive 做指纹识别:它只统计频率和 URI,无法解析 UA/Referer/参数内容;把它保留用于基础 QPS 过载防护(如防 CC),而非特征识别
- 封禁必须跨进程生效:iptables 封禁天然全局,而 mod_evasive 的内存黑名单在 prefork MPM 下各子进程独立,攻击者轮询即可绕过
- 白名单优先级高于所有动态封禁:在 iptables 规则链中,把运维网段(如 192.168.10.0/24)的 ACCEPT 规则放在 fail2ban 插入的 DROP 规则之前,防止误伤
-
定期清理长期误封 IP:可加 cron 每日扫描 /var/log/fail2ban.log,对连续 7 天未再触发的 IP 执行
fail2ban-client set apache-fingerprint unbanip xxx.xxx.xxx.xxx









