mod_evasive 才能有效限流 post/put 请求,需通过 setenvif 标记请求并配置 dos_enabled 环境变量触发限流,配合 dospagecount、dospageinterval 和 dossystemcommand 实现精准防护。

为什么 LimitRequestFields 和 LimitRequestFieldSize 不能用来限流 POST/PUT 请求
这两个指令管的是 HTTP 请求头的数量和单个头长度,不是请求方法或频率。想靠它们拦住恶意 POST 洪水?完全无效。真正要控制的是「单位时间内的某类请求次数」,得用模块级限流能力。
用 mod_ratelimit 还是 mod_evasive?选错就白配
mod_ratelimit 是带宽限速(按字节/秒),不识别请求方法;mod_evasive 才是专治高频请求的——它能基于客户端 IP + URI + 方法做组合判断。实战中必须启用 DOSEnabled 并设置 DOSPageInterval 和 DOSPageCount,否则默认只防 GET 页面刷屏,对 POST/PUT 视而不见。
-
DOSPageCount 5:1 秒内同一 URI 被访问超 5 次即触发 -
DOSSiteCount 50:1 秒内同一 IP 总请求数超 50 就拉黑 -
DOSSystemCommand "iptables -I INPUT -s %s -j DROP":配合系统防火墙硬拦截(需 root 权限) - 注意:
DOSSiteCount默认不区分方法,如需单独控 POST,得配合LocationMatch+SetEnvIf
如何只对 POST /api/v1/submit 做方法级限流
Apache 本身没原生「按 method + path 限频」指令,得靠环境变量 + mod_evasive 的条件触发。核心思路:用 SetEnvIf 标记匹配的请求,再让 mod_evasive 只对这个环境变量生效。
SetEnvIf Request_Method ^POST$ is_post
SetEnvIf Request_URI ^/api/v1/submit$ is_submit_api
SetEnvIf is_post 1 is_post_submit
<location>
SetEnvIf Request_Method "POST" evasive_post_target
</location>
然后在 mod_evasive 配置里加:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
DOSWhitelist 127.0.0.1
DOSEnabled on
DOSPageCount 3
DOSPageInterval 10
DOSLogDir "/var/log/mod_evasive"
# 关键:只对带 evasive_post_target 环境变量的请求生效
<ifmodule mod_setenvif.c>
SetEnvIf evasive_post_target 1 DOS_ENABLED
</ifmodule>
这样,只有 POST 到 /api/v1/submit 的请求才会被纳入限流计数,其他方法或路径完全不受影响。
配置后收不到 403 却看到大量 503?检查 DOSBlockingPeriod 和日志路径权限
mod_evasive 默认返回 403,但如果你看到 503,说明触发了 DOSSystemCommand 后又因 iptables 规则未生效或网络层丢包,导致后续请求直接超时。更常见的问题是:
-
DOSLogDir目录不存在或 Apache 用户(如 www-data)无写权限 → 限流逻辑静默失效 -
DOSBlockingPeriod设太短(如 10 秒),攻击者稍等就恢复,起不到压制作用;设太长(>600)又可能误伤正常用户重试 - 没有配
DOSWhitelist,本地调试时把自己 IP 也封了 - SELinux 或 systemd 的 PrivateTmp=true 导致日志目录实际不可写
真正起效前,先手动 curl 几次目标接口,立刻检查 /var/log/mod_evasive/ 下是否有对应 IP 的临时文件生成 —— 这比看响应码更可靠。









