【Nginx】proxy_set_header的变量与X-Forwarded-For伪造客户端IP漏洞

前言

上面突然说,需要检查Nginx反向代理的安全问题并给出了修改方法,小白的我一脸懵逼,明明都是中文,连在一起咋就看不明白了。于是乎,对着修改内容简单学习了一下,在此做个记录,如有问题请大佬们指点指点。

1、proxy_set_header的参数

在Nginx中的location里,我们通常会配置proxy_set_header,如下代码:

# 定义转发分配规则
upstream kwtest {server ip1:port;server ip2:port;
}server {listen	8080; # Nginx监听端口location /testApi {# 反向代理proxy_pass http://kwtest;# 在原本的nginx中,这个是默认的proxy_set_header Host $http_host;}
}

1.1 具体参数

这里来解释一下这个参数$http_host,以及后面会讲到的参数。

proxy_set_header参数含义
$http_host请求头中的完整的主机名或IP地址(包括端口号)
$host请求头中的Host字段,主机名或IP地址(不包括端口号)
$remote_addr是客户端的IP地址
$proxy_add_x_forwarded_for获取客户端真实的 IP 地址

1.2 客户端请求过来的 HTTP 请求头中的主机名或IP地址,与客户端的 IP 地址有什么不同

  • 客户端请求过来的 HTTP 请求头中的主机名或IP地址:这里的IP不是客户端的IP,是服务器端的IP【eg.系统部署的地方】
  • 客户端的 IP 地址:用户的IP地址【eg.浏览器打开的页面】

1.3 客户端的IP地址 与 获取客户端真实的 IP 地址有什么不同

$remote_addr是 Nginx 服务器记录的发起连接的客户端 IP 地址,是从网络层获取的客户端 IP,也就是请求到达 Nginx 服务器的 IP 地址。这个变量通常在直接与客户端通信的情况下使用,例如,客户端直接请求 Nginx 服务器时,可以通过$remote_addr获取客户端的真实 IP 地址。

$proxy_add_x_forwarded_for是 Nginx 在作为反向代理服务器时,从 HTTP 请求头中提取客户端的真实 IP 地址。当 Nginx 作为反向代理服务器时,客户端请求会经过反向代理服务器,再由反向代理服务器转发给后端的真实服务器处理。在这个过程中,Nginx 在请求头中添加了 X-Forwarded-For 字段,并将客户端的真实 IP 地址追加到该字段的末尾。$proxy_add_x_forwarded_for可以从这个字段中提取出客户端的真实 IP 地址,从而获取客户端的真实 IP 地址。

因此,$remote_addr$proxy_add_x_forwarded_for都是用于获取客户端 IP 地址的,但是 $remote_addr 适用于直接与客户端通信的场景,而 $proxy_add_x_forwarded_for 适用于 Nginx 作为反向代理服务器时获取客户端真实 IP 地址的场景,二者的使用场景不同。

2、X-Forwarded-For伪造客户端IP漏洞

这部分主要看利用X-Forwarded-For伪造客户端IP漏洞成因及防范这篇文章。虽然很详细,但理解完后,过一段时间忘了又得再理解。因此,以下内容主要对这篇文章的总结,快速回忆。

在这里插入图片描述

  • 注意:
    $proxy_add_x_forwarded_for 会将和Nginx直接连接的客户端IP追加在请求原有X-Forwarded-For值的右边。
    $remote_addr 这个是无法伪造的,即使客户端伪造也会被覆盖掉,而不是追加。
  1. 存在多层Nginx情况下:
