Nginx系列-10 realIp模块使用

背景

Nginx对每个模块都有说明文档,可参考:https://nginx.org/en/docs/

当请求被代理后,真实客户端相对服务器被隐藏,即服务端无法判断HTTP消息来源。
在这里插入图片描述
如上图所示,IP分别为100.100.100.1和100.100.100.2的两个客户端向服务器200.200.200.200发起http请求,经过100.100.100.100代理后,HTTP消息到达200.200.200.200服务器时,消息一致;此时,无法区分消息来自100.100.100.1或100.100.100.2.

可通过将客户端的IP添加入HTTP消息解决上述问题,可在消息头中添加字段。
在这里插入图片描述
此时,服务器从http头域提取RealIp字段即可获取客户端IP信息。

Nginx中的入http_realip_module模块提供了上述能力。

1.编译和安装

#下载资源
wget http://nginx.org/download/nginx-1.26.0.tar.gz# 解压资源
tar -zxvf nginx-1.26.0.tar.gz# 编译nginx
cd nginx-1.26.0/
./configure  --prefix=/usr/local/ewen/nginx --with-http_realip_module
./make# 安装nginx
./make install

说明:Nginx默认不会携带http_realip_module模块,因此编译需要使用通过--with-http_realip_module手动指定引入该模块。

2.使用方式

需要在代理和服务器分别进行配置,以实现realIp功能。

2.1 代理配置

说明:有多级代理时,中间代理也需要进行配置

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

将客户端/上一级代理的IP添加到X-Forwarded-For请求头中,是一个不断添加的过程;如下图所示:
在这里插入图片描述

2.2 服务器配置

服务器涉及的配置项包括set_real_ip_from配置、real_ip_header配置、 real_ip_recursive配置,可以配置在http块、server块、location块中。
[1] real_ip_header
指定获取real_ip的字段,即从http消息头域的哪个字段中获取,此时固定为X-Forwarded-For,如下所示:

real_ip_header X-Forwarded-For;

[2] set_real_ip_from
设置信任的IP,即用于设置中间代理服务器的IP。
上图中需要设置3个IP, 如下所示:

set_real_ip_from 2.2.2.2;
set_real_ip_from 3.3.3.3;
set_real_ip_from 4.4.4.4;

说明:可以设置IP,也可以设置IP段,如set_real_ip_from 4.4.4.4/24.

[3] real_ip_recursive
可以配置为开(on)或者关(off).
配置为on时: 将根据set_real_ip_from设置的受信任的IP,对X-Forwarded-For从右至左递归排除,直到得到右侧第一个非受信任的IP地址,将其设置为realIp。
配置为off时: 如果没有使用set_real_ip_from设置上一级代理为受信任IP,则将上一级代理的IP设置为realIp; 如果使用set_real_ip_from排除上一级代理后,则获取X-Forwarded-For最右侧一位作为realIp.
即real_ip_recursive关闭后,表示不支持多级代理。

2.3 服务器获取realip

服务器通过$remote_addr变量获取realip. 具体使用方式在下一章节结合案例进行介绍。

2.4 X-Real-IP

除了使用上述X_Fowarded-For逐层追加IP外,还可使用X-Real-IP:在第一层(靠近客户端侧)添加头域,其他代理层透传,不需要额外设置, 如下图所示:
在这里插入图片描述
[1] 第一级代理
在靠近客户端的第一级代理中添加配置:

proxy_set_header X-Real-IP $remote_addr;

[2] 服务器配置

real_ip_header X-Real-IP;# 添加相对服务器上一级代理的IP地址
set_real_ip_from 4.4.4.4;

[3] 服务器使用realIp
服务器通过$remote_addr变量获取realIp. 具体使用方式在下一章节结合案例进行介绍。

3.案例

3.1 X-Forwarded-For

架构图和配置分别如下所示:
在这里插入图片描述

