apache本身不支持自动拦截闭环,需联动mod_security(实时规则拦截)、fail2ban(日志驱动ip封禁)、mod_rewrite(前置过滤标记)及mod_evasive/limitrequestbody(基础防护)共同实现。

Apache 本身不带自动拦截引擎,不能单靠配置文件就实现“识别→封禁→解封”的闭环。真正可行的自动拦截,是把 Apache 当作数据源和执行端,配合外部工具构建响应链。核心不是“Apache 能不能”,而是“怎么让 Apache 和其他工具一起动起来”。
用 mod_security 做开箱即用的实时规则拦截
这是最接近“开箱即用”的方案。mod_security 是 Apache 的 Web 应用防火墙模块,能深度解析请求头、参数、路径、UA 等字段,并按规则实时阻断。
典型配置示例(需启用 mod_security 和 OWASP CRS 规则集):
- 匹配已知扫描器 UA:SecRule REQUEST_HEADERS:User-Agent "@rx sqlmap|nikto|dirbuster" "id:1001,deny,status:403,msg:'Blocked scanner'"
- 拦截含危险参数的请求:SecRule ARGS_NAMES "@rx ^(cmd|exec|system|shell)$" "id:1002,deny,status:403,msg:'Dangerous param name'"
- 拒绝非法路径遍历:SecRule REQUEST_URI "@rx \.\./" "id:1003,deny,status:403,msg:'Path traversal attempt'"
首次上线建议先设为 SecRuleEngine DetectionOnly,观察日志是否误报;确认无误后再切为 On。规则调试必须结合 /var/log/modsec_audit.log 分析实际触发情况。
用 fail2ban + 自定义日志分析做高可靠 IP 封禁
这是生产环境最稳的方式:Apache 记录特征日志 → 脚本提取可疑行为 → fail2ban 读取并调用 iptables 封禁。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
关键三步:
-
扩展日志格式:在 httpd.conf 中定义含 UA、Referer、状态码、请求行的格式,例如:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" fingerprinted - 写轻量检测脚本(如每分钟运行一次):匹配空 Referer + 非主流 UA + 访问 .php/.jsp、或同一 IP 60 秒内扫 5 个含 ?id= 的 URL,输出 IP 到 /tmp/badips.log
- fail2ban 配置:新建 filter 匹配该日志,action 设为 iptables-multiport,封禁时长设 1 小时,自动解封
注意:若用 CDN 或反向代理,必须加载 mod_remoteip 并设置 RemoteIPHeader X-Forwarded-For,否则封的全是 CDN 节点 IP。
用 mod_rewrite 做前置静态过滤与标记
mod_rewrite 不能计数、不能封 IP,但它能快速过滤明确恶意模式,并为后续分析打标签。
- 直接返回 403:
RewriteCond %{QUERY_STRING} (cmd=|exec=|base64_decode) [NC]
RewriteRule ^ - [F] - 或只打标记供 fail2ban 提取:
RewriteCond %{QUERY_STRING} debug=true|token=[a-f0-9]{32} [NC]
RewriteRule ^ - [E=ATTACK:1]
再配合自定义 LogFormat 输出 %{ATTACK}e 字段,让 fail2ban 只盯这一列 - 避免误伤:加白名单条件,如 RewriteCond %{REQUEST_URI} !^/healthz 放行监控接口
所有 RewriteRule 必须以 RewriteEngine On 开头,且仅在允许重写的上下文(Directory/.htaccess)中生效。
用 LimitRequestBody 和 mod_evasive 补强基础防线
这两项不看特征,但能拦住大量低级攻击,是自动拦截体系的“压舱石”。
- LimitRequestBody:在上传目录块中设值,单位字节,建议比 PHP 的 post_max_size 大 100KB,例如 LimitRequestBody 10485760(10MB),超限直接 413,不进应用层
-
mod_evasive:配置 DOS 拦截阈值,如 DOSSiteInterval 1
DOSPageCount 2
DOSSiteCount 50,配合邮件通知或脚本联动,把高频 IP 推给 fail2ban 二次校验 - 两者都需 reload 生效,且要检查是否被 Nginx 或 ModSecurity 提前拦截——它们可能抢在 Apache 动作前就返回 413










