Nginx WAF 规则配置实战:手把手搭建网站应用防火墙

网站被入侵,十有八九不是被黑客”单独关照”,而是常见的 Web 漏洞被自动化扫描工具批量扫到。SQL 注入、XSS、命令注入……这类攻击单次流量不大、特征却非常明显,恰好是 WAF(Web 应用防火墙)最擅长拦截的对象。本文不扯虚的,直接基于 Nginx 从零配置一套可落地的 WAF 规则,覆盖注入过滤、CC 限速、黑白名单三个核心场景,全部代码可直接复制使用。

一、先搞清楚:WAF 到底在拦什么

WAF 工作在应用层(七层),通过正则规则匹配 HTTP 请求的 URL、Header 和 Body,命中特征即拦截或告警。日常防护中最常见的拦截对象有这几类:

  • SQL 注入:联合查询、延时盲注、元数据库读取等手法的特征串;
  • XSS 跨站脚本:script 标签、事件属性、伪协议等特征;
  • 命令注入:系统命令拼接、特殊符号组合等特征;
  • 扫描器指纹:UA 携带 sqlmap、masscan 等工具的标识;
  • CC 高频请求:单 IP 在短时间内发起大量请求,拖垮 CPU 与数据库连接。

理解了拦截对象,配置规则时才知道每条规则写的是什么、防的是什么。下一节先讲方案选型,再上配置。

二、方案选型:自建 WAF 与云 WAF 如何配合

自建 WAF 适合单台或少数几台服务器,常见选择是宝塔面板内置的 Nginx 防火墙,或者开源的 ngx_waf 模块;云 WAF(如速度网络的网站防护服务)则把规则库和清洗带宽放在云端,规则实时更新,能扛住大流量攻击。两者并不冲突,推荐组合是云 WAF 在前、自建规则兜底:云侧负责大流量清洗和基础拦截,源站侧规则负责纵深防御,即使云侧被绕过,源站还有一道保险。对单台服务器的小站点来说,先把自建方案做好;对流量大、业务重要的站点,建议直接上云防护。

三、实战一:宝塔面板开启 WAF 并配置防护规则

宝塔面板的 Nginx 防火墙是最容易上手的一步,全程图形化操作,适合没有太多安全经验的站长:

  1. 进入宝塔面板 → 网站 → 选择站点 → Nginx 防火墙
  2. 打开”防火墙总开关”,勾选启用SQL 注入、XSS、命令注入等拦截项;
  3. 在”URL 关键词过滤”中填入需要屏蔽的关键词,例如对不提供海外访问的站点,可拦截 wp-login.php 的境外 IP 访问;
  4. 开启 CC 防御:设置单 IP 每 60 秒最多 120 次请求,超限封禁 600 秒,阈值可按站点正常流量动态调整;
  5. 在”全局日志”中观察拦截记录,确认无业务误伤后再逐步收紧规则。

这套配置 5 分钟就能完成,适合给网站做第一层基础防护。想要更细的规则控制,继续看下面的 ngx_waf 实战。

四、实战二:ngx_waf 模块自定义规则

ngx_waf 是开源的高性能 Nginx WAF 模块,支持自定义规则文件。编译 Nginx 时加入该模块,或在 Nginx 配置中动态加载,然后在 http 块开启:

load_module modules/ngx_http_waf_module.so;

http {
    waf on;
    waf_mode !cc !extra;      # 开启除 CC 外的全部规则
    waf_cc_deny on;
    waf_cc_rate 10r/m;        # 单 IP 每分钟 10 次,超限自动封禁
    waf_cache 20m;
    waf_rule_path /etc/nginx/waf/rules/;
    waf_under_attack on;      # 开启攻击模式
}

规则文件放在 /etc/nginx/waf/rules/ 目录下,先看 SQL 注入规则 sqli.rule 的核心两行:

# /etc/nginx/waf/rules/sqli.rule
SecRule ARGS "union[^a-z]+select" "deny"
SecRule ARGS "sleep\s*\(" "deny"

第一行拦截联合查询注入,第二行拦截延时盲注。其余常见特征(元数据库名、十六进制编码等)可按同样格式继续追加,每行一条规则、命中即拒绝,格式清晰也方便维护。

再看 XSS 规则 xss.rule

# /etc/nginx/waf/rules/xss.rule
SecRule ARGS "(

配置完成后执行 nginx -t 校验语法,再执行 nginx -s reload 热加载生效。注意规则文件只影响新增请求,无需重启服务,非常安全。

五、实战三:不装任何扩展,纯 Nginx 限速防 CC

如果暂时不想装 WAF 模块,Nginx 自带的 ngx_http_limit_req_modulengx_http_limit_conn_module 就能挡住大部分 CC 攻击,这也是很多高防方案源站侧的标准配置:

http {
    limit_req_zone $binary_remote_addr zone=req_zone:20m rate=20r/s;
    limit_conn_zone $binary_remote_addr zone=conn_zone:20m;

    server {
        limit_req zone=req_zone burst=40 nodelay;
        limit_conn conn_zone 50;
    }
}

其中 rate=20r/s 是每 IP 每秒 20 次请求,burst=40 允许瞬间 40 个突发请求,超过直接返回 503。真实业务中建议先用日志观察高峰期 QPS,再设置一个比峰值高 30% 左右的阈值,避免误伤正常用户。对于图片站、下载站这类高并发场景,阈值要相应放宽。

六、规则上线后的验证与调优

规则写完必须实测,推荐用下面的命令做冒烟测试:

# 自动化注入测试,验证 WAF 规则是否生效(也可用于排查漏洞)
sqlmap -u "https://你的域名/index.php?id=1" --batch --dbs

# CC 防护验证:压测观察是否返回 503/403
ab -n 1000 -c 100 "https://你的域名/"

测试后重点看拦截日志:宝塔环境查看 /www/wwwlogs/站点域名.log,原生 Nginx 查看 /var/log/nginx/error.log。调优遵循三条原则:一是先开日志观察模式跑一周,统计误拦截比例,确认无误后再切拦截模式;二是阈值随业务增长动态调整,不要一次设置过死;三是规则更新要跟上新漏洞情报,WAF 规则库同样需要"打补丁"。

总结

WAF 不是装完就一劳永逸:规则库要定期更新、拦截日志要经常翻、阈值要随业务动态调整。如果站点数量多、运维精力有限,或者担心自建规则跟不上最新漏洞,可以考虑速度网络的网站防护服务,云端规则库实时更新、支持自定义策略、分钟级接入,配合本文的源站加固思路,一套组合拳下来,绝大多数自动化攻击都能被挡在门外。

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
在线客服
在线客服
热线电话
QQ客服
电子邮箱
suduwangluo