# 外层
server {listen	8080; # Nginx监听端口location /testApi1 {# 反向代理proxy_pass http://kwtest1;proxy_set_header X-Forwarded-For $remote_addr;}
}# 内层
server {listen	8080; # Nginx监听端口location /testApi2 {# 反向代理proxy_pass http://kwtest2;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

如果有多层代理,那么只要在直接对外访问的Nginx上配置X-Forwarded-For为$remote_addr,内部层的Nginx还是要配置为$proxy_add_x_forwarded_for,不然内部层的Nginx又会覆盖掉客户端的真实IP。

  1. 单层Nginx,即对内又对外的情况:
# 内外层
server {listen	8080; # Nginx监听端口location /testApi3 {# 反向代理proxy_pass http://kwtest3;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

X-Real-IP 头部会包含真实的客户端 IP 地址,X-Forwarded-For 头部会包含一个逗号分隔的 IP 地址列表,其中第一个 IP 地址应该是真实的客户端 IP 地址

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

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

相关文章

【USRP X410】LabVIEW参考架构软件,用于使用Ettus USRP X410对无线系统进行原型验证

LabVIEW参考架构软件,用于使用Ettus USRP X410对无线系统进行原型验证 设备 1 MHz to 7.2 GHz,400 MHz带宽,GPS驯服OCXO,USRP软件无线电设备 - Ettus USRP X410集成硬件和软件,可帮助您制作高性能无线系统的原型&…

WAS 9.0 ND 命令行安装-基于LINUX 8

WAS 9.0 安装文件准备如下: gtk.x86_64_1.8.9004.20190423_2015.zip ----IM安装源文件 sdk.repo.8035.java8.linux.zip ----JAVA安装源文件 was.repo.90501.nd.zip ----WAS安装源文件 …

Maven详见及在Idea中的使用方法[保姆级包学包会]

文章目录 Maven详解1.1 目标1.2 Maven概括1.3 多模块开发1.3.1 pom.xml1.3.2 生命周期1.3.3 依赖特性(多模块1)1.3.4 继承特性(多模块2)1.3.5 dependencyManagement标签1.3.6 Maven-聚合(多模块3)聚合 1.3.6.1聚合总结 Maven详解 1.1 目标 maven是什么?maven能干什么?maven…

机器视觉初步13:3D相机介绍

文章目录 1. 结构光(Structured Light)2. 飞行时间(Time of Flight,ToF)3. 双目视觉(Stereo Vision)4. 线扫描(Line Scan)5. 散斑(Speckle) 在工业…

ROS安装注意事项

输入roscore报错:"roscore" not found 输入 sudo apt install ros-​melodi​c-roslaunch​

深度卷积网络的实际应用

目录 1、三种经典的深度卷积网络 1.1、LeNet-5 1.2、AlexNet 1.3、VGG 2、残差网络 3、Inception 网络(Inception network) 4、迁移学习 5、数据增强 1、三种经典的深度卷积网络 1.1、LeNet-5 使用 sigmoid 函数和 tanh 函数,而不是…

freemarker学习

一、Freemarker引入 二、环境搭建和测试 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/m…

函数和控制流

专栏简介&#xff1a;本专栏作为Rust语言的入门级的文章&#xff0c;目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言&#xff0c;虽然历史没有C、和python历史悠远&#xff0c;但是它的优点可以说是非常的多&#xff0c;既继承了C运行速度&#xff0c;还拥有了Java…

ELK日志记录——Kibana组件——grok 正则捕获插件、mutate数据修改插件、multiline 多行合并插件、date 时间处理插件

grok 正则捕获插件 grok 使用文本片段切分的方式来切分日志事件 内置正则表达式调用 %{SYNTAX:SEMANTIC} ●SYNTAX代表匹配值的类型&#xff0c;例如&#xff0c;0.11可以NUMBER类型所匹配&#xff0c;10.222.22.25可以使用IP匹配。 ●SEMANTIC表示存储该值的一个变量声明&…

【Java】一只小菜坤的编程题之旅【2】

文章目录 1丶丑数2、各位相加3丶搜索插入位置4丶第一个错误的版本 1丶丑数 因为丑数只能被2&#xff0c;3&#xff0c;5整除&#xff0c;所以让n依次去除2&#xff0c;3&#xff0c;5&#xff0c;如果最后是n为1&#xff0c;就说明是丑数。 class Solution {public boolean is…

C语言实现扫雷【经典】

前言   本篇文章要实现的是扫雷游戏&#xff0c;其代码实现与上一篇的三子棋游戏类同&#xff0c;都是在棋盘的基础上&#xff0c;与电脑进行对抗&#xff0c;不同的是&#xff0c;扫雷游戏一开始电脑就已经随机布置好了所有“雷”。 请戳 --->三子棋 扫雷游戏 1. 扫雷游…

Kafka入门,offset的默认维护位置(二十一)

offset的默认维护位置 0.9版本之前&#xff1a;consumer默认将offset保持在zookeeper中 从0.9版本开始&#xff0c;consumer默认将offset保存在kafka一个内置的topic中&#xff0c;该topic为__consumer_offsets __consumer_offsets 主题里面采用key和value方式存储数据&#x…