首页/云/云网络与负载均衡速查/七层获取真实客户端 IP
负载均衡54 条

七层获取真实客户端 IP

七层转发时负载均衡会在请求头中加入 X-Forwarded-For(以及 X-Real-IP 等,视产品),后端应用应读取请求头获取真实客户端地址;直接取 TCP 对端地址只会得到负载均衡自身。

后端怎么拿到真实客户端 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_addrTCP 对端地址七层场景下是负载均衡自身
若把 XFF 用作风控或鉴权依据,必须确保入口只接受负载均衡注入的值,并清洗客户端自带的同名请求头,否则伪造来源可以绕过限制。
四层监听下后端取到的对端地址是负载均衡地址;需要真实客户端 IP 时应改装七层监听,或在后端部署厂商提供的模块解析代理协议。

易错点

  • 后端记录 remote_addr 作为客户端 IP,审计日志里全是负载均衡地址,问题追溯直接断链
  • 直接信任客户端自带的 XFF 头,未在入口清洗,风控与限流规则可被伪造来源绕过
  • 只取 XFF 的第一段而不校验其可信度,多层代理场景下拿到的是伪造值而非真实来源
  • 四层监听期待 XFF 存在:四层不解析 HTTP,头本身不会被注入,后端永远取不到真实地址

数据来源与参考

  • 阿里云 CLB 获取客户端真实 IP 文档
  • 腾讯云 CLB 获取真实 IP 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