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://www.mzph.cn/diannao/50530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

08 字符串和字节串

使用单引号、双引号、三单引号、三双引号作为定界符(delimiter)来表示字符串,并且不同的定界符之间可以相互嵌套。 很多内置函数和标准库对象也都支持对字符串的操作。 x hello world y Python is a great language z Tom said, "Le…

centos7 mysql 基本测试(6)主从简单测试

centos7 xtrabackup mysql 基本测试(6)主从简单测试 mysql -u etc -p 1234aA~1 参考: centos7 时区设置 时间同步 https://blog.csdn.net/wowocpp/article/details/135931129 Mysql数据库:主从复制与读写分离 https://blog.csd…

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

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

移动式气象站:科技赋能,精准预报的新篇章

在这个气候多变、极端天气频发的时代&#xff0c;气象信息的准确性与及时性成为了社会各界关注的焦点。从农业生产到城市规划&#xff0c;从航空航海到日常生活&#xff0c;气象服务无处不在&#xff0c;其重要性不言而喻。而在这场气象科技的变革中&#xff0c;移动式气象站以…

数据结构(Java):Map集合Set集合哈希表

目录 1、介绍 1.1 Map和Set 1.2 模型 2、Map集合 2.1 Map集合说明 2.2 Map.Entry<K&#xff0c;V> 2.3 Map常用方法 2.4 Map注意事项及实现类 3、Set集合 3.1 Set集合说明 3.2 Set常用方法 3.3 Set注意事项及其实现类 4、TreeMap&TreeSet 4.1 集合类TreeM…

「AI绘画Stable Diffusion 零基础入门 」AI 绘画SD原理与工具介绍,万字详解新手入门必看!

大家好&#xff0c;我是设计师阿威 AI 绘画原理 想要入门 AI 绘画&#xff0c;首先需要了解它的原理是什么样的。 其实很早就已经有人基于深度学习模型展开了对图像生成的研究了&#xff0c;但在那时&#xff0c;生成的图像分辨率和内容都非常抽象。 直到近两年&#xff0c…

【数据结构-前缀和】力扣3152.特殊数组II

如果数组的每一对相邻元素都是两个奇偶性不同的数字&#xff0c;则该数组被认为是一个 特殊数组 。 周洋哥有一个整数数组 nums 和一个二维整数矩阵 queries&#xff0c;对于 queries[i] [fromi, toi]&#xff0c;请你帮助周洋哥检查子数组 nums[fromi…toi] 是不是一个 特殊…

VLAN通讯实验

目录 拓扑图 需求 需求分析 配置过程 1、手工配置 2、 使用DHCP获得IP地址信息 3、测试全网是否可达 拓扑图 需求 1、PC1、PC3属于VLAN 2 2、PC2、PC4属于VLAN 3 3、通过DHCP使得PC获取IP地址信息 4、全网可达 需求分析 1、先手工配置网段&#xff0c;VLAN 2为192.168.1…

数据结构经典测试题4

1. #include <stdio.h> int main() { char *str[3] {"stra", "strb", "strc"}; char *p str[0]; int i 0; while(i < 3) { printf("%s ",p); i; } return 0; }上述代码运行结果是什么&#xff1f; A: stra strb strc B: s…

【用最少数量的箭引爆气球】python刷题记录

R2-贪心篇. 求最小&#xff0c;那就尽可能地假设更多的气球y值不相同咯。 不对&#xff0c;气球除了y值我们随便摆&#xff0c;所以找尽可能多重叠的&#xff0c;就作为同一只箭。 class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:#贪心策略…

原生PHP/JS自主开发的交友内核框架婚恋交友系统V10

本文来自&#xff1a;婚恋交友系统V10 - 源码1688 应用介绍 原生PHP/JS自主开发的交友内核框架&#xff0c;极高性能、无捆绑、自主权、无流水扣点、独立全开源 01脱单盲盒&#xff1a;脱单盲盒类似于漂流瓶&#xff0c;先将自己《投放》到盲盒中&#xff0c;另一伴有缘将您取…

【文件fd】深入理解和实现Linux底下一切皆文件 | 系统和语言文件操作二者关系_封装 | 系统调用为什么怎样封装成库函数

目录 1.系统调用的打开/读/写文件操作 2.如何理解Linux底下一切皆文件 2.1设备属性 2.2设备的操作方法 3.如何实现Linus底下一切皆文件 4.源码查看 5.系统和语言文件操作二者关系 5.1 flags选项和C语言的"w""a"方式 二者的关系 5.2 系统的文件描…

Linux之基础IO(下)

目录 缓冲区的概念 深入理解文件系统 创建文件的整个过程 软链接 硬链接 上一节课我们学习了基础IO中的文件的读写操作&#xff0c;以及文件描述符的概念和重定向的基本原理&#xff0c;本期我们继续进行基础IO的学习。 缓冲区的概念 在讲缓冲区之前&#xff0c;大家先看…

Java 集合框架:HashMap 的介绍、使用、原理与源码解析

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

Redis (常用数据结构和命令)

目录 简介 概述 特点 数据结构 常用命令 通用命令 keys del exists expire 与 ttl String 命令 SET 和GET: MSET和MGET INCR和INCRBY和DECY SETNX SETEX Redis 命令 Key 的层级结构 key层级关系 &#xff1a; Hash命令 HSET和HGET HMSET和HMGET HGETALL H…

TypeScript核心

常用操作方式 1、类型推断 ts会根据变量存放的初始值来进行变量类型限定。 如上&#xff1a;开始str是字符串&#xff0c;则此变量以后就只能存字符串值。 开发中的意义&#xff1a;变量分配字符串值&#xff0c;后期可能会书写一些字符串功能、方法等相关的操作&#xff0c;如…

【算法/学习】前缀和差分

前缀和&&差分目录 1. 前缀和的概念及作用 &#x1f308;概念 &#x1f308;用途 &#x1f319;一维前缀和 &#x1f319;二维前缀和 2. 差分的概念及用途 &#x1f308;概念&#xff1a; &#x1f308;用途 &#x1f319;一维差分 &#x1f319;二维差分 1. …

JVM面试题之内存区域、类加载篇

文章目录 引言JVM是什么&#xff1f;1. JVM内存划分2. 对象如何在JVM中创建2.1 内存分配2.2 创建对象步骤 3. JVM类加载流程3.1 双亲委派 总结 引言 Java开发人员在面试中基本都会被问到关于JVM的问题。想要成为高级的开发人员&#xff0c;了解和学习Java运行的原理和JVM是必不…

数据结构——二叉树性质

性质1:在二叉树的第i层上至多有2^(i-1)个结点(i>1)。 这个性质很好记忆&#xff0c;观察一下图6-5-5。 第一层是根结点&#xff0c;只有一个&#xff0c;所以2^(1-1)2^01。 第二层有两个&#xff0c;2^(2-1)22。 第三层有四个&#xff0c;2^(3-1)2^24。 第四层有八个&am…

【年报文本分析】Python+Selium获取互动易平台投资者提问与上市公司回应文本数据

目录 序言excel文件准备全部代码 序言 互动易平台链接&#xff1a;https://irm.cninfo.com.cn/views/interactiveAnswer 需要提前下载好三个库&#xff0c;都可以用pip install轻松下载&#xff0c;稍微麻烦点儿的是需要去下载个对应版本的chromedriver.exe驱动&#xff0c;放…