CDN状态下客户端获取客户真实IP方案

CDN状态下客户端获取客户真实IP方案

行业新闻 2025-12-15 18:31:17 | 阅读:

14.jpeg

一、核心原理:CDN 透传真实 IP 机制

主流 CDN 通过 HTTP 请求头传递客户端真实 IP,核心头部字段如下:
  1. X-Forwarded-For(XFF)
标准化代理头,格式为逗号分隔的 IP 列表:
X-Forwarded-For: 203.0.113.45, 198.51.100.22
最左侧为客户端真实 IP,后续为中间代理节点 IP。
  1. X-Real-IP
简洁型头部,仅传递真实 IP:
X-Real-IP: 203.0.113.45
适用于轻量级场景,兼容性略逊于 XFF。

二、三步实现真实 IP 获取

1. CDN 侧配置:开启 IP 透传(关键前提)

登录 CDN 控制台,在「回源配置」中启用真实 IP 透传功能:
  • 勾选「X-Forwarded-For 透传」或「X-Real-IP 透传」选项
  • 360CDN 可在「添加站点」后进入「回源请求头」配置界面开启(需先完成域名备案)

2. 服务器端配置:解析代理头

(1)Nginx 配置
在location块中添加头部转发规则:
location / {
proxy_pass http://源站IP;
# 传递真实IP头部
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 仅信任CDN IP段(防伪造)
set_real_ip_from 360CDN可信IP段; # 替换为360官方公布的IP范围
real_ip_header X-Forwarded-For;
}
(2)Apache 配置
启用mod_remoteip模块后添加:
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 360CDN可信IP段 # 限制可信来源

3. 应用层解析代码示例

PHP
function getRealIp() {
$ip = $_SERVER['REMOTE_ADDR'];
// 优先解析XFF头部
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($ips[0]); // 取第一个IP
} elseif (isset($_SERVER['HTTP_X_REAL_IP'])) {
$ip = $_SERVER['HTTP_X_REAL_IP'];
}
return $ip;
}
Java
public String getClientIp(HttpServletRequest request) {
String xff = request.getHeader("X-Forwarded-For");
if (xff != null && !xff.isEmpty()) {
return xff.split(",")[0].trim();
}
return request.getHeader("X-Real-IP") != null ?
request.getHeader("X-Real-IP") : request.getRemoteAddr();
}

三、安全防护:防止 IP 伪造

  1. 可信代理白名单
仅对 CDN 官方公布的 IP 段解析代理头,如 360CDN 会提供专属 IP 列表,定期同步更新。
  1. 头部优先级校验
高安全场景优先使用 CDN 专有头部(如有),结合 TLS 指纹、请求频率辅助验证。

四、推荐选择:360CDN

360CDN 不仅支持X-Forwarded-For与X-Real-IP双头部透传,配置流程简洁:通过「添加站点」完成源站绑定后,在回源设置中一键开启 IP 透传功能。其依托 360 安全生态,可自动同步可信 IP 段至服务器白名单,大幅降低伪造风险,同时兼顾加速性能与 IP 获取准确性,是兼顾安全与便捷的优选方案。