当前位置: 首页 > news >正文

nginx传递真实客户端ip

在 Nginx 作为反向代理的架构中,后端应用服务器默认获取到的 IP 地址通常是 Nginx 服务器的内网 IP,而不是客户端的真实公网 IP。

要解决这个问题,需要完成两个核心步骤:Nginx 透传 IP后端应用解析 IP

核心原理

Nginx 反向代理时,通过 请求头(Header) 把真实 IP 传给后端:

  1. X-Real-IP:直接存放真实客户端 IP
  2. X-Forwarded-For:存放整个代理链路 IP(客户端 IP, 代理 1IP, 代理 2IP...)

后端只要读取这两个头,就能拿到真实 IP。

HTTP 层透传 (七层代理)

适用于 Nginx 反向代理 HTTP/HTTPS 请求的场景。

第一步:配置 Nginx

你需要修改 Nginx 配置文件(通常在 http 块或具体的 server 块中),手动将客户端 IP 注入到 HTTP 请求头中。

http {# ... 其他配置 ...server {listen 80;server_name example.com;location / {# 1. 传递真实 IP 到 X-Real-IP 头 (推荐,单值,最简洁)proxy_set_header X-Real-IP $remote_addr;# 2. 传递代理链 IP 到 X-Forwarded-For 头 (支持多层代理)proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 3. 传递主机名 (防止后端获取到错误的 Host)proxy_set_header Host $host;# 代理到后端服务器proxy_pass http://127.0.0.1:8080;}}
}
  • $remote_addr:代表与 Nginx 建立连接的客户端 IP。如果 Nginx 前面还有 CDN 或负载均衡,这里可能是 CDN 的 IP。
  • $proxy_add_x_forwarded_for:会在原有的 X-Forwarded-For 后面追加 $remote_addr,格式为 client, proxy1, proxy2

第二步:处理“多层代理”与“IP 伪造”

如果你的架构是 客户端 -> CDN -> 负载均衡 -> Nginx -> 后端,Nginx 拿到的 $remote_addr 其实是负载均衡的 IP。此时你需要配置 Nginx 去信任上游代理,并提取真实的客户端 IP。

你需要启用 ngx_http_realip_module 模块(大多数发行版默认已包含):

http {# 1. 定义可信代理的 IP 段 (例如内网负载均衡或特定 CDN 网段)# 只有来自这些 IP 的请求,Nginx 才会去解析其携带的真实 IP 头set_real_ip_from 10.0.0.0/8;      set_real_ip_from 192.168.1.0/24; # 2. 指定从哪个请求头中提取真实 IPreal_ip_header X-Forwarded-For;   # 或者 X-Real-IP,取决于上游传的是哪个# 3. 开启递归解析 (用于多层代理,自动剥离可信代理 IP,直到找到最外侧的真实 IP)real_ip_recursive on;server {# ... 上面的 proxy_set_header 配置保持不变 ...# 此时 $remote_addr 变量已经被模块替换为真实客户端 IP 了}
}

TCP/UDP 层透传 (四层代理)

如果你是在做 TCP 负载均衡(如数据库代理、游戏服),没有 HTTP 头可以注入,就需要使用 Proxy Protocol

原理

Proxy Protocol 会在 TCP 握手之前,发送一个包含源 IP 信息的报文头。

配置步骤

1、Nginx 发送端 (Stream 模块)

stream {upstream backend {server 127.0.0.1:3306;}server {listen 13306;# 告诉 Nginx 在连接后端时,发送 Proxy Protocol 头# 这样后端才能收到真实 IPproxy_protocol on; proxy_pass backend;}
}

2、后端接收端

后端服务(如 MySQL, Nginx HTTP 服务)必须开启支持 Proxy Protocol 的选项。

例如后端也是 Nginx,则需在 listen 指令中加上 proxy_protocol

# 后端 Nginx 配置
http {server {# 监听端口,并开启 proxy_protocol 支持listen 8888 proxy_protocol;location / {# 此时 $proxy_protocol_addr 就是客户端的真实 IP# 可以将它写入日志,或者作为变量传给后端应用return 200 "你的真实 IP 是: $proxy_protocol_addr";}}
}
http://www.jsqmd.com/news/563271/

相关文章:

  • StructBERT模型轻量化探索:知识蒸馏与模型压缩实践
  • 为什么你的Gradle构建这么慢?可能是依赖配置用错了!implementation vs api深度解析
  • 后端服务架构演进:从单体到微服务的转型之路
  • CPUDoc:基于动态CpuSet掩码与自适应电源管理的Windows CPU性能优化架构设计原理
  • 嵌入式系统处理器选型与应用指南
  • 新手必看:红日靶场信息收集实战指南(含Nmap扫描与MySQL弱口令破解)
  • 数字人视频生成利器:HeyGem批量版快速部署与效果展示
  • 保姆级教程:在YOLOv7上部署GradCAM++可视化(避坑指南+效果对比)
  • STM32软硬件协同工作原理与程序运行机制
  • 2026跑腿系统多站点可靠服务商推荐:外卖系统多站点/外卖系统开发/外卖系统搭建/外卖系统独立部署/选择指南 - 优质品牌商家
  • 别再手动算了!用Excel这个万能公式,5分钟搞定度分秒转经纬度
  • 自由开发者生存手册:软件测试从业者的接单、定价与客户管理
  • 51单片机+RC522模块DIY智能门禁卡:从硬件选型到代码调试全流程
  • BepInEx插件框架深度技术指南:从入门到架构优化
  • Apache James邮件服务器深度解析:企业级邮件基础设施架构与性能优化
  • 别只改.prettierrc了!从Git配置到CI/CD,一劳永逸解决团队换行符冲突
  • ROS Noetic/Melodic下,手把手教你将Qt Designer做的UI打包成Rviz插件
  • Transformers与SSMs的隐藏联系:从矩阵分解看Mamba为何比FlashAttention更快
  • 深度学习时间序列预测详解:从原理到实践
  • 用STM32F407做个智能小夜灯:光敏传感器+PWM调光保姆级教程(附完整代码)
  • 颠覆式知识管理:Open Notebook如何重构个人认知体系
  • 向量化计算失效的7大隐性陷阱,深度解析HotSpot向量编译器决策逻辑
  • GitLab中文版在Windows Docker部署后,解决‘git clone’和‘git push’失败的几个关键检查点
  • 造相-Z-Image-Turbo LoRA 与数据库联动:MySQL存储用户风格偏好与生成历史
  • DP Round
  • SpringBoot+Vue项目如何优雅集成文件预览?基于kkFileView 4.3.0与若依框架的实战踩坑记录
  • 第三章、CLion+GCC+OpenOCD构建STM32标准库开发环境:从零到调试的完整实践
  • 2026仓储物流领域伸缩帐篷评测深度解析:机库篷房/桃型篷房/污水池反吊膜/污水池反吊膜/游乐场景观/选择指南 - 优质品牌商家
  • GitHub SSH连接总失败?可能是端口被墙了!手把手教你配置443端口访问(Windows/Linux/Mac通用)
  • ngx_http_init_static_location_trees