apache通过mod_proxy配置反向代理可提升后端抗dos/ddos能力,核心是限制连接生命周期、控制请求头数量与长度、启用mod_evasive限流、清洗可疑请求头,并配合waf、iptables及后端加固形成纵深防御。

Apache 本身不是专为代理防护设计的,但作为反向代理(配合 mod_proxy)时,可通过合理配置显著提升后端服务抗拒绝服务(DoS/DDoS)能力。关键不在于“让 Apache 拦住所有攻击”,而在于限制恶意流量抵达后端前的资源消耗、控制连接行为、过滤异常请求特征。
以下配置策略聚焦实用、可落地、且经生产验证的有效手段:
启用并加固 mod_proxy 与连接控制
确保启用必要模块:mod_proxy、mod_proxy_http、mod_ratelimit(可选)、mod_headers(用于清理/标记)。禁用非必需模块如 mod_proxy_ftp 或 mod_proxy_connect(除非明确需要)。
在代理配置段中强制约束连接生命周期:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
缩短超时:设置
ProxyTimeout 10,避免后端无响应时 Apache 连接长期挂起 -
限制并发连接数:用
MaxRequestWorkers 150(根据内存调整)+ServerLimit 16控制总进程/线程规模,防资源耗尽 -
关闭 KeepAlive 到后端:添加
ProxySet keepalive=off,避免后端复用连接被滥用;若后端支持 HTTP/2,可单独评估开启
用 LimitRequest* 系列指令堵住头部类攻击入口
攻击者常通过发送数百个空 Header(如 X-Foo-001: a)触发 Apache 内存分配膨胀。此行为在代理场景下同样生效,且会透传到后端或直接压垮 Apache 自身。
-
限制头数量:全局配置
LimitRequestFields 40(默认 100 不安全),放于httpd.conf主配置顶层,不可写在.htaccess -
限制单个头长度:配
LimitRequestFieldSize 2048,防超长 Cookie 或自定义 Token 带来的栈溢出风险 -
限制请求行长度:设
LimitRequestLine 8190,防畸形长 URL 攻击
对客户端请求做轻量级速率与连接数控制
Apache 原生不支持精细限流,但可借助 mod_evasive 实现基础防护,适合应对 HTTP Flood 类攻击:
- 安装后启用模块,配置示例:
<ifmodule mod_evasive20.c><br> DOSPageCount 3<br> DOSSiteCount 50<br> DOSPageInterval 1<br> DOSSiteInterval 1<br> DOSBlockingPeriod 10<br> DOSLogDir "/var/log/mod_evasive"<br></ifmodule>
表示:1 秒内同一页面请求 ≥3 次,或全站请求 ≥50 次,即封 10 秒 - 注意:该模块作用于 Apache 接收请求阶段,**在代理转发之前生效**,能有效减少无效请求抵达后端
剥离/重写可疑请求头,降低后端解析负担
某些攻击依赖伪造或冗余头(如重复 Content-Length、超长 User-Agent、可疑 X-Forwarded-For 格式),可在代理层清洗:
- 用
RequestHeader unset移除非必要头:RequestHeader unset X-Forwarded-Host、RequestHeader unset Proxy - 用
RequestHeader edit截断过长字段:RequestHeader edit User-Agent ^(.{0,255}).*$ $1 - 禁止客户端设置某些敏感头:
RequestHeader setifempty Accept-Encoding ""防绕过压缩
配合外部防护形成纵深防御
Apache 代理层的能力有限,真正高强的防护需分层协同:
- 前置 WAF/CDN:Cloudflare、阿里云 WAF 或 ModSecurity(嵌入 Apache)负责识别 SQLi/XSS/扫描器特征,过滤大部分应用层攻击
-
系统级连接限制:用
iptables或nftables限制单 IP 新建连接速率,例如:iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP -
后端自身加固:确保后端服务(如 Node.js、Python Flask)也设置了请求体大小(
body-parser limit)、超时、队列深度等,避免代理层拦截后仍被击穿










