🗣 Wd提问: nginx传递真实ip
🤖 Ai回答: 在使用 Nginx 作为反向代理或负载均衡器时,后端服务通常无法直接获取客户端的真实 IP 地址(因为请求是通过 Nginx 转发的,后端看到的是 Nginx 的 IP)。为了让后端服务获取到客户端的真实 IP,需要在 Nginx 配置中设置相应的 HTTP 头信息。
常用做法:使用 `X-Real-IP` 和 `X-Forwarded-For`
1、基本配置示例
nginx
server {
listen 80;
server_name 65.hk;
location / {
proxy_pass http://backend_server;
传递真实 IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
2、关键指令说明
`$remote_addr`:表示与 Nginx 直接建立连接的客户端 IP(即真实用户 IP,如果前面没有其他代理)。
`X-Real-IP`:自定义头,通常用于传递最原始的客户端 IP。
`X-Forwarded-For`:标准头,记录请求经过的所有代理 IP。格式为:`client_ip, proxy1_ip, proxy2_ip, ...`
`$proxy_add_x_forwarded_for`:自动在已有 `X-Forwarded-For` 值后面追加 `$remote_addr`。如果请求中没有该头,则新建并赋值为 `$remote_addr`。
3、多层代理场景(如 CDN + Nginx)
如果请求先经过 CDN 或其他代理(如 Cloudflare、阿里云 SLB),那么 `$remote_addr` 就不是最终用户 IP,而是上一级代理的 IP。
此时应使用 `real_ip` 模块来“还原”真实 IP:
启用 `ngx_http_realip_module`(默认已编译)
nginx
在 http、server 或 location 块中设置
假设你的 CDN 或前置代理 IP 段如下(需替换为实际 IP 段)
set_real_ip_from 192.168.0.0/16; 内网
set_real_ip_from 10.0.0.0/8; 内网
set_real_ip_from 172.16.0.0/12; 内网
set_real_ip_from 203.0.113.0/24; 示例:CDN 提供的 IP 段
使用哪个头来获取真实 IP
real_ip_header X-Forwarded-For;
或者某些 CDN 使用 CF-Connecting-IP、True-Client-IP 等
real_ip_header CF-Connecting-IP;
可选:递归解析 X-Forwarded-For 最左边的非可信 IP
real_ip_recursive on;
✅ `real_ip_recursive on;` 表示从 `X-Forwarded-For` 列表中从右往左查找,跳过所有 `set_real_ip_from` 中定义的可信代理 IP,取第一个非可信 IP 作为真实客户端 IP。
配置完成后,`$remote_addr` 就会变成真实用户 IP,后续的 `proxy_set_header X-Real-IP $remote_addr;` 也会传递正确值。
4、后端如何获取真实 IP?
如果你设置了 `X-Real-IP`,后端可读取该头。
更通用的做法是读取 `X-Forwarded-For` 的第一个 IP(但要注意伪造风险,建议只在可信代理后使用)。
在启用 `real_ip` 模块后,Nginx 日志中的 `$remote_addr` 也会记录真实 IP。
5、安全提醒
不要盲目信任 `X-Forwarded-For`,因为它可以被客户端伪造。
务必配合 `set_real_ip_from` 限制可信代理 IP,否则可能被绕过。
示例:完整配置(含 CDN)
nginx
http {
只信任来自这些 IP 的 X-Forwarded-For
set_real_ip_from 103.21.244.0/22; Cloudflare IP 段之一
set_real_ip_from 192.168.1.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
总结
| 场景 | 推荐做法 |
| 单层 Nginx 代理 | 设置 `X-Real-IP` 和 `X-Forwarded-For` |
| 多层代理 / CDN | 启用 `real_ip` 模块 + 设置可信代理 IP |
| 安全性要求高 | 严格限制 `set_real_ip_from`,避免头伪造 |
如有具体架构(如是否使用 CDN、SLB 等),可提供更精准配置建议。
📣 商家广告:





0
IP地址: 194.234.79.202
搜索次数: 7
提问时间: 2025-12-31 00:18:50
本站所有
❓
问答
均由Ai自动分析整理,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
本站由
🟢
豌豆Ai
提供技术支持,使用的最新版:
豌豆Ai站群搜索引擎系统 V.25.10.25
搭建本站。