后端怎么拿到真实客户端 IP
七层转发时负载均衡以自己为源向后端发起连接,后端看到的 TCP 对端是负载均衡而非用户;真实的客户端地址通过请求头传递,常见的是 X-Forwarded-For(追加式、逗号分隔),部分产品还提供 X-Real-IP 与 X-Forwarded-Proto。后端应用需要解析请求头,而不是直接取 socket 对端地址。
基本信息
| 主要请求头 | X-Forwarded-For,按经过的代理逐段追加 |
|---|---|
| 补充头 | X-Real-IP、X-Forwarded-Proto、X-Forwarded-Port(视产品) |
| 后端动作 | 应用或接入网关从头部解析客户端 IP 并记录 |
| 四层差异 | 四层转发通常需要额外模块或代理协议支持才能取到真实地址 |
| 安全注意 | XFF 可被客户端伪造,非信任来源的头部要在入口清洗 |
| 取值含义 | 列表最左侧通常是原始客户端,最右侧是最近一跳代理 |
典型使用场景
- 业务日志记录客户端 IP,用于审计与问题追溯
- 风控与限流按客户端来源统计,识别异常高频请求
- 应用侧做地域分析或黑白名单判断,需要真实来源地址
- 排查用户投诉时按 IP 回溯具体请求链路
- 多级代理环境下确认每一跳的地址,定位异常环节
在 Nginx 日志中记录客户端 IP 链
在 Nginx 日志中记录客户端 IP 链
log_format lb '$http_x_forwarded_for $remote_addr $request';
# $http_x_forwarded_for 为负载均衡追加的客户端 IP 链
# $remote_addr 为直接连接的对端地址(LB 或上一跳代理)
access_log /var/log/nginx/access.log lb;
# 验证:curl -H 'X-Forwarded-For: 1.2.3.4' 观察日志中记录的来源取值与判断
| 字段 | 含义 | 注意 |
|---|---|---|
| XFF 最左值 | 通常为原始客户端地址 | 客户端可伪造,需入口清洗 |
| XFF 最右值 | 最近一跳代理地址 | 多层代理时用于确认链路 |
| X-Real-IP | 单个客户端地址,取值更简单 | 并非所有产品都提供 |
| remote_addr | TCP 对端地址 | 七层场景下是负载均衡自身 |
若把 XFF 用作风控或鉴权依据,必须确保入口只接受负载均衡注入的值,并清洗客户端自带的同名请求头,否则伪造来源可以绕过限制。
四层监听下后端取到的对端地址是负载均衡地址;需要真实客户端 IP 时应改装七层监听,或在后端部署厂商提供的模块解析代理协议。