怎么判断命中与真实 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 的限流与风控。这一条在多级代理的链路上尤其容易出错。