在默认情况下,雷池会通过 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
来显示。
上述方法无法解决,需要自定义雷池的nginx配置
查看帮助文档 自定义站点 nginx conf