在默认情况下,雷池会通过 tcp socket 连接来获取客户端的源 IP。
若雷池和客户端之间还存在其他设备(如 CDN、AD、LB 等),会影响雷池获取正确的源 IP 信息。
通常,代理设备都会将真实源 IP 通过 HTTP Header 的方式传递给下一跳设备。
如下方的 HTTP 请求,在 X-Forwarded-For
和 X-Real-IP
两个 Header 中都包含了源 IP:
GET /path HTTP/1.1
Host: waf-ce.chaitin.cn
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
X-Forwarded-For: 110.123.66.233, 10.10.3.15
X-Real-IP: 110.123.66.233
X-Forwarded-For
是链式结构,若请求经过了多级代理,这里将会按顺序记录每一跳的客户端 IP。
如果请求中没有包含存在源 IP 的相关 Header,则需要修改前置设备的配置,将源 IP 通过 HTTP Header 传递给雷池。
遇到这种情况,打开雷池控制台的 “通用配置” 页面,将选项 “源 IP 获取方式” 的内容修改为 “从 HTTP Header 中获取”,并在对应的输入框中填入对应的 Header 即可。
通过雷池对上游服务器进行保护之后,上游服务器在获取源 IP 时可能会拿到雷池设备的 IP,在这种情况如何获取真实的源IP?
雷池默认透传了源 IP,放在 HTTP Header 中的 X-Forwarded-For
里面。
如果上游服务器是 NGINX,添加如下配置就可以。
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
注意 ngx_http_realip_module 模块用于将客户端地址和可选端口更改为发送的指定的头字段。
默认情况下不构建此模块,可在构建时使用 --with-http_realip_module 配置参数启用
如果不是 NGINX,则需要自行配置解析相关字段。
雷池界面上展示的攻击地址是通过 HTTP 请求中的 {protocol}://{host}{:port}{path}
字段拼接而成。
我们比较常见的 http 协议是 http 1.1
和 http 2.0
,这些协议都可以正确的展示攻击地址。
然后在非常古老的 http 1.0
或 http 0.9
协议中不包含 host
字段,因此无法正确展示攻击地址。在这种情况下雷池会用自己的 IP 地址代替 host
来显示。