#171 agent
server {listen       8001;server_name  localhost;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;location /query {proxy_pass http://192.168.100.172:8002;}
}#172 agent
server {listen       8002;server_name  localhost;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;location /query {proxy_pass http://192.168.100.173:8003;}
}#173 agent
server {listen       8003;server_name  localhost;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;location /query {proxy_pass http://192.168.100.174:8004;}
}#174 server
server {listen       8004;server_name  localhost;real_ip_header X-Forwarded-For;real_ip_recursive on;set_real_ip_from 192.168.100.173;set_real_ip_from 192.168.100.172;set_real_ip_from 192.168.100.171;location /query {return 200 "Msg from 192.168.100.174:8004, request from $remote_addr";}
}

在客户端(192.168.100.100)上发送http://192.168.100.171:8001/query,得到的结果如下:

Msg from 192.168.100.174:8004, request from 192.168.100.100

在174服务器上抓包结果如下所示:

GET /query HTTP/1.0
X-Forwarded-For: 192.168.100.100, 192.168.100.171, 192.168.100.172
Host: 192.168.100.174:8004
Connection: close
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: b3e9111f-a199-4bed-95bd-9115c0d4cc3f
Accept-Encoding: gzip, deflate, brHTTP/1.1 200 OK
Server: nginx/1.26.0
Date: Fri, 20 Jul 2024 12:48:37 GMT
Content-Type: application/octet-stream
Content-Length: 31
Connection: closeMsg from 192.168.100.174:8004, request from 192.168.100.100

3.2 X-Real-IP

使用X-Real-IP时,对配置进行以下修改:

#171 agent
server {listen       8001;server_name  localhost;proxy_set_header X-Real-IP $remote_addr;location /query {proxy_pass http://192.168.100.172:8002;}
}#172 agent
server {listen       8002;server_name  localhost;location /query {proxy_pass http://192.168.100.173:8003;}
}#173 agent
server {listen       8003;server_name  localhost;location /query {proxy_pass http://192.168.100.174:8004;}
}#174 server
server {listen       8004;server_name  localhost;real_ip_header X-Real-IP;set_real_ip_from 192.168.100.173;location /query {return 200 "Msg from 192.168.100.174:8004, request from $remote_addr";}
}

在客户端(192.168.100.100)上发送http://192.168.100.171:8001/query,得到的结果如下:

Msg from 192.168.100.174:8004, request from 192.168.100.100

在174服务器上抓包结果如下所示:

GET /query HTTP/1.0
Host: 192.168.100.174:8004
Connection: close
X-Real-IP: 192.168.100.100
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: 953bfb0c-e553-4a67-a498-ffb659b9071f
Accept-Encoding: gzip, deflate, brHTTP/1.1 200 OK
Server: nginx/1.26.0
Date: Fri, 20 Jul 2024 12:53:53 GMT
Content-Type: application/octet-stream
Content-Length: 31
Connection: closeMsg from 192.168.100.174:8004, request from 192.168.100.100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3267949.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

TransformerEngine

文章目录 一、关于 TransformerEngine ?亮点 二、使用示例PyTorchJAXFlax 三、安装先决条件Dockerpip从源码使用 FlashAttention-2 编译 四、突破性的变化v1.7: Padding mask definition for PyTorch 五、FP8 收敛六、集成七、其它贡献论文视频最新消息 一、关于 Tr…

traefik 2

不在白名单里的,就不能访问 允许谁访问,就把它加进来 traefik 高级应用 1. 负载均衡 关键在ingressroute 添加多个 svc 验证 就是找一台,配好host, 然后 两个svc 权重都是1,改一下就成了灰度分布 2. 灰度发布 关键在于…

立创梁山派--移植开源的SFUD和FATFS实现SPI-FLASH文件系统

本文主要是在sfud的基础上进行fatfs文件系统的移植,并不对sfud的移植再进行过多的讲解了哦,所以如果想了解sfud的移植过程,请参考我的另外一篇文章:传送门 正文开始咯 首先我们需要先准备资料准备好,这里对于fatfs的…

Chapter 10 Python数据容器:字符串

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、字符串的定义二、字符串的下标索引三、字符串的常用操作(方法)四、字符串的遍历 前言 在 Python 中,数据容器是组织和管理数据的…

NC 二叉树的最大深度

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 求给定二叉树…

com.mysql.cj.jdbc.Driver 爆红

出现这样的问题就是pom.xml文件中没有添加数据库依赖坐标 添加上这个依赖即可,添加完后重新加载一下Maven即可。 如果感觉对你有用就点个赞!!!

加密货币换法拉利!BTC和ETH可买超跑,满足加密富豪需求!未来继续扩张全球市场!

全球知名的意大利豪华跑车制造商法拉利(Ferrari)正在跟随时代潮流,加速在全球范围内推广其加密货币支付系统。这一举措旨在进一步满足加密货币持有者对奢侈品的需求,并拥抱日益普及的数字资产。 2023年10月,法拉利在美…

一文掌握YOLOv1-v10

引言 YOLO目标检测算法,不过多介绍,是基于深度学习的目标检测算法中最出名、发展最好的检测器,没有之一。本文简要的介绍一下从YOLOv1-YOLOv10的演化过程,详细技术细节不过多介绍,只提及改进点,适合初学者…

美团大众点评字符验证码

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 前言(…

昇思MindSpore学习入门-高阶自动微分

mindspore.ops模块提供的grad和value_and_grad接口可以生成网络模型的梯度。grad计算网络梯度,value_and_grad同时计算网络的正向输出和梯度。本文主要介绍如何使用grad接口的主要功能,包括一阶、二阶求导,单独对输入或网络权重求导&#xff…

宠物空气净化器是不是智商税?央视推荐狗毛空气净化器分享

宠物空气净化器是不是智商税?是众多宠物主人在考虑是否购置宠物空气净化器时心中最大的疑问。作为呼吸科医生,我建议,在保护呼吸健康方面,任何投资都是值得的。特别是对于养有猫狗的家庭来说,宠物所带来的各种污染物和…

一次性解决 | 网站被提示“不安全 ”

当网站被提示“不安全”时,这通常意味着用户的个人信息、登录凭证和其他敏感数据可能面临风险。为了一次性解决这个问题,可以从一下方面入手。 一、检查并启用HTTPS协议 检查URL:确保网站地址以“https://”开头,而非“http://”…

HTML常见标签——超链接a标签

一、a标签简介 二、a标签属性 href属性 target属性 三、a标签的作用 利用a标签进行页面跳转 利用a标签返回页面顶部以及跳转页面指定区域 利用a标签实现文件下载 一、a标签简介 <a>标签用于做跳转、导航&#xff0c;是双标签&#xff0c;记作<a></a>&#…

【Linux C | 网络编程】进程池小文件传输的实现详解(二)

上一篇实现了一个最基本的进程池&#xff1a;客户端读取标准输入&#xff0c;发送给服务端&#xff0c;服务端回复一个相同的内容。 【Linux C | 网络编程】简易进程池的实现详解&#xff08;一&#xff09; 这篇内容在上篇进程池的基础上实现小文件的传输。 文件传输的本质…

Java 并发编程:一文了解 Java 内存模型(处理器优化、指令重排序与内存屏障的深层解析)

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 022 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

力扣高频SQL 50 题(基础版)第三题

文章目录 力扣高频SQL 50 题&#xff08;基础版&#xff09;第三题1148.文章浏览题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50 题&#xff08;基础版&#xff09;第三题 1148.文章浏览 题目说明 Views 表&#xff1a; ---------------------- | Colu…

昇思25天学习打卡营第1天|简单深度学习

前言 昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 其中&#xff0c;易开发表现为API友好、调试难度低&#xff1b;高效执行包括计算效率、数据预处理效率和分布式训练效率&#xff1b;全场景则指框架同时支持云、边…

数据传输安全--SSL VPN

目录 IPSEC在Client to LAN场景下比较吃力的表现 SSL VPV SSL VPN优势 SSL协议 SSL所在层次 SSL工作原理 SSL握手协议、SSL密码变化协议、SSL警告协议三个协议作用 工作过程 1、进行TCP三次握手、建立网络连接会话 2、客户端先发送Client HELLO包&#xff0c;下图是包…

平安养老险深圳分公司:参加献血志愿者活动,点亮生命之光

7月23日&#xff0c;“热血传万里&#xff0c;家家共平安”2024年中国平安无偿献血志愿者活动启动&#xff0c;其深圳站活动于当日在深圳市福田区平安金融中心北广场举行&#xff0c;平安养老险深圳分公司积极响应活动号召参与献血&#xff0c;用行动诠释责任&#xff0c;以爱心…

Nginx 配置与优化:常见问题全面解析

文章目录 Nginx 配置与优化:常见问题全面解析一、Nginx 安装与配置问题1.1 Nginx 安装失败问题描述解决方法1.2 Nginx 配置文件语法错误问题描述解决方法二、Nginx 服务启动与停止问题2.1 Nginx 无法启动问题描述解决方法2.2 Nginx 服务无法停止问题描述解决方法三、Nginx 性能…