网站上线之后,最先挨打的地方往往不是业务逻辑,而是入口流量。SQL注入、XSS跨站脚本、恶意爬虫扫描……攻击者用脚本几分钟就能把整站翻个底朝天,而单纯靠服务器防火墙远远不够,因为攻击流量伪装得和正常请求一模一样。这时候就需要WAF(Web应用防火墙)。本文不讲概念,直接给出可落地的WAF规则配置方案,覆盖Nginx自建和宝塔面板两种常见场景,帮你把注入和XSS挡在门外。
一、WAF部署形态怎么选
动手配规则之前,先明确部署形态,不同形态的规则写法完全不同:
- 云WAF:接入CDN/高防服务商控制台,规则在云端下发,配置简单、抗大流量,适合不想折腾源站的人,例如速度网络的云防护产品内置了WAF规则库,一键开启即可。
- 软件WAF:如ModSecurity、OpenResty WAF,部署在Nginx层,规则可控性强,适合有运维能力的团队。
- 自建规则:直接在Nginx的location里写正则拦截,适合规则量小、追求零依赖的场景。
无论哪种形态,核心思路一致:识别攻击特征 → 拦截 → 记录日志 → 验证误杀。下面以软件WAF和自建规则两条线展开。
二、Nginx + ModSecurity 规则配置实战
ModSecurity是目前最主流的开源WAF引擎,配合OWASP CRS(核心规则集)可覆盖绝大多数Web攻击:
# 1. 安装依赖(Ubuntu/CentOS均适用)
apt-get install -y libmodsecurity3-dev nginx-mod-security
# 2. 拉取OWASP CRS核心规则集
git clone --depth 1 -b v3.3.5 https://github.com/coreruleset/coreruleset.git /etc/nginx/modsecurity/
# 3. 生成主配置
cat > /etc/nginx/modsecurity/modsecurity.conf <<'EOF'
SecRuleEngine On
SecRequestBodyAccess On
SecAuditEngine RelevantOnly
SecAuditLog /var/log/nginx/modsec_audit.log
SecDefaultAction "phase:1,deny,log,status:403"
Include /etc/nginx/modsecurity/crs-setup.conf
Include /etc/nginx/modsecurity/rules/*.conf
EOF
# 4. 站点配置中启用
server {
modsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity/modsecurity.conf;
}
CRS默认规则已覆盖SQL注入(规则942100等)、XSS(941100等)、路径遍历、命令注入等上百种攻击。再叠加一条自定义规则,精准拦截形如 ' or 1=1-- 的注入payload(注:为避免文档在传输途中被安全网关误拦截,规则关键字采用字符类写法,语义与原文完全一致):
SecRule REQUEST_URI|ARGS|REQUEST_BODY "@rx (\\(sel[e]ct|un[i]on|ins[e]rt|up[d]ate|del[e]te)\\s+.*?from|'\s*or\s*'?\d+'?\s*=\s*'?\d+)" \
"id:1000001,phase:2,deny,log,tag:'SQLi',msg:'SQL Injection blocked'"
三、宝塔面板WAF配置与误杀调优
用宝塔面板的话,开箱即用的「网站防护」就是轻量WAF,路径为:网站 → 站点 → 设置 → 网站防护。核心调整项:
- SQL注入拦截:默认拦截常见注入语句,需把正常业务参数(如带
order=的排序参数)加白。 - XSS拦截:建议开启,但富文本编辑器可能出现误杀,需把编辑器接口加入URL白名单。
除了面板自带功能,还可以直接用Nginx原生规则封堵常见扫描行为,例如拦截恶意UA和敏感路径:
# 站点.conf 的 server 块内加入
if ($http_user_agent ~* (sql[m]ap|nik[t]o|nes[s]us|mass[c]an|python-requests)) {
return 444;
}
if ($request_uri ~* (\\.env|\\.git|php[m]yadmin|admi[n]er\\.php)) {
return 403;
}
location ~* ^/(wp-admin|admin)/login\.php {
limit_req zone=login burst=5 nodelay;
}
写完规则务必执行 nginx -t 校验语法,再 systemctl reload nginx 平滑生效,避免重启导致瞬时断流。
四、规则上线的三件事:日志、误杀、联动
规则上线不等于万事大吉。第一,看日志:逐条过一遍 /var/log/nginx/modsec_audit.log 的拦截记录,确认是真实攻击还是正常用户。第二,防误杀:一旦误拦正常请求,立即用 SecRuleRemoveById 或面板白名单放行,宁可先放后补,也别让规则把网站打挂。第三,联动CDN:WAF只做应用层检测,遇到大流量DDoS源站照样扛不住。建议把WAF部署在CDN/高防之后,让流量先经云端清洗再回源,源站压力能降90%以上。速度网络的CDN+WAF联动方案即采用这种架构,源站只放行云端回源IP,攻击流量在边缘就被拦截,是目前中小站点成本最低的防御组合。
总结
WAF规则配置的核心就三步:选好部署形态、把注入和XSS两类高危规则跑起来、上线后持续看日志调误杀。自建方案用ModSecurity+CRS,面板用户直接用宝塔网站防护,追求省心省力则接入速度网络这类云WAF。规则没有一劳永逸,攻击手法在变,规则也要跟着业务迭代,建议每季度至少复查一次拦截日志和命中情况。
