14 10 月 2026

防火墙挡端口、fail2ban 封 IP,这些挡的是「网络层」的攻击。应用层的攻击——SQL 注入、XSS、命令执行、恶意 UA——需要 WAF(Web 应用防火墙)来识别和拦截。

这篇讲两种 WAF 方案:ModSecurity(Nginx 经典方案,规则成熟)和雷池(国产开源,界面友好),从安装到调规则全流程。

需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,主流游戏快速部署。

一、WAF 是什么,解决什么问题

WAF 工作在 HTTP 层,检查每个请求的内容:

请求 → WAF 检查(GET/POST/Cookie/Header) → 放行 or 拦截

能拦的攻击:

攻击请求特征拦截规则
SQL 注入' or 1=1--、union selectSQL 关键词 + 编码变形检测
XSS<script>alert(1)</script>脚本标签检测
命令注入;cat /etc/passwd、`whoami`shell 元字符 + 命令词
文件包含../../etc/passwd路径穿越模式
恶意扫描sqlmap/nikto UA、特征 URLUA + 路径黑名单
webshell 上传.php 后缀伪装图片文件类型校验

WAF 的局限:规则误报(正常请求被拦)、性能开销(每个请求都要检查)、防不住 0day(没规则就放行)。所以 WAF 是纵深防御的一层,不是银弹。

二、方案选型

对比ModSecurity雷池(SafeLine)
形态Nginx 模块独立反向代理服务
规则OWASP CRS 规则集语义分析 + 规则
界面无(改配置)Web 控制台
误报处理手工写排除规则界面一键加白
性能中(看规则数)中
适合熟悉 Nginx 的技术人员想要界面和省心的

建议:生产环境、团队维护 → 雷池;已有 Nginx 深度定制、想模块化 → ModSecurity。

三、ModSecurity 安装与配置

1. 安装(需编译安装)

Ubuntu/Debian 有现成包:

apt install -y libnginx-mod-http-modsecurity

# 或从源码编译 Nginx + ModSecurity(用 libmodsecurity)

2. 基础配置

# /etc/nginx/modsec/main.conf(从示例拷)
# Include /etc/nginx/modsec/modsecurity.conf
# Include /etc/nginx/modsec/crs/*.conf  (OWASP 规则)

server {
    listen 80;
    server_name 你的域名;

    # 开启 WAF
    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsec/main.conf;

    location / {
        proxy_pass http://backend;
    }
}

3. 模式选择

# modsecurity.conf
# 检测模式(只记录不拦截) — 新站先跑这个模式一两周
SecRuleEngine DetectionOnly

# 拦截模式(确认误报可控后开)
# SecRuleEngine On

血泪教训:直接开 SecRuleEngine On,正常用户被拦一片,工单爆炸。必须 DetectionOnly 观察一周,把误报规则排除掉,再开拦截。

4. 看日志,排除误报

# 错误日志里搜拦截记录
grep -i "ModSecurity" /var/log/nginx/error.log | tail -50

# 日志格式: [id "942100"] [msg "SQL Injection Attack..."]
# id 942100 = 规则 ID,msg = 命中原因

排除误报规则(自定义规则文件):

# /etc/nginx/modsec/crs-exclusions.conf
# 例子: 富文本编辑器提交 HTML 被 XSS 规则拦
<LocationMatch "/admin/editor">
  SecRuleRemoveById 941100 941110 941160
</LocationMatch>

# 例子: 搜索接口含特殊字符被 SQL 规则误报
SecRule REQUEST_URI "@beginsWith /search" \
  "id:1001,phase:1,pass,nolog,ctl:ruleRemoveById=942100"

5. 常用自定义规则

# 封恶意 UA
SecRule REQUEST_HEADERS:User-Agent "@pm sqlmap nikto nmap masscan acunetix" \
  "id:2001,phase:1,deny,status:403,log,msg:'Bad UA'"

# 文件上传限制(只允许图片)
SecRule FILES_NAMES "!\.(jpg|jpeg|png|webp|gif)$" \
  "id:2002,phase:2,deny,status:403,log,msg:'Bad upload type'"

# 单 IP 频率限制(简单版,复杂用 limit_req)
SecRule IP:REQUEST_RATE "@ge 100" \
  "id:2003,phase:1,deny,status:429,log,msg:'Rate limit'"

四、雷池:安装十分钟

雷池是长亭科技开源的 WAF,Docker 一键部署,自带控制台:

# 官方一键安装脚本
bash -c "$(curl -fsSL https://waf-ce.chaitin.cn/release/latest/setup.sh)"

