如何利用Apache配置实现基于请求特征的动态IP封禁策略实战教程?
- 内容介绍
- 文章标签
- 相关推荐
本文共计863个文字,预计阅读时间需要4分钟。
Apache 本身不支持基于请求特征(例如特定 +User-Agent、Referer、URL 参数、请求路径、HTTP 方法异常等)的自动化处理。
用 mod_evasive + 自定义日志解析做轻量级动态封禁
mod_evasive 只按请求频率封 IP,但可以配合 Apache 日志做二次判断。关键在于让它记录可疑行为,再用脚本提取 IP 并写入封禁逻辑:
- 在 Apache 配置中开启详细日志,记录 User-Agent、Request_URI、status 等字段,例如:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" custom - 配置 mod_evasive 启用邮件通知:
DOSEmailNotify admin@example.com,并在该邮箱触发的脚本中解析日志,匹配如 "GET /wp-login.php"、"POST /xmlrpc.php"、"User-Agent: sqlmap" 等特征行,提取源 IP - 脚本将匹配到的 IP 追加进一个临时黑名单文件(如 /etc/apache2/blocked_by_rule.conf),内容为:
Require not ip 192.168.5.100
Require not ip 203.0.113.44/24 - 在 VirtualHost 中 Include 该文件,并用 systemctl reload apache2 热加载(无需 full restart)
用 mod_security 实现真正的请求特征识别与实时拦截
这是最接近“开箱即用”的方案。mod_security 是 Apache 的 WAF 模块,支持基于规则的请求深度检测,并可直接阻断 + 记录 IP:
- 启用 mod_security 后,在规则集(如 OWASP CRS)基础上自定义规则,例如:
SecRule REQUEST_HEADERS:User-Agent "@rx sqlmap|nikto" "id:1001,deny,log,msg:'Blocked scanner UA',setvar:ip.blocked=1,expirevar:ip.blocked=3600" - 再配一条规则,对已标记的 IP 拒绝后续所有请求:
SecRule IP:BLOKED "@eq 1" "id:1002,deny,status:403,msg:'IP blocked by rule'" - 若需持久化黑名单(重启不丢失),可配合 SecAction 调用外部脚本,把 IP 写入 iptables 或 fail2ban 的 jail
- 注意:mod_security 规则调试成本较高,建议先开启 SecRuleEngine DetectionOnly 模式观察日志效果
用日志轮询 + fail2ban 构建高可靠动态封禁
这是生产环境最推荐的方式——解耦识别与封禁,稳定、可审计、支持跨服务联动:
- 在 Apache 的 ErrorLog 或 CustomLog 中输出明确的标记,例如在 .htaccess 或 mod_rewrite 中加入:
RewriteCond %{HTTP_USER_AGENT} sqlmap [NC]
RewriteRule ^ - [F,E=badbot:1]
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{badbot}e" botlog - 配置 fail2ban 的 jail.local:
[apache-badbot]
enabled = true
filter = apache-badbot
logpath = /var/log/apache2/access.log
maxretry = 1
bantime = 86400 - 编写对应 filter(/etc/fail2ban/filter.d/apache-badbot.conf),匹配日志中的 badbot=1 字段,提取 %h
- fail2ban 默认调用 iptables 封禁,比 Apache 层封禁更底层、更彻底,且不会产生 403 日志噪音
单纯靠修改 httpd.conf 或 .htaccess 写死 Require not ip,只能做静态封禁;要响应请求特征,就得让 Apache “看见”特征(mod_security)、“记录”特征(日志)、再由外部工具“决策并执行”(fail2ban/script)。三者选其一,看你的运维复杂度容忍和安全等级要求。
本文共计863个文字,预计阅读时间需要4分钟。
Apache 本身不支持基于请求特征(例如特定 +User-Agent、Referer、URL 参数、请求路径、HTTP 方法异常等)的自动化处理。
用 mod_evasive + 自定义日志解析做轻量级动态封禁
mod_evasive 只按请求频率封 IP,但可以配合 Apache 日志做二次判断。关键在于让它记录可疑行为,再用脚本提取 IP 并写入封禁逻辑:
- 在 Apache 配置中开启详细日志,记录 User-Agent、Request_URI、status 等字段,例如:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" custom - 配置 mod_evasive 启用邮件通知:
DOSEmailNotify admin@example.com,并在该邮箱触发的脚本中解析日志,匹配如 "GET /wp-login.php"、"POST /xmlrpc.php"、"User-Agent: sqlmap" 等特征行,提取源 IP - 脚本将匹配到的 IP 追加进一个临时黑名单文件(如 /etc/apache2/blocked_by_rule.conf),内容为:
Require not ip 192.168.5.100
Require not ip 203.0.113.44/24 - 在 VirtualHost 中 Include 该文件,并用 systemctl reload apache2 热加载(无需 full restart)
用 mod_security 实现真正的请求特征识别与实时拦截
这是最接近“开箱即用”的方案。mod_security 是 Apache 的 WAF 模块,支持基于规则的请求深度检测,并可直接阻断 + 记录 IP:
- 启用 mod_security 后,在规则集(如 OWASP CRS)基础上自定义规则,例如:
SecRule REQUEST_HEADERS:User-Agent "@rx sqlmap|nikto" "id:1001,deny,log,msg:'Blocked scanner UA',setvar:ip.blocked=1,expirevar:ip.blocked=3600" - 再配一条规则,对已标记的 IP 拒绝后续所有请求:
SecRule IP:BLOKED "@eq 1" "id:1002,deny,status:403,msg:'IP blocked by rule'" - 若需持久化黑名单(重启不丢失),可配合 SecAction 调用外部脚本,把 IP 写入 iptables 或 fail2ban 的 jail
- 注意:mod_security 规则调试成本较高,建议先开启 SecRuleEngine DetectionOnly 模式观察日志效果
用日志轮询 + fail2ban 构建高可靠动态封禁
这是生产环境最推荐的方式——解耦识别与封禁,稳定、可审计、支持跨服务联动:
- 在 Apache 的 ErrorLog 或 CustomLog 中输出明确的标记,例如在 .htaccess 或 mod_rewrite 中加入:
RewriteCond %{HTTP_USER_AGENT} sqlmap [NC]
RewriteRule ^ - [F,E=badbot:1]
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{badbot}e" botlog - 配置 fail2ban 的 jail.local:
[apache-badbot]
enabled = true
filter = apache-badbot
logpath = /var/log/apache2/access.log
maxretry = 1
bantime = 86400 - 编写对应 filter(/etc/fail2ban/filter.d/apache-badbot.conf),匹配日志中的 badbot=1 字段,提取 %h
- fail2ban 默认调用 iptables 封禁,比 Apache 层封禁更底层、更彻底,且不会产生 403 日志噪音
单纯靠修改 httpd.conf 或 .htaccess 写死 Require not ip,只能做静态封禁;要响应请求特征,就得让 Apache “看见”特征(mod_security)、“记录”特征(日志)、再由外部工具“决策并执行”(fail2ban/script)。三者选其一,看你的运维复杂度容忍和安全等级要求。

