多层代理后怎么拿到真实地址
业务链路经过 CDN、负载均衡、反向代理之后,WAF 与后端应用看到的源地址是上一跳设备的地址。真实客户端 IP 的获取有两种路径:HTTP 场景通过转发头逐跳追加原始地址,四层场景使用代理协议在连接建立时携带源地址。两条路径都涉及同样的判断——哪些中间设备是可信的,取值时必须以此为界。
基本信息
| 适用平台 | nginx、HAProxy 等代理软件,以及 WAF、负载均衡与 CDN 链路 |
|---|---|
| HTTP 场景 | 读取 X-Forwarded-For 或 X-Real-IP,按可信代理层数取值 |
| 四层场景 | 使用 PROXY protocol 在连接建立阶段传递源地址 |
| 安全前提 | 只信任已知代理层写入的地址,其余来源一律视为不可信 |
典型使用场景
- 访问控制与封禁:策略必须基于真实客户端地址,否则会误封中间设备或漏放攻击者
- 日志与审计:日志里需要记录真实来源,才能支撑事后分析
- 限速与风控:按客户端维度限速,避免所有请求被算到同一个代理地址上
- 证书与域名:多域名共享入口时,转发头配合域名信息才能正确路由
- 排障定位:用户反馈问题时,凭真实地址才能定位到具体链接与终端
nginx 传递示例
nginx 传递示例
location / {
proxy_set_header X-Real-IP $remote_addr; # 最近一跳地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 逐跳追加
proxy_set_header X-Forwarded-Proto $scheme; # 原始协议
proxy_pass http://192.168.20.10:8080;
}
# 后端取值:按已知可信代理层数从右往左取,不要直接取最左侧的地址取值方式对照
| 场景 | 取值位置 | 风险 |
|---|---|---|
| 直连无代理 | 链路层源地址 | 无 |
| 单层代理 | 转发头中的唯一地址 | 客户端可伪造同名头 |
| 多层代理 | 从右往左按可信层数取 | 层数配错会取到伪造地址 |
| 四层代理 | 代理协议提供的源地址 | 两端未同时开启则握手失败 |
转发头可被客户端伪造,风控与封禁策略不要直接信任客户端提交的头部,必须结合可信代理层数与来源校验。