# 按提示设管理端口(默认 9443),装完访问
# https://服务器IP:9443

配置站点

控制台 → 站点管理 → 添加站点:

  • 域名:你的域名
  • 上游:http://127.0.0.1:8080(你的真实服务)
  • 端口:80/443
  • 证书:上传或自动申请

雷池作为反向代理站在 Nginx 前面,所有请求先过它。

防护模式

模式行为
观察模式只记录不拦截(先跑一周)
拦截模式命中规则返回 403
严格模式更敏感的规则,误报多

看拦截日志、加白名单

控制台 → 防护日志,能看到每次拦截:时间、来源 IP、命中规则、请求详情。

误报处理:日志里点「加入白名单」,选条件(URL、IP、参数),实时生效。

雷池的优势:语义分析引擎比规则匹配误报低;界面一键操作;自动更新规则。省心程度比 ModSecurity 高一个量级。

五、规则调优:平衡安全与误报

无论哪个 WAF,目标都是高拦截率 + 低误报率:

上线流程(照做)

  1. 观察模式跑 7 天:收集命中记录,人工核对每条是否真攻击
  2. 排除误报:富文本接口、API 的合法特殊字符、搜索词——逐个加白
  3. 开拦截:先「宽松」模式
  4. 持续看日志:每周花 10 分钟过一遍拦截记录
  5. 逐步收紧:误报稳定后开严格模式

必须加白的场景

场景原因
后台富文本编辑器提交 HTML 内容,XSS 规则必误报
API 接口传 JSON特殊字符被当注入
搜索接口用户输入不可控
支付回调第三方 POST 内容不可控
监控/健康检查扫描型 UA 被拦

不该加白的

  • 登录接口(防暴力破解)
  • 文件上传(防 webshell)
  • 带 ../、union select 特征的请求(基本是真攻击)

六、性能影响与测试

# 1. 对比开/关 WAF 的响应时间
ab -n 1000 -c 10 https://你的域名/
# 看 Requests per second,下降 < 20% 可接受

# 2. 验证拦截生效
curl "https://你的域名/?id=1' or '1'='1"
# 应返回 403(拦截模式)或记录日志(观察模式)

# 3. 验证正常请求不受影响
curl -I https://你的域名/
# 200 正常

性能参考:规则数 200 条左右,响应增加 5–20ms。雷池语义分析引擎比传统规则稍重,但换来更低误报。

七、WAF 与 CDN/高防的分工

用户 → CDN/WAF(边缘拦截) → 源站 WAF(最后防线) → 应用
层职责
CDN 自带 WAF拦大部分扫描和 CC,流量不进源站
高防清洗大流量攻击
源站 WAF纵深防御,CDN 被绕过时的兜底

注意:用了 CDN,源站要限制只接受 CDN 回源 IP,否则攻击者直接打源站 IP 绕过 CDN。

八、常见问题

Q:WAF 会把正常用户拦哭?
误报没调完就开了拦截。回观察模式,加白名单,再逐步收紧。

Q:ModSecurity 和雷池能一起用吗?
可以但没必要,两层规则叠加误报更难调。选一个,另一个位置留给 CDN WAF。

Q:WAF 能防 0day 吗?
规则型 WAF 防不了未知漏洞。语义分析型(雷池)对未知变形有一定能力,但不保证。及时更新程序才是根本。

Q:NAT 型服务器怎么上 WAF?
把 WAF 跑在同机容器/服务里,域名/CDN 指过来。没有独立 IP 不影响——WAF 和网站在同一台机器,走内部回环。

Q:规则更新频率?
雷池自动更新;ModSecurity 的 OWASP CRS 每季度发新版,手动更或订阅更新源。

Q:日志里看到大量拦截,是被盯上了吗?
大概率是全网自动化扫描(每分钟都有无数扫描器在爬公网 IP)。雷池/ModSec 的拦截日志就是证据——这正是 WAF 的价值。

小结

WAF 是应用层防护的核心:上雷池或 ModSecurity,先观察后拦截,误报加白要勤。配合 CDN WAF 和源站限制,构成完整的 Web 防护体系。记住 WAF 不是银弹——程序及时更新、权限最小化、备份可靠,这三件事比任何 WAF 都重要。

更多安全内容见财富云计算知识库:CC 防护、漏洞防护、安全基线、应急排查全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:网站统计与访客分析:从零到看懂数据
  2. 下一篇:SSH 安全加固进阶:从密钥登录到跳板机
发表评论 6