转载备份
影子 DOM(Shadow DOM)
你的 docker stop,它优雅吗? - 无糖拿铁,谢谢
清理Docker的container,image与volume · 零壹軒·笔记
Create a PyPI Mirror Site with devpi-server – SRE
优雅的终止 docker 容器 | iTimothy
Odoo 14 开发者指南第二十一章 性能优化 | Alan Hou 的个人博客
Odoo 14 开发者指南第八章 高级服务端开发技巧 | Alan Hou 的个人博客
kafka 系列:设置日志数据保存过期时间(含某个 topic)、日志策略_NIO4444-CSDN 博客_kafka 配置数据过期时间
Chromium 历史版本离线安装包 - 下载方法
怎样将 props 传递给 {this.props.children} | WebFuse
HappyBaseDoc
用户指南 — HappyBase 1.2.0 文档
安装指南 — HappyBase 1.2.0 文档
API 参考 — HappyBase 1.2.0 文档
PostgreSQL 时间转换
JS 中创建给定长度的数组
GSAP 入门 - 学习中心 - 绿袜
操作系统复习 | Happy Coding
如何理解 ip 路由和操作 linux 的路由表 - CodeAntenna
Elasticsearch 7.11 tokenizer, analyzer and filter 以及 IK 分词配置同义词、远程拓展词库 – Brave new world
podman 容器内访问 host 主机的端口 - 知识库 - BSMI KB 基础标准矿产工业
吐血总结!100 道经典 Python 面试题集锦上(附答案)
中共党史简表(1919 年 - 1949 年)
Dockerfile 详解_万 wu 皆可爱的博客 - CSDN 博客_dockerfile
为你的 Python 应用选择一个最好的 Docker 映像 | 亚马逊 AWS 官方博客
Ubuntu Server 支持中文
docker push | Docker Documentation
docker 创建本地仓库详解 (push/pull)_乱红飞的博客 - CSDN 博客_docker push 本地仓库
基于 Ubuntu 20.04 安装 Kubernetes 1.18
PostgreSQL 集群篇——PostgreSQL 的配置文件解析_51CTO 博客_postGresql
【PostgreSQL】——主从流复制_Teingi 的博客 - CSDN 博客_postgresql 主从复制
PostgreSQL: Documentation: 14: 27.4. Hot Standby
postgresql 主从复制、主从切换_偷懒的小陈的博客 - CSDN 博客_postgresql 主从
Postgres 用户、角色与权限 :: 68hub — 技术博客
中国共产党第二十次全国代表大会在京开幕 一图速览二十大报告
配置 docker 通过代理服务器拉取镜像
IPVS no destination available - Kubernetes 实践指南
Python 风格规范 — Google 开源项目风格指南
互动测试!党的二十大报告 100 题
自定义 ESlint 规则
Java 读取 OpenSSL 生成的秘钥, 进行 RSA 加解密 | 数字魔法
CSS(一)chrome 浏览器表单自动填充默认样式 - autofil_半个 GIS 半个前端的博客 - CSDN 博客
Nginx 多级代理下的真实 IP 透传 - CodeAntenna
Jenkins 环境变量
人民币金额大写规范 - 内蒙古农业大学财务处
[转]nginx 开启 websocket - 浅忆博客
ceph 创建使用 rbd
《三》配置 ceph 存储池 pool - Buxl's blog
基于 K8S 搭建 Ceph 分部署存储 – 唐玥璨 | 博客
序言 · Kubernetes 中文指南——云原生应用架构实战手册
服务器配置 - Redis 安装配置 | 灰帽子 - 任令仓的技术博客
Ubuntu 配置 sudo 命令不需要输入密码_ubuntu sudo 免密_一路向前 - 执着的博客 - CSDN 博客
修改 Docker 数据目录位置,包含镜像位置 - 腾讯云开发者社区 - 腾讯云
微服务架构实践(API Gateway)
微服务网关:从对比到选型,由理论到实践 | Java 程序员进阶之路
聊聊微服务网关
微服务网关:从对比到选型,由理论到实践
odoo 实现表分区 partition
使用 keepalived 搭建高可用服务 - 简书
业务网关的落地实践_文化 & 方法_Qunar 技术沙龙_InfoQ 精选文章
部署 Kubernetes PostgreSQL 实例 | domac 的菜园子
一套包含完整前后端的系统如何在 K8S 中部署?_k8s 前端_木讷大叔爱运维的博客 - CSDN 博客
前端安全系列(二):如何防止 CSRF 攻击? - 美团技术团队
traefik 自定义中间件 | coolcao 的小站
CSRF 原理和实战利用 - FreeBuf 网络安全行业门户
安全运维 - 如何在 Kubernetes 中使用注释对 ingress-nginx 及后端应用进行安全加固配置实践_唯一极客知识分享的技术博客_51CTO 博客
Kubernetes 进阶使用之 Helm,Kustomize
各种加密算法比较
Docker 的三种网络代理配置 · 零壹軒 · 笔记
本文档使用 MrDoc 发布
-
+
首页
Nginx 多级代理下的真实 IP 透传 - CodeAntenna
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [codeantenna.com](https://codeantenna.com/a/1lIczUTD2q) * * * **透传 IP:** 在使用了 CDN 做加速站点静态资源加速后,当用户请求的静态资源没能命中,此时 CDN 会到源站请求内容,那么此时访问源站的 IP 为 CDN 节点的 IP,不仅如此,可能经我们的 WAF 防火墙和前端的负载均衡 (SLB) 后更不容易获取到真实的用户 IP 信息,我们如果要统计用户的访问 IP 和地区就变得比较麻烦,因为可能不是真实的 IP,必须使用一个什么机制将用户 IP 传递到最终后端的应用服务器才行 **访问流程:** | 主机 | IP配置 | 备注 | |--------|----------|------------| | Chrome | 10.0.0.1 | Windows浏览器 | | LB-01 | 10.0.0.5 | 一级代理 | | LB-02 | 10.0.0.6 | 二级代理 | | LB-03 | 10.0.0.7 | 三级代理 | | WEB | 10.0.0.8 | WEB主机 | ## 常见的几种方式 ### X-Real-IP 在每个`HTTP`请求头中加入`X-Real-IP`信息,若只存在 1 级的代理服务器,则该参数的确就是客户端的真实`IP`, 但若是存在多级代理时,此信息为上级代理的`IP`信息,==并不能获取到真实的用户IP,故此法目前已弃用==。 nginx 配置: ``` #LB-01一级代理配置 server { listen 80; server_name ip.test.com; location / { proxy_pass http://10.0.0.6; proxy_http_version 1.1; Proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; } } #LB-02二级代理配置 server { listen 80; server_name ip.test.com; location / { proxy_pass http://10.0.0.7; proxy_http_version 1.1; Proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; } } #LB-03三级代理配置 server { listen 80; server_name ip.test.com; location / { proxy_pass http://10.0.0.8; proxy_http_version 1.1; Proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; } } #WEB主机配置 server { listen 80; server_name ip.test.com; root /wwwroot; index index.php; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } ``` WEB 主机测试脚本: ``` #文件名:index.php #放到测试目录/wwwroot内 <?php $IP_ADDRESS = getenv("HTTP_X_REAL_IP"); echo "SOURCE IP ADDRESS: $IP_ADDRESS"; ?> ``` **注:**配置完成后保存所有配置文件,然后启动所有的`nginx`服务。如果在`windows`下测试一定要在`C:\Windows\System32\drivers\etc\hosts`文件内加入本地解析的记录,如下: ``` 10.0.0.5 ip.test.com ``` Wireshark 抓包信息 HTTP 报头信息 ``` GET / HTTP/1.1 Host: ip.test.com X-Real-IP: 10.0.0.6 Connection: close Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: UM_distinctid=16afc8d323f94-0360d7ebcc9bae-3d644509-18e414-16afc8d324063f ``` chrome 打开测试 **结论:**由`Wireshark`追踪流和`Chrome`的测试可见,`X-Real-IP`并不能获取到真实的客户端`IP`地址,如果时单级代理情况下,可以获取到正确的客户端`IP`,若存在多级代理就歇菜了。 ### X-Forwarded-For 在每个`HTTP`请求头中加入`X-Forwarded-For`信息,若只存在 1 级的代理服务器,则该参数为客户端的真实`IP`, 若是存在多级代理时,每经过一级代理服务器,则追加上级代理服务的`IP`,可以获取到真实的用户`IP`,但若是遇到伪造的`X-Forwarded-For`信息或第一级代理未启用`X-Forwarded-For`都不能获取到真实用户`IP`,此法是目前比较常用的方法,但更推荐使用`nginx_http_realip_module`模块添加可信代理的方法。 nginx 配置: ``` #LB-01一级代理配置 server { listen 80; server_name ip.test.com; location / { proxy_pass http://10.0.0.6; proxy_http_version 1.1; Proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #可以尝试注释此处的,看看最终能否获取到真实客户端IP } } #LB-02二级代理配置 server { listen 80; server_name ip.test.com; location / { proxy_pass http://10.0.0.7; proxy_http_version 1.1; Proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } #LB-03三级代理配置 server { listen 80; server_name ip.test.com; location / { proxy_pass http://10.0.0.8; proxy_http_version 1.1; Proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } #WEB主机配置 server { listen 80; server_name ip.test.com; root /wwwroot; index index.php; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } ``` WEB 主机测试脚本: ``` #文件名:index.php #放到测试目录/wwwroot内 <?php $IP_ADDRESS = getenv("HTTP_X_FORWARD_FOR"); echo "SOURCE IP ADDRESS: $IP_ADDRESS"; ?> ``` **注:**记得重载`nginx`配置。 Wireshark 抓包信息 HTTP 报头信息 ``` GET / HTTP/1.1 Host: ip.test.com X-Forwarded-For: 10.0.0.1, 10.0.0.5, 10.0.0.6 Connection: close Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: UM_distinctid=16afc8d323f94-0360d7ebcc9bae-3d644509-18e414-16afc8d324063f ``` chrome 打开测试 ![](https://codeantenna.com/image/https://img-blog.csdnimg.cn/img_convert/0818b9ca8b590ca3270a3433284dd417.png) **结论:**由`Wireshark`追踪流和`Chrome`的测试可见,`X-Forwarded-For`可以获取到真实的客户端`IP`地址,即便是在多级代理下,也可以获取到正确的客户端`IP`,但如果某台代理未设置`X-Forwarded-For`,后端应用服务器可能并不能获取到正确的客户端`IP`。 ### nginx_http_realip_module 通过预定义**可信任**的代理主机的`IP`的方式(可信代理主机默认都会加入`X-Forwarded-For`信息),根据些`X-Forwarded-For`的信息,从右到左,滤除掉这些可信代理的`IP`信息,最终获取到的就是真实客户端`IP`信息,此信息替换`$remote_addr`这个变量,使最终客户端`IP`在`WEB`后端应用服务器的`access.log`第一列显示,方便取值分析。 nginx 官方描述 nginx 配置 ``` #LB-01一级代理配置 server { listen 80; server_name ip.test.com; location / { proxy_pass http://10.0.0.6; proxy_http_version 1.1; Proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #此为可信任的代理服务器,故需要加入这条配置 } } #LB-02二级代理配置 server { listen 80; server_name ip.test.com; location / { proxy_pass http://10.0.0.7; proxy_http_version 1.1; Proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #此为可信任的代理服务器,故需要加入这条配置 } } #LB-03三级代理配置 server { listen 80; server_name ip.test.com; location / { proxy_pass http://10.0.0.8; proxy_http_version 1.1; Proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #此为可信任的代理服务器,故需要加入这条配置 } } #WEB主机配置,使用此模块是在后端WEB应用服务器添加参数 server { listen 80; server_name ip.test.com; #定义可信任的代理服务器地址 set_real_ip_from 10.0.0.5; set_real_ip_from 10.0.0.6; set_real_ip_from 10.0.0.7; #指定从哪个HTTP报头里检索IP信息 real_ip_header X-Forwarded-For; #递归排除每个代理服务器的IP real_ip_recursive on; root /wwwroot; index index.php; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } ``` WEB 主机测试脚本 ``` #文件名:index.php #放到测试目录/wwwroot内 <?php $IP_ADDRESS = getenv("HTTP_X_FORWARD_FOR"); echo "SOURCE IP ADDRESS: $IP_ADDRESS"; ?> ``` **注:**记得重载`nginx`配置。 Wireshark 抓包信息 HTTP 报头信息 ``` GET / HTTP/1.1 Host: ip.test.com X-Forwarded-For: 10.0.0.1, 10.0.0.5, 10.0.0.6 Connection: close Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: UM_distinctid=16afc8d323f94-0360d7ebcc9bae-3d644509-18e414-16afc8d324063f ``` chrome 打开测试 WEB 应用服务器的访问 LOG **结论:**为了解决`X-Forwarded-For`可能存在伪装`IP`的问题,我们在后端使用了`nginx_http_realip_module`模块的`set_real_ip_from`关键字来添加可信`IP`并从`X-Forwarded-For`头中筛选出去,最终成功获取到了客户端`IP`,并且也对格式日志做了一定的替换,使客户端`IP`显示于`access.log`的第一列,方便最终的取值分析,这里需要注意的是,一定要添加正确且绝对可信的代理服务器`IP`,否则最终结果还是存在问题。 ## 更多相关推荐 [多级代理下 Nginx 透传真实 IP](https://codeantenna.com/a/0nyuSxUCvS) 文章目录多级代理下 Nginx 透传真实 IPNginxRealIP 获取真实 IP 多级代理下 Nginx 透传真实 IP1. 基于代理 (七层负载均衡) 情况下透传客户端的真实 IP 环境: 10.0.0.5proxy_node1 一级代理 10.0.0.6proxy_node2 二级代理 10.0.0.7proxy_... [Nginx 多级代理统计客户端真实 ip](https://codeantenna.com/a/LWvjaUNCbY) 前提概述: 由于普通反向代理没加 proxy_set_headerX-Real-IP $remote_addr; 后端服务器统计 ip 来源时显示的是前一个代理服务器的 ip 地址,比如 109.1 访问 109.139 没设置上面代理语句,后端 109.140 日志记录访问 ip 来源是 109... [Nginx 多级代理,获取客户端真实请求 IP 以及每级代理 IP](https://codeantenna.com/a/YsdCp39xY2) 如图所示,每一级 nginx 里的 location 配置里需要加上对应的配置,最后一级 nginx 是直接到应用,测试时为了方便,直接用 echo 模块去测试,打印 IP 地址。原理分析:只有客户端直接请求到的那个 nginx 能够拿到客户端的真实 IP... [Nginx 有多级代理时,获取用户的真实 IP 地址](https://codeantenna.com/a/cCy2vQSbsK) 在 web 服务器前面设置代理服务器时,从 nginx 模块中取 $remote_addr 值为上一级代理的 IP 地址,而非真实客户端的 IP 地址。为了获取真实客户端 IP 地址,可以使用 nginx 自带的 realip 模块。此模块可将真实客户端 IP 地址设置进 HTT... [nginx 代理获取真实 ip](https://codeantenna.com/a/WJsTLb4idG) 使用上面的代码,获取到的客户端的 ip 一直是::ffff:127.0.0.1,得不到正确的 ip 原因是服务端使用了 nginx 进行端口转发,如果没使用 nginx 进行代理,getClientIp 函数是可以正确获取到公网 ip 的解决方案修改 nginx 配置重启 ng... [Nginx 配置之反向代理获取真实 ip](https://codeantenna.com/a/D7Px6rDADR) 保留代理之前的 hostproxy_set_headerHost$host; 保留代理之前的真实客户端 ipproxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; 在多级代理的情况下,记录每次代理之... [NGINX 多级代理客户 IP 传递](https://codeantenna.com/a/vbRY0UAllc) set $my_x_real_ip"";if($http_x_real_ip~"^$"){ set$my_x_real_ip$remote_addr;}if($my_x_real_ip~"^$"){ set$my_x_real_ip$http_x_real_ip;}proxy_set_header X-Real-IP$my_x_real_ip; [nginx 的真实 IP](https://codeantenna.com/a/rn1HnJyKfT) NginxRealIP 当前端有 nginx 进行反向代理时,后端的机器获得的访问日志中记录的 IP 是前端 nginx 的,用一下方法来记录真实 IP。实验环境实验过程 nginx 安装 realip_module 模块(两个 nginx 都要安装)在 nginx 代理机器修改配置... [使用 nginx 代理,后台怎么获取真实的 IP](https://codeantenna.com/a/Fe04eL5y1M) 1. 在 nginx.conf 配置中加入配置信息 2. 然后再后台获取真实 IP [nginx 反向代理 取得真实 IP 和域名](https://codeantenna.com/a/kZbn6U240I) nginx 反向代理后,在应用中取得的 ip 都是反向代理服务器的 ip,取得的域名也是反向代理配置的 url 的域名,解决该问题,需要在 nginx 反向代理配置中添加一些配置信息,目的将客户端的真实 ip 和域名传递到应用程序中。 ngin...
幻翼
2022年11月18日 16:33
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码