Nginx配置proxy protocol代理获取真实ip

Nginx配置proxy protocol


文章目录

  • Nginx配置proxy protocol
  • 前言
  • 一、PROXY Protocol协议
  • 二、配置方法
    • 代理服务器配置
      • http模块代理
      • ​​Stream 模块​代理
      • 测试配置是否生效
        • 端口检查
        • 测试ip记录
          • 验证http
          • 验证tcp
    • 注意事项和理解误区
    • 应用程序机器配置
  • 总结


前言

在现代开发中有很多场景需要拿到用户的真实ip,比如安全策略,和地区热点信息推送等功能,但是现在代理很多。用户可能会通过代理访问服务,或者黑客攻击的时候也会使用很多肉机隐藏其真实ip。接下来我们就来一起学习一下看怎么才能拿到真实的ip。


一、PROXY Protocol协议

PROXY Protocol 是一种由 HAProxy 作者 Willy Tarreau 于 2010 年设计的网络协议,旨在解决代理环境中后端服务器无法获取客户端真实信息(如源 IP、端口等)的问题。它通过在 TCP/UDP 连接建立后插入一个轻量级头部,实现客户端信息的透传,且与上层应用协议无关
它有两个版本:V1、V2

  • v1
    结构: PROXY <协议类型> <源IP> <目标IP> <源端口> <目标端口>
    特点:
    • 人类可读,便于调试。
    • 仅支持 TCP/IPv4/IPv6,无扩展能力。
    • 头部最大长度 108 字节(IPv6 场景)
  • v2
字段长度说明
签名(Signature)12 字节固定值 0x0D0A0D0A000D0A515549540A,标识 V2 协议
版本/命令(Ver/Cmd)1 字节高 4 位为版本号(0x2),低 4 位为命令(0x1=PROXY;0x0=LOCAL)
地址族/协议(Fam)1 字节高 4 位为地址族(IPv4/IPv6/UNIX),低 4 位为协议(TCP/UDP)
数据长度(Len)2 字节后续数据的长度(大端序)
地址数据(Addr)可变根据地址族存储源/目标 IP 和端口
TLV 扩展可变类型-长度-值结构,传递 SSL 证书、唯一 ID 等扩展信息

特点:

  • 高效​​:二进制解析速度快,适合高并发场景
  • 可扩展​​:通过 TLV 支持 SSL 信息(如证书 CN、加密算法)、唯一连接 ID 等
  • 多协议​​:支持 UDP、UNIX Socket 等

二、配置方法

现在内网测试有两台机器:
一台70,一台80;两台均为Linux机器
其中70是用于代理转发,把请求转发到80机器上进行处理
80就是部署程序的机器了
在这里插入图片描述

代理服务器配置

这里也就是指的70服务器
首先找到nginx对应的配置文件。一般路径都在:etc目录下
先切换到管理员权限:

sudo su

编辑配置文件命令

vi /etc/nginx/nginx.conf

配置内容

http模块代理

