apache需借助mod_evasive或mod_qos实现ip段连接数限制:前者支持通配符黑名单(如192.168.100.*),后者支持cidr精确限流(如10.20.30.0/24限5并发),并须配置x-forwarded-for透传与remoteipvalve确保真实ip识别。

Apache本身不直接支持按IP段限制连接数,需结合mod_evasive或mod_qos等第三方模块实现。Java应用通常部署在Tomcat等容器中,若想在Web服务器层(如Apache HTTP Server)对特定IP段做连接数控制,核心思路是:在Apache前置层识别来源IP、匹配网段、动态限流。以下为可落地的配置实践。
启用mod_evasive并配置IP段白名单/黑名单
mod_evasive原生支持IP黑名单和简单阈值控制,但默认不区分网段。可通过脚本+DOSEnabled配合DOSPageCount/DOSSiteCount实现粗粒度IP段拦截:
- 安装后启用模块:
a2enmod evasive(Debian/Ubuntu)或手动加载LoadModule evasive20_module modules/mod_evasive20.so - 在
httpd.conf或虚拟主机中添加:<ifmodule evasive20_module> DOSHashTableSize 3097 DOSPageCount 20 # 同一页面1秒内超20次即触发 DOSSiteCount 100 # 全站1秒内超100次请求即触发 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 600 # 封禁600秒 DOSLogDir "/var/log/apache2/evasive" # 拦截指定IP段(例如192.168.100.0/24) <strong>DOSWhitelist 127.0.0.1</strong><strong>DOSBlacklist 192.168.100.*</strong> </ifmodule>
- 注意:
DOSBlacklist支持通配符(如192.168.100.*),但不支持CIDR写法;如需精确匹配/24网段,建议用mod_qos替代
使用mod_qos实现基于CIDR的连接数限制
mod_qos功能更细粒度,支持按源IP CIDR设置并发连接上限,适合Java应用前置Apache的场景:
- 编译安装
mod_qos(官网下载源码,apxs -c -i mod_qos.c),然后加载模块 - 配置示例(限制10.20.30.0/24网段最多5个并发连接):
<ifmodule qos_module> # 启用QoS策略 QS_SrvMaxConnPerIP 50 # 全局单IP最大连接数 QS_SrvMaxConn 200 # 全局总连接数 <h1>针对特定网段:10.20.30.0/24 → 最多5并发</h1> <p><strong>QS_SrvMaxConnPerIP 5 "10.20.30.0/24"</strong></p> <h1>可叠加规则:对192.168.0.0/16放宽至20并发</h1> <p><strong>QS_SrvMaxConnPerIP 20 "192.168.0.0/16"</strong></p> <h1>拒绝恶意扫描(User-Agent含sqlmap/nikto等)</h1> <p>QS_ForceResponseCode 403 "sqlmap|nikto|wvs" </p></ifmodule>
- 关键点:确保Apache开启
UseCanonicalName Off,且真实客户端IP已通过X-Forwarded-For正确传递(尤其后端是Tomcat时,需在ProxyPass中配置RequestHeader set X-Real-IP %{REMOTE_ADDR}e)
与Java应用协同:透传IP并避免代理污染
若Apache作为反向代理(mod_proxy)转发到Tomcat,必须确保原始IP不被覆盖,否则限流规则失效:
- Apache侧配置(在
VirtualHost中):ProxyPreserveHost On RequestHeader set X-Real-IP %{REMOTE_ADDR}e RequestHeader set X-Forwarded-For %{REMOTE_ADDR}e RequestHeader set X-Forwarded-Proto "https" - Tomcat侧(
server.xml中Connector)启用远程IP解析:<valve classname="org.apache.catalina.valves.RemoteIpValve" remoteipheader="X-Forwarded-For" protocolheader="X-Forwarded-Proto" internalproxies="127\.0\.0\.1|10\.20\.30\.\d+"></valve>
→ 此处internalProxies需填入Apache所在服务器IP段,确保只信任来自该网段的X-Forwarded-For - Java代码中获取真实IP应使用
request.getRemoteAddr()(经RemoteIpValve处理后已替换为真实客户端IP)
验证与日志监控
配置生效后需快速验证是否按预期拦截,并持续观测异常流量:
- 用
ab或wrk模拟攻击:ab -n 100 -c 20 http://your-domain.com/test.jsp(从受限网段发起) - 检查Apache错误日志:
tail -f /var/log/apache2/error.log | grep -i "qos\|evasive" - 查看
mod_qos状态页(启用QS_Status后访问/qos)可实时看到各IP段连接数统计 - 对高频受限IP,可结合
fail2ban自动加入系统防火墙(如iptables)实现持久封禁
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










