首页/云/云网络与负载均衡速查/判断 CDN 命中与获取真实客户端 IP
云 DNS 与 CDN49 条

判断 CDN 命中与获取真实客户端 IP

判断命中看响应头里的缓存状态字段与 Age:各厂商命名不同,如 X-Cache 类头。源站要拿到真实客户端 IP,需要在源站配置 realip 并信任 CDN 回源网段,再从 X-Forwarded-For 还原。

怎么判断命中与真实 IP

判断 CDN 是否命中,看响应头里的缓存状态字段与 Age:各厂商命名不同,常见的是 X-Cache 类字段,Age 递增也说明内容来自缓存。源站要拿到真实客户端 IP,则需要在源站配置 realip 并信任 CDN 的回源网段,再从 X-Forwarded-For 中还原。这两件事都指向同一个原则——回源链路上的地址信息必须显式处理,不能想当然地直接读取。

基本信息

命中线索缓存状态响应头、Age 递增、无回源耗时代价
真实 IP边缘在 X-Forwarded-For 追加客户端 IP,源站按信任网段取
源站配置nginx realip 模块:set_real_ip_from 配合 real_ip_header
注意不能无条件信任 XFF:未校验来源时可被伪造

典型使用场景

  • 验证缓存效果:对比首次与再次请求的响应头差异
  • 源站风控与限流:需要真实客户端地址而非 CDN 节点地址
  • 访问日志分析:确认日志中的来源地址可用于溯源
  • 排查误封:确认限流规则作用在真实用户而不是 CDN 节点

nginx 还原真实客户端 IP

nginx 还原真实客户端 IP
set_real_ip_from 203.0.113.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
# 校验:access_log 中 $remote_addr 应显示为客户端 IP

判断依据

观察点含义实践提示
缓存状态头标识命中或回源首次访问多为回源
Age内容已在缓存中停留的秒数递增说明来自缓存
X-Forwarded-For客户端地址链路需按信任网段取右侧有效值
remote_addr源站侧看到的对端地址未配 realip 时是节点地址
只信任 CDN 回源网段:把 set_real_ip_from 配成任意来源等于允许伪造访问日志与限流绕过。

取值顺序要理清

X-Forwarded-For 是一个逗号分隔的地址链,链路的每一层都可能追加内容:客户端伪造的、CDN 追加的、中间代理追加的都会混在一起。正确取值方式是只信任已知 CDN 回源网段的写入,从链尾或按递归规则向前找到第一个非可信地址,把它当作真实客户端;如果无条件取最左侧地址,攻击者只要自己构造一个 XFF 头,就能让源站以为请求来自任意地址,从而绕过基于 IP 的限流与风控。这一条在多级代理的链路上尤其容易出错。

易错点

  • 源站日志全是 CDN 节点 IP,溯源失真
  • real_ip_recursive 配错取到伪造的左侧 IP
  • 无条件信任 X-Forwarded-For,限流与风控可被绕过
  • 只在一台源站配置 realip,其他节点日志口径不一致

数据来源与参考

  • 阿里云 CDN 获取真实 IP 文档
  • 腾讯云 CDN 回源 IP 与 XFF 说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