接入 CDN 后,源站默认看到的是CDN 节点的 IP。CDN 会在回源请求里携带两个请求头:
X-Real-IP:客户端真实 IPX-Forwarded-For:客户端 IP(多级代理时为链路,第一项即真实客户端)
源程序读取这两个头即可拿到真实 IP。如果不想改程序,也可以直接在 Nginx 层配置:
宝塔面板(不用改程序)
网站配置文件的 server 块里加入:
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
保存并重载 Nginx 后,PHP/程序里的 remote_addr 就会是真实客户端 IP。
安全建议:如果能整理出节点网段,把
0.0.0.0/0换成具体的set_real_ip_from 节点网段;,避免来访者伪造 X-Forwarded-For 头。
程序里直接读请求头
PHP: $_SERVER['HTTP_X_REAL_IP']
Node: req.headers['x-real-ip']
Python(Django): request.META.get('HTTP_X_REAL_IP')
四层转发的场景
TCP/UDP 转发没有 HTTP 头,需要客户端真实 IP 时,在转发详情开启 Proxy Protocol,并让源站程序(如游戏服务端、HAProxy)解析 Proxy Protocol,即可获得真实来源 IP。