首页 > 系统相关 >Nginx 获取/传递真实IP、追踪请求包转发链 及 防范源IP伪造

Nginx 获取/传递真实IP、追踪请求包转发链 及 防范源IP伪造

时间:2024-07-18 10:22:36浏览次数:15  
标签:forwarded Forwarded Nginx IP header proxy 包转发 客户端

(转载)

获取/传递真实IP

环境模拟:
客户端-->Nginx1/CDN/DDOS高防-->Nginx2-->后端Server

request Header 部分请求头字段:

  • X-Real-IP 用来保存客户端真实IP,默认为空
  • X-Forwarded-For 用来保存请求包的转发地址链,默认为空

对应变量:

  • $remote_addr 此变量保存的是http请求的发起方IP,也就是上一跳的IP
  • $http_x_real_ip 此变量默认为空,用来保存真实客户端IP给后端,对应header中的

修改方法:
proxy_set_header 此方法可以用来修改Header,目的为了传递修改后的信息给下一跳

参考配置:Ngx1

proxy_set_header X-Real-IP $remote_addr; #将上一跳的IP保存至 X-Real-IP 并可以向后传递

注意:
一旦ngx1修改了header中的 X-Real-IP,
ngx2和server就可以直接使用 $http_x_real_ip 来获取到真实IP,不需要额外加配置


追踪请求包转发链

变量介绍:

  • $http_x_forwarded_for 此变量保存的是请求的转发IP链,对应header中的 X-Forwarded-For
    X-Forwarded-For数组,包含多个IP,用逗号+空格分隔,最前端(client1)是客户端源IP,中间每一层代理将连接它的客户端IP追加在X-Forwarded-For末尾。

    X-Forwarded-For: clientIP, proxyIP1, proxyIP2, ...
    
  • $proxy_add_x_forwarded_for 此变量保存的是:将本级代理的IP,追加到X-Forwarded-For列表之后的值。

参考配置:Ngx1/Ngx2

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

如需打印到nginx日志,在log_format 直接使用 $http_x_forwarded_for 即可。


防范 源IP伪造

攻击方式:

正常客户端发起的request,不应该带有 X-Forwarded-For 请求头,
但是攻击者会在header里伪造一个IP:X-Forwarded-For: fakeIP

用curl命令修改header模拟IP伪造:

curl -I -H "X-FORWARDED-FOR:1.2.3.4" http://nginx1/

服务端第一层代理服务收到请求,发现已经有X-Forwarded-For,误把这个请求的来源当成一个代理,于是追加了“代理IP”(其实是客户端的真实IP),经过几层代理后,最终Server获取到的Header是:

X-Forwarded-For: fakeIP, client, nginx1, nginx2

解决方案:
在最外层代理ngx1上,不采信客户端的 X-Forwarded-For,直接用$remote_addr覆盖,不用$proxy_add_x_forwarded_for 追加。

参考配置:Ngx1

proxy_set_header X-Forwarded-For $remote_addr;

中间几层的代理Nginx参考配置:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

标签:forwarded,Forwarded,Nginx,IP,header,proxy,包转发,客户端
From: https://www.cnblogs.com/max27149/p/18308878

相关文章

  • Java开发新趋势!MyEclipse v2024.1全新首发——支持AI编码协助
    在MyEclipse 2024中,通过Copilot集成提供的AI编码协助,让开发者的生产力提高了近10倍;同时支持Java22,并部署到最新版本的应用服务器(如WildFly和Payara);拥有更高性能的Spring工具支持更流畅的编码体验,而语言服务器更新确保对所有现代web技术的最新语言支持。MyEclipse的现有用户可......
  • 如何在 Vue 和 JavaScript 中截取视频任意帧图片
    如何在Vue和JavaScript中截取视频任意帧图片大家好!今天我们来聊聊如何在Vue和JavaScript中截取视频的任意一帧图片。这个功能在很多场景下都非常有用,比如视频编辑、视频预览等。本文将带你一步步实现这个功能,并且会提供详细的代码示例。准备工作首先,我们需要一个Vue......
  • COMP9021 Principles of Programming Coding Quiz 5
     COMP9021PrinciplesofProgrammingTerm2,2024CodingQuiz5Worth4marksanddueWeek8Thursday@9pmDescriptionYouareprovidedwithastubinwhichyouneedtoinsertyourcodewhereindicatedwithoutdoinganychangestotheexistingcode......
  • njs最详细的入门手册:Nginx JavaScript Engine
    原文链接:https://hi.imzlh.top/2024/07/08.cgi关于njs首先,njs似乎在国内外都不受关注,资料什么的只有官网参考手册,出了个问题只能看到GithubIssue所以,这篇文章将我的探索过程展示给大家,njs对于可用存储空间较小的设备真的很友好,相比较于NodeJS、Deno这种80M起步的运行环境真的......
  • MIPI图解简释
    MIPI(移动行业处理器接口)是MobileIndustryProcessorInterface的缩写。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准。目的:把手机内部的接口如摄像头、显示屏接口、射频/基带接口等标准化,从而减少手机设计的复杂程度和增加设计灵活性。比较成熟的接口应用有DSI(显示接......
  • LDAP应用篇(3)Nginx接入
    实验环境:OracleLinuxR8在搞Nginx比较错愕的是,居然Nginx并未内置对LDAP的支持,需要单独编译。然而yum安装的nginx并不支持导入模块,不得不再次温习一下编译安装Nginx的路数了。下载组件从github中下载组件的源代码:cd~&&gitclonehttps://github.com/kvspb/nginx-......
  • 网络编程-TCP/IP
    网络概述网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务网络体系结构即指网络的层次结构和每层所使用协议的集合两类非......
  • 从零手写实现 nginx-31-load balance 负载均衡介绍
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对nginx原理感兴趣,可以阅读:从零......
  • Modbus转Ethernet/IP网关模块与汇川PLC通讯案例
    Modbus转Ethernet/IP网关模块(XD-MDEP100)是一种用于将Modbus协议转换为Ethernet/IP协议的设备。在汇川PLC通讯中,使用Modbus转Ethernet/IP网关模块可以方便地实现与其他设备的数据传输和通信。Modbus转Ethernet/IP网关模块(XD-MDEP100)连接到ETHERNET/IP总线中做为从站使用。Modb......
  • 编程世界的对决:JavaScript vs Java
    在编程领域,Java和JavaScript这两门语言各有千秋。它们不仅在语法上有着明显的区别,在编程理念、表现力、类型转换以及代码的易读性和复杂性方面也有着巨大的差异。本文将深入探讨JavaScript相较于Java的优势,以及两者在代码风格和开发体验上的不同。1.表现力的对比1.1JavaScr......