WAF(Web Application Firewall,Web应用防火墙)是保护Web服务免受SQL注入、XSS跨站脚本、CC攻击等威胁的重要屏障。nginx凭借其高性能和灵活的模块化架构,成为部署WAF的理想载体。本文将系统讲解在nginx上构建WAF防护体系的完整方案,包括主流工具选型、核心配置技巧以及常见问题的处理方法。

一、理解WAF的工作原理与防护目标
WAF的核心思想是在客户端与Web应用之间充当过滤层,对所有进出流量进行深度检测。与传统的网络层防火墙不同,WAF工作在HTTP应用层,能够理解请求的方法、头部、参数、请求体等语义内容,从而识别出伪装成正常流量的恶意请求。
对于nginx来说,实现WAF能力主要有三条路径:一是直接集成ModSecurity这类成熟的WAF引擎;二是使用轻量级的第三方模块如Naxsi;三是通过OpenResty平台借助Lua脚本自行编写防护逻辑。三种方案各有优劣,ModSecurity规则体系最完善,Naxsi资源占用最低,OpenResty则最灵活,可以根据实际业务规模进行选择。
防护目标通常包括:拦截SQL注入与XSS payload、限制异常的高频访问(CC攻击)、阻止恶意爬虫与扫描器、检测文件上传漏洞利用、以及隐藏后端服务器的真实信息。明确这些目标后,才能有针对性地配置规则,避免误杀正常用户。
二、基于ModSecurity的完整部署方案
ModSecurity是目前最主流的开源WAF引擎,配合OWASP CRS(Core Rule Set)规则集可以覆盖绝大多数已知攻击类型。下面以编译安装的方式演示如何将其集成到nginx中。
1. 编译安装ModSecurity模块
首先安装依赖并编译ModSecurity v3的连接器,然后将其作为动态模块加入nginx:
# 安装依赖 yum install -y gcc make automake libtool pcre-devel libxml2-devel curl-devel yajl-devel # 编译ModSecurity库 git clone https://github.com/owasp-modsecurity/ModSecurity.git cd ModSecurity git submodule init git submodule update ./build.sh && ./configure && make && make install # 编译nginx连接器并集成 git clone https://github.com/owasp-modsecurity/ModSecurity-nginx.git cd nginx-1.24.0 ./configure --add-dynamic-module=../ModSecurity-nginx --with-compat make modules cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/
2. 加载模块并配置规则集
编译完成后,在nginx配置中加载模块,并引入OWASP CRS规则:
# nginx.conf 顶部加载动态模块
load_module modules/ngx_http_modsecurity_module.so;
http {
server {
listen 80;
server_name www.ipipp.com;
# 开启ModSecurity引擎,先使用检测模式观察
modsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity/modsecurity.conf;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
}modsecurity.conf中建议先设置SecRuleEngine DetectionOnly,观察一段时间日志确认无误杀后再切换为On。规则集的引入方式如下:
# 在modsecurity.conf中引入CRS规则 Include /etc/nginx/modsecurity/crs-setup.conf Include /etc/nginx/modsecurity/rules/*.conf
三、轻量级方案:Naxsi与原生限流配置
如果服务器资源有限,或只需要基础防护,可以考虑Naxsi模块。它采用白名单机制,默认拒绝所有包含可疑模式的请求,再由管理员逐步放行合法参数,非常适合对性能敏感的场景。
# Naxsi基础配置示例
http {
upstream jetty { server 127.0.0.1:8080; }
server {
listen 80;
location / {
# 开启Naxsi学习模式,记录但不拦截
LearningMode;
SecRulesEnabled;
DeniedUrl "/50x.html";
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$XSS >= 8" BLOCK;
proxy_pass http://jetty;
}
}
}除了专用模块,nginx原生的限流指令也能有效缓解CC攻击。通过limit_req_zone定义请求速率限制,配合limit_conn_zone限制并发连接数,可以拦截绝大多数高频刷接口的行为:
# http块中定义限流区域
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
location /api/ {
# 突发流量允许排队,超出则返回503
limit_req zone=req_limit burst=20 nodelay;
limit_conn conn_limit 20;
proxy_pass http://backend;
}
}黑白名单也是常用的辅助手段。对于已知的恶意IP段或扫描器UA,可以直接用geo模块配合if判断进行拦截;对可信的管理后台IP则设置白名单放行。建议将黑名单外置为文件,通过include引入,方便脚本自动更新。
四、常见问题与注意事项
误杀问题是WAF配置中最常见的困扰。例如富文本编辑器提交的内容天然包含HTML标签,容易被XSS规则命中。解决办法是为特定URL设置规则排除,例如:
# 对后台编辑接口排除XSS检测规则
<LocationMatch "^/admin/edit">
SecRuleRemoveById 941100-941999
</LocationMatch>性能影响不容忽视。开启完整CRS规则集后,nginx的处理延迟可能上升。建议开启规则集自带的性能评分规则,将高开销规则调整到最低检测等级,同时利用modsecurity_rules_file按location粒度拆分规则,静态资源路径可以完全关闭检测。
日志管理同样重要。ModSecurity的审计日志增长很快,务必配置logrotate轮转,并定期分析拦截日志,及时补充业务专属规则。排查问题时可临时将SecDebugLogLevel调高,定位完毕后立即调回,避免影响性能。
- 上线前务必经历检测模式观察期,通常一到两周为宜
- 规则集要定期更新,OWASP CRS会持续修复绕过漏洞
- 不要只依赖WAF,应与系统加固、参数化查询等手段形成纵深防御
- 重要接口建议叠加验证码或Token校验,防止单点规则被绕过
总结来说,nginx上的WAF防护没有一劳永逸的配置,需要结合业务特点持续调优。从ModSecurity的完整规则体系到原生的限流手段,多层次的组合防护才能有效抵御不断演变的Web攻击。
nginx WAF配置Web应用防火墙ModSecurity修改时间:2026-08-31 01:30:45