http {  # 使用 http 模块处理 HTTP 流量server {listen 8888 proxy_protocol;  # 启用 PROXY Protocol 解析server_name localhost;location / {proxy_pass http://192.168.1.80:7890/;#转发目标地址(应用程序部署服务器)# 传递真实 IP 到后端(需后端支持)proxy_set_header X-Real-IP       $proxy_protocol_addr;  # 真实客户端 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 兼容性头部proxy_set_header Host             $host;}}log_format tcp_log 'http->[$time_local] $proxy_add_x_forwarded_for → $server_addr ($status)';access_log /var/log/nginx/tcp_access.log tcp_log;#记录日志}

防火墙开放端口

sudo ufw allow 8888/tcp

​​Stream 模块​代理

这我配置了一下日志,方便后面测试查看配置是否起效


stream {server {listen 8880 proxy_protocol;  # 启用PROXY协议解析proxy_pass 192.168.1.80:7890;#转发目标地址(应用程序部署服务器)proxy_protocol on; #显示启动代理协议透传}log_format tcp_log 'tcp->[$time_local] $proxy_protocol_addr → $server_addr ($status)';access_log /var/log/nginx/tcp_access.log tcp_log;#记录日志
}

防火墙开放端口

sudo ufw allow 8880/tcp

注意

http模块代理和stream模块代理监听的端口不能是相同

修改配置文件后需要重启nginx

nginx -s reload

重启服务

systemctl restart nginx

测试配置是否生效

端口检查

重启成功后我们可以通过以下命令查看端口是否正常监听

sudo netstat -na | grep LIST | grep 8888

在这里插入图片描述
如果查看正常监听那就是配置成功了

测试ip记录
验证http

linux命令行输入以下命令(这里测试用的内网85的机器发起请求)

curl -H “X-Forwarded-For: 203.0.113.42” 192.168.1.70 8888

日志打印内容如下:

http->[22/Jul/2025:09:40:16 +0800] 203.0.113.42, 192.168.1.85 → 192.168.1.73 (200)

验证tcp

这里验证tcp我是采用的.net Core代码发起的tcp请求(181是我本机ip)
代码如下:

static void Main(string[] args)
{    try{// 创建 SocketSocket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 连接到NginxIPAddress ipAddress = IPAddress.Parse("192.168.1.73");IPEndPoint remoteEP = new IPEndPoint(ipAddress, 8880);socket.Connect(remoteEP);// 构造并发送PROXY Protocol v1头部string proxyHeader = $"PROXY TCP4 {GetLocalIP()} 192.168.1.73 {GetLocalPort(socket)} 8880\r\n";byte[] proxyHeaderBytes = Encoding.ASCII.GetBytes(proxyHeader);socket.Send(proxyHeaderBytes);// 发送实际数据string request = "123465";byte[] requestData = Encoding.ASCII.GetBytes(request);socket.Send(requestData);// 辅助函数:获取本地IPstring GetLocalIP(){return Dns.GetHostEntry(Dns.GetHostName()).AddressList.First(ip => ip.AddressFamily == AddressFamily.InterNetwork).ToString();}// 辅助函数:获取本地端口int GetLocalPort(Socket _socket){return ((IPEndPoint)_socket.LocalEndPoint).Port;}}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}
}

日志打印内容如下

tcp->[22/Jul/2025:10:16:32 +0800] 192.168.1.181 → 192.168.1.73 (200)

这里我们就可以看到我们模拟的proxy头里的ip了
流程如下
在这里插入图片描述

注意事项和理解误区

对于用户的真实ip获取需要注意的是,http请求可以从x-forwarded-for里获取,但是tcp请求就需要请求发起方携带prox头,不然nginx会返回400错误。

应用程序机器配置

程序中可以使用suerpsocket包,
SuperSocket 是一个用于 .NET 的高性能、可扩展的套接字服务器应用程序框架。它为构建自定义网络通信应用程序提供了强大的架构,支持包括 TCP、UDP 和 WebSocket 在内的多种协议。它2.0中还支持ProxyProtocol协议的支持。.

代码在程序中的位置:SuperSocket.Connection/ConnectionBase
在这里插入图片描述
程序git地址:传送们


总结

分享就到此结束啦,我也是菜鸟,如果有哪里说的不对的地方各位可留言。铁子们,还是努力学习,让自己变得更强吧,争取早日成为大佬。

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

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

相关文章

什么是商业智能BI数据分析的指标爆炸?

指标爆炸这个词大家可能都是第一次听说&#xff0c;指标怎么会爆炸呢&#xff1f;其实这个是我们很多年前在一些商业智能BI项目上总结出来的一种场景或者现象&#xff0c;就是过于的开放给业务人员在BI自助分析过程中创造了很多衍生性的分析指标&#xff0c;结果就造成了前端指…

Spring AI 系列之十八 - ChatModel

之前做个几个大模型的应用&#xff0c;都是使用Python语言&#xff0c;后来有一个项目使用了Java&#xff0c;并使用了Spring AI框架。随着Spring AI不断地完善&#xff0c;最近它发布了1.0正式版&#xff0c;意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

Linux学习之Linux系统权限

在上一篇的内容中我们学习到了Linux系统命令相关的知识及其相关的扩展内容&#xff0c;本期我们将学习Linux基础的另一个重要部分&#xff1a;Linux系统权限管理 作者的个人gitee&#xff1a;楼田莉子 (riko-lou-tian) - Gitee.com 目录 权限概念及必要性 什么是权限 为什么要…

Web3.0 能为你带来哪些实质性的 改变与突破

如今各种大厂裁员消息层出不穷&#xff0c;今年又添飞书、剪映、微软、思科... 这有一张网友整理的去年互联网大厂裁员裁员信息表&#xff1a; 目前国内很多大厂都在裁员&#xff0c;非常现实、且越来越多 35 技术人&#xff0c;正在面临这样的问题&#xff0c;那么Web3.0 确实…

doker centos7安装1

1.什么是doker Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;然后发布到任何支持 Docker 的操作系统上&#xff0c;实现 “一次构建&#xff0c;到处运行”。 容器是一种轻量级的虚拟化技术&#xff0c…

自动化面试题

1、什么是测试套件测试套件是多个测试用例的集合。2、搭建接口自动化框架中&#xff0c;你遇到最大的难点是什么&#xff0c;以及怎么解决的?测试数据动态管理难点:接口依赖动态参数(如Token、订单ID)&#xff0c;数据无法硬编码.解决方案:使用关联提取(如正则提取响应中的Tok…

【Linux】LVS(Linux virual server)环境搭建

一、LVS的运行原理1.1 LVS简介LVS:Linux Virtual Server&#xff0c;负载调度器&#xff0c;内核集成&#xff0c;章文嵩&#xff0c;阿里的四层SLB(Server LoadBalance)是基于LVSkeepalived实现LVS 官网: http://www.linuxvirtualserver.org/ LVS 相关术语 VS: Virtual Server…

算法竞赛备赛——【图论】求最短路径——Dijkstra

Dijkstra 用来计算从一个点到其他所有点的最短路径的算法&#xff0c;是一种单源最短路径算法。也就是说&#xff0c;只能计算起点只有一个的情况。Dijkstra的时间复杂度是O (|v|^2)&#xff0c;它不能处理存在负边权的情况。 邻接矩阵存图 #include<iostream> using …

影刀 RPA:批量修改 Word 文档格式,高效便捷省时省力

在日常办公和文档处理中&#xff0c;Word 文档格式的统一和规范是许多企业和个人用户的重要需求。无论是撰写报告、制作提案&#xff0c;还是整理资料&#xff0c;都需要确保文档格式的一致性。然而&#xff0c;手动修改多个 Word 文档的格式不仅耗时费力&#xff0c;还容易因疏…

GitLab 社区版 10.8.4 安装、汉化与使用教程

一、GitLab 安装 GitLab 提供了集成所需软件的 RPM 包&#xff0c;简化了安装流程。我们选择安装社区版&#xff08;CE&#xff09;10.8.4&#xff0c;可通过官方网站或国内镜像源&#xff08;如清华镜像&#xff09;获取安装包。 1. 准备工作 首先创建工具目录并进入&#…

[硬件电路-64]:模拟器件 -二极管在稳压电路中的应用

二极管在稳压电路中的应用主要基于其单向导电性和特定类型二极管&#xff08;如稳压二极管&#xff09;的电压稳定特性。以下是详细解释&#xff1a;一、普通二极管的稳压作用&#xff08;有限场景&#xff09;正向导通压降的利用&#xff1a;原理&#xff1a;普通二极管在正向…

【Linux】重生之从零开始学习运维之Nginx

安装apt/yum安装apt imstall nginx yum install nginxRocky源码编译安装基础编译环境yum install gcc make gcc-c glibc glibc-devel pcre pcre-devel openssl openssldevel systemd-devel zlib-devel yum install libxml2 libxml2-devel libxslt libxslt-devel php-gd gd-deve…

主流 MQ 的关键性能指标

常用消息队列&#xff08;MQ&#xff09;的“数量级”通常围绕吞吐量&#xff08;TPS&#xff0c;每秒处理消息数&#xff09;、消息堆积能力、延迟三个核心指标展开&#xff0c;不同MQ因设计目标&#xff08;高吞吐、低延迟、高可靠等&#xff09;不同&#xff0c;数量级差异显…

[NIPST AI]对抗性机器学习攻击和缓解的分类和术语

原文link&#xff1a;https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.100-2e2025.pdf Introduction 人工智能&#xff08;AI&#xff09;系统在过去几年中持续全球扩展。这些系统正在被众多国家开发并广泛部署于各自的经济体系中&#xff0c;人们在生活的许多领域都获得了更多使…

[深度学习] 大模型学习3上-模型训练与微调

在文章大语言模型基础知识里&#xff0c;模型训练与微调作为大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;应用构建的主要方式被简要提及&#xff0c;本系列文章将从技术原理、实施流程及应用场景等维度展开深度解析。相关知识的进一步参考见&#x…

Claude Code 启动提示 Note: Claude Code might not be available in your country. 解决

如下图所示 主播参考了在别的地方看来的解决方案&#xff08;并非主播不想标注来源&#xff0c;主要是忘记是哪里看来的了&#xff0c;下班就忘记了&#xff0c;懒得找了&#x1f62d;&#xff0c;如果后续找到会补上的&#xff09;。 好了&#xff0c;开始正文&#xff0c;开始…

Unity VR多人手术系统恢复3:Agora语音通讯系统问题解决全记录

&#x1f3af; 前言 这是一个Unity多人VR手术模拟项目&#xff0c;已经搁置了近两年时间。最近重新启动了这个项目&#xff0c;然而在恢复过程中却遇到了些的技术障碍。 项目重启遇到的挑战 当我们重新部署和测试系统时&#xff0c;发现原本运行良好的Agora语音通讯功能完全…

sqli-labs靶场通关笔记:第46-53关 order by注入

目录 第46关 order by注入 第47关 闭合的order by注入 第48关 无报错回显的数字型order by注入 第49关 无报错回显的闭合型order by注入 第50关 基于order by的堆叠注入 第51关 闭合的报错注入或堆叠注入 第52关 数字型盲注或堆叠注入 第53关 闭合的盲注或堆叠注入 第…

cdh6.3.2的hive使用apache paimon格式只能创建不能写报错的问题

前言根据官网paimon安装教程&#xff0c;看上去简单&#xff0c;实则报错阻碍使用的信心。 解决方法原带的jars下的zstd开头的包旧了&#xff0c;重新下载zstd较新的包单独放到每个节点的hive/lib下;然后将hdfs yarn用户下的mr-framework.tar.gz中的zstdjar包替换成新的版本。重…

【Vue进阶学习笔记】实现图片懒加载

创建Vue项目 首先确保你已安装Vue CLI&#xff0c;然后创建一个新的Vue 3项目&#xff1a; npm init vuelatest安装依赖 安装vueuse/core库&#xff0c;它提供了useIntersectionObserver组合式API&#xff1a; cnpm install cnpm install vueuse/core创建指令文件夹和文件 在sr…