4. 接入第一个站点
这一章是整份文档最关键的一节。配错这里,WAF 要么不生效,要么直接把客户业务打挂。
4.1 先理解一件事:监听端口和域名是两个独立概念
很多人第一次配置会卡在这里。先看清楚:
| 字段 | 含义 | 举例 |
|---|---|---|
listen_port | WAF 自己监听的端口。流量打到这个端口,WAF 才开始处理 | 80 |
domains | 打到这个端口的请求里,哪些域名归这个站点管 | shop.example.com |
upstreams | 匹配上之后,转发给哪个源站 | 192.0.2.10:8080 |
所以完整链路是:
用户访问 http://shop.example.com
↓
DNS 解析到 WAF 服务器 IP
↓
请求打到 WAF 的 80 端口 ← listen_port
↓
WAF 看 Host 头是 shop.example.com ← domains 匹配
↓
转发给 192.0.2.10:8080 ← upstreams
两个要点:
listen_port是 WAF 的端口,不是源站的端口。 源站端口写在upstreams的addr里。- 多个站点可以共用同一个
listen_port。 引擎按端口去重监听,80 端口只起一个 listener,用 Host 头分流到不同站点。所以你有 5 个站,全都是listen_port=80,只靠domains区分。
4.2 添加站点前的准备
| 检查项 | 怎么确认 |
|---|---|
| 源站能正常访问 | 在 WAF 服务器上 curl -I http://192.0.2.10:8080,能返回 200/301 才行 |
| WAF 端口没被占用 | ss -lntp | grep :80,有 Nginx 就先停掉,WAF 要独占 |
| DNS 已切到 WAF | ping shop.example.com 解析结果应是 WAF 服务器 IP |
| 防火墙已放行 | 80/443 对公网开放,后台端口 49463 仅对管理 IP 开放 |
不要先切 DNS 再配站点。 反过来:先配好站点、验证通过,最后再切 DNS。否则切过去的瞬间就是全站不可用。
4.3 添加站点
站点管理 → 添加站点,按下面填。


基本信息
| 字段 | 必填 | 说明 |
|---|---|---|
| 站点名称 | 是 | 只用于后台区分,不参与流量匹配。建议写业务含义,如「云帆商城」 |
| 域名 | 是 | 多个用英文逗号分隔。精确匹配,不支持通配符(详见 4.5) |
| 监听端口 | 是 | WAF 对外端口,通常是 80 或 443 |
| 状态 | 是 | 启用 / 禁用 |
源站配置
upstreams 是 JSON 数组:
[{"addr":"192.0.2.10:8080","weight":1}]
| 项 | 说明 |
|---|---|
addr | 源站地址,IP:端口 |
weight | 权重。免费版只支持 1 个源站,权重填 1 即可;多源站加权是 Pro 能力 |

如果源站是 HTTPS 且用自签证书,打开「跳过上游证书校验」(upstream_skip_verify),否则会握手失败。
防护配置
| 字段 | 取值 | 说明 |
|---|---|---|
| 启用 WAF 防护 | 开 / 关 | 关了就是纯反向代理,不做任何拦截 |
| 防护方式 | js / captcha | js=JS 挑战,captcha=人机验证(滑块等) |
| 验证模板 | slider 等 | 免费版只有静默验证和滑块 |
| JS 挑战时长 | 0 / 1 / 3 / 5 秒 | 见下方说明 |
JS 挑战时长怎么选,这是最容易选错的:
| 档位 | 实际行为 | 适合什么站 |
|---|---|---|
0 | 透明注入,用户完全无感。后台异步评分,评分不过则下一次请求触发 1 秒挑战 | 推荐首选。正常用户零打扰,脚本照样拦 |
1 | 用户停留 1 秒后放行 | 一般站点 |
3 | 停留 3 秒 | 攻击明显的站 |
5 | 停留 5 秒 | 极少数被打得很惨的场景,正常用户会明显感到卡顿 |
js_delay填 0 和填 1 是完全不同的机制,不是「0 秒就是 1 秒」。填 0 走的是透明注入 + 异步评分路径。
客户端 IP 判定(最容易被忽略、后果最严重)
client_ip_mode 决定 WAF 认为「访客 IP」是哪个:
| 值 | 含义 | 什么时候用 |
|---|---|---|
1 | 取 TCP 连接的对端地址(RemoteAddr) | WAF 直接对公网时用它(默认) |
2 | 取 X-Forwarded-For 的第 N 个(client_ip_index,1=真实客户端) | 前面套了 CDN 或 Nginx 时 |
3 | 取指定 Header(client_ip_header) | 云厂商自定义头,如 CF-Connecting-IP |
这一项填错的后果:如果你的 WAF 前面还有一层 CDN,而 client_ip_mode 还是 1,那么所有访客在 WAF 眼里都是 CDN 节点的 IP —— CC 限频会把全站用户当成同一个攻击者,一次限频就是所有人一起被拦。
判断方法:配好站点后访问一次,看「攻击日志」里记录的 client_ip 是不是你自己的真实 IP。如果是 CDN 的 IP,就回来改这一项。
其他
| 字段 | 说明 |
|---|---|
| 记录原始日志 | 关掉可省磁盘。免费版本身不存原始日志,此项对免费版无效 |
| 站点 Logo | 拦截页上显示的图标 |
| 备注 | 给自己看的说明 |
| API 路径 | 格式 /api/* 或 /v1/*,支持通配符。留空则由 WAF 根据 Accept 头自动判断。多数情况留空即可 |
| 上传目录 | 逗号分隔。只有命中这些目录的请求才做 shell 文件名深检,留空表示全局扫描 |
4.4 生效与验证
生效时间
保存后不需要重启任何进程。引擎每 5 秒轮询一次站点变更,最多 5 秒自动生效。
验证流量真的过了 WAF
按顺序做,三步都能过才算接好了:
第一步:请求数在涨
后台「仪表盘」看今日请求数,刷新你的站点首页几次,数字应该增长。不增长说明流量没进来。
第二步:故意触发一次拦截
在浏览器访问:
http://shop.example.com/?id=1' union select 1,2,3--
如果返回的是 WAF 的拦截页(而不是源站的页面或 404),说明规则链在工作。
第三步:日志里有记录
「日志审计 → 攻击日志」应该出现刚才这条,类型是 SQL注入,动作 block。
如果三步都不过
| 现象 | 原因 | 处理 |
|---|---|---|
| 请求数不涨,页面正常 | DNS 还没切过来,或端口没对上 | dig shop.example.com 确认解析到 WAF;ss -lntp 确认端口在监听 |
| 页面打不开(502/超时) | 源站地址写错或源站不可达 | 在 WAF 服务器上 curl 源站地址 |
| 页面打不开(连接被拒) | listen_port 被占用,引擎没起来 | 看 runtime/log/wafd/waf.out.log |
| 能打开但请求数不涨 | 域名没匹配上,请求没归到这个站点 | 核对 domains 拼写,见 4.5 |
| 所有请求都报错 | 证书配置问题(HTTPS 站点) | 检查 cert_path / key_path 文件是否存在且可读 |
4.5 域名匹配规则(必读)
引擎的匹配逻辑是去端口后精确比对,等价于下面这段:
请求 Host 去掉端口 == domains 里逗号分隔的某一项

由此推出三条硬规则:
| 你写的 | 结果 |
|---|---|
shop.example.com | 只匹配这一个域名,www.shop.example.com 不匹配 |
shop.example.com,www.shop.example.com | 两个都匹配,要逐个列出来 |
*.example.com | 不生效。不支持通配符,会被当成字面量 |
所以泛解析场景(a.example.com、b.example.com 都要走 WAF)必须把每个子域名都写进去。
另外:
- 域名不要带协议和端口,写
shop.example.com,不要写http://shop.example.com:80 - 域名大小写不敏感,但建议统一小写
- 匹配不上任何站点的请求,不会被 WAF 处理,会直接走到源站或返回错误 —— 这是「配了 WAF 但感觉没生效」最常见的真实原因
4.6 多站点共用 80 端口的正确姿势
假设你有三个站,都想走 WAF:
| 站点 | listen_port | domains |
|---|---|---|
| 云帆商城 | 80 | shop.example.com,www.shop.example.com |
| 企业官网 | 80 | demo.example.com |
| 后台接口 | 8081 | api.example.com |
- 前两个共用 80,靠域名区分,只需要一个 listener
- 第三个单独占 8081(比如你想让 API 走不同端口策略)
云安全组千万不要放行引擎的高位端口(如 8081)。这类端口是内部转发用的,暴露出去等于绕过了前面的防护策略。只放行业务的 80/443 和后台端口。
4.7 HTTPS 站点
如果站点要跑 HTTPS:
- 打开「启用 SSL」
- 填证书路径
cert_path(如/usr/local/waf/cert/shop.pem)和私钥路径key_path(如/usr/local/waf/cert/shop.key) - 证书文件必须是 服务器本地路径,不是上传内容
引擎在一个端口上按 SNI 自动选择证书。所以同端口多站点的 HTTPS 也能共存,每个站点配自己的证书即可。
证书不存在或加载失败时,该端口会自动降级为纯 HTTP,不会起不来。现象就是 HTTPS 访问失败但 HTTP 正常 —— 遇到这个先查证书路径。
下一步:5. 防护配置