Skip to content

Web 应用防火墙(WAF)

Ingress 在 路由匹配完成之后重定向 / 静态处理 / 回源代理之前,对请求执行第一代 WAF:

  • IPdeny 先于 allow;若配置了非空 allow,则仅列表内网段可通过 IP 阶段。
  • 域名白名单allow_hosts 中的 Host 跳过全部 WAF 阶段(IP 与特征均不检查)。
  • 单条规则域名白名单rules[].allow_hosts 中的 Host 仅跳过该条规则,其余规则照常评估。
  • 特征:针对 pathqueryuri(path + raw query)、headers(所有头拼接)或 header:Name 做单次匹配;支持 regex / contains
  • 可选内置规则:常见 SQL 注入试探、路径穿越、脚本相关试探;用 disable_builtin: true 关闭。

默认 不扫请求体。每条签名规则(含内置)可设 actionblock(拦截,默认)、audit(只记录)、pass(命中后放行并跳过后续签名)。仍可用全局或单条 log_only: true(等价于未写 action 时的 audit)。

顶层 waf: 为类型化基线;rules[].waf局部 YAML map,在 config.Load 之后由 waf.ApplyRulePatchesFromYAMLcore/waf/yaml.go)按字段合并(解码器无法用同一流程表达“只覆盖部分字段”)。

评估顺序:合并策略 → enabled → allow_hosts(全局域名白名单)→ 客户端 IP → deny/allow → 特征(每条特征前检查该规则的 allow_hosts)。trust_proxy 为真时用 X-Forwarded-Forxff_index 选段(0 为最左一段,负数从末尾倒数)。

内置 starter 规则

未设置 disable_builtin: true 时,会先加载下表中的规则,再追加你在 waf.rules 里自定义的规则。内置 id 固定,便于在日里识别,也可用 同名 id 在配置里覆盖内置定义(示例:examples/waf/rule-merge-by-id.yaml)。正则语义为 Go regexp

ID检测目标(targets说明
builtin:sqli-commonuri(path + query)常见 SQL 注入试探:union selectsleep(benchmark(; drop/truncate/alter table
builtin:path-traversalpath路径穿越:../..\、编码形式的 ..etc/passwd
builtin:xss-liteuri轻度 XSS 试探:<scriptjavascript:on…= 类事件属性
builtin:rce-probesuri命令注入/RCE 探针
builtin:jndi-lookupuriheadersJNDI ${…jndi: 注入
builtin:sensitive-filespath敏感路径(.env.git/、管理后台等)
builtin:ssrf-probesuri云元数据 / file:// / gopher:// SSRF 探针(不含 localhost,避免 OAuth 误报)
builtin:scanner-uaheader:User-Agent常见扫描器 UA
builtin:crlf-injectionuriheadersCRLF / 响应拆分
builtin:php-sstiuriPHP eval、php://

单条启停:

  • disable_builtin: false(默认):内置规则默认全开,可在 waf.builtin_rules 里对某条设为 false
  • disable_builtin: true:内置规则默认全关,可在 waf.builtin_rules 里单独设为 true
  • 自定义 waf.rules[] 支持 enabled: false(省略时默认启用)。

示例:

yaml
waf:
  enabled: true
  builtin_rules:
    builtin:scanner-ua: false
  rules:
    - id: my-rule
      enabled: false
      type: contains
      pattern: /internal
      targets: [path]

与代码一致的正则(源码:core/waf/builtin.go):

builtin:sqli-common
(?is)(union\s+select\b|sleep\s*\(|benchmark\s*\(|;\s*(drop|truncate|alter)\s+table\b)

builtin:path-traversal
(?:\.\./|\.\.\\|%2e%2e%2f|%2e%2e\\\\|etc/passwd\b)

builtin:xss-lite
(?is)(<\s*script\b|javascript:\s*[a-z]|\bon(?:click|load|error|focus|blur|change|submit|mouse\w*|key\w*|touch\w*|pointer\w*|scroll|dblclick|drag\w*|drop|input|reset|select|wheel|copy|cut|paste|abort|contextmenu|message|unload|beforeunload)\s*=)

内置规则可能对正常流量误报,可先用 log_only 观察,或 disable_builtin: true 后仅靠自定义规则。常见正常流量回归见 core/waf/builtin_false_positive_test.go

可运行样例:examples/waf/。字段表格见 配置参考;英文版说明:English WAF

Released under the MIT License.