使用Nginx获取客户端真实IP(real_ip_header)

news/2024/9/17 7:48:58/ 标签: 服务器, 网络, nginx, lua

使用 Nginx 获取客户端真实 IP

在使用 Nginx 作为反向代理或负载均衡器时,我们常常需要获取客户端的真实 IP 地址。然而,默认情况下,Nginx 的 $remote_addr 变量记录的 IP 地址可能是上游代理或负载均衡器的 IP,而非实际客户端的 IP。为了确保我们能够正确获取和记录客户端的真实 IP,本文将介绍如何配置 Nginx,并进行调试。

一、配置 Nginx 获取客户端真实 IP

1、基本配置说明

首先,我们需要确保 Nginx 能够正确解析来自上游代理或负载均衡器的 X-Forwarded-For 头部信息。通过配置 real_ip_headerset_real_ip_from,Nginx 可以将 $remote_addr 更新为客户端的真实 IP。

示例配置

nginx">http {include       mime.types;default_type  application/octet-stream;server_tokens off;# 设置真实 IP 的头部信息real_ip_header X-Forwarded-For;# 指定可信任的上游代理 IP 范围,这里以 172.0.0.0/8 为例(就是你负载均衡的ip网段)set_real_ip_from 172.0.0.0/8;# 其他配置...
}
  • real_ip_header X-Forwarded-For;:指定从哪个头部获取客户端的真实 IP 地址。常见的头部包括 X-Forwarded-ForX-Real-IP 等。
  • set_real_ip_from 172.0.0.0/8;:指定哪些 IP 地址段的请求可以被信任。如果请求来自这些地址段,那么 Nginx 会根据 real_ip_header 的配置更新 $remote_addr

在 Nginx 中,set_real_ip_from 指令用于定义哪些 IP 地址或 IP 地址段是被信任的。根据请求来源 IP 地址是否在 set_real_ip_from 指定的范围内,Nginx 的行为会有所不同,具体区别如下:

2、set_real_ip_from详解

1. 请求来源 IP 在 set_real_ip_from 范围内

如果请求来源的 IP 地址在 set_real_ip_from 指定的范围内,Nginx 会信任该请求,并使用 real_ip_header 指定的头部(如 X-Forwarded-For)中的值作为客户端的真实 IP 地址。

行为:
  • Nginx 使用 X-Forwarded-For 头中的第一个(最左边的)IP 地址作为 $remote_addr(即客户端的真实 IP 地址)。
  • 这种情况通常出现在负载均衡器或反向代理服务器前端,它们会添加 X-Forwarded-For 头来指示真实的客户端 IP。
2. 请求来源 IP 不在 set_real_ip_from 范围内

如果请求来源的 IP 地址不在 set_real_ip_from 指定的范围内,Nginx 不会信任这个请求中的 X-Forwarded-For 头部中的 IP 地址。

行为:
  • Nginx 直接使用请求来源的 IP 地址(即 $remote_addr)作为客户端的 IP 地址。
  • 这意味着 Nginx 会将负载均衡器或代理服务器的 IP 地址视为客户端的 IP,而不会考虑 X-Forwarded-For 头中的值。
场景分析:
  • 在范围内: 如果你有一个负载均衡器,所有请求都会先经过它再到达 Nginx。负载均衡器会在请求头中加入 X-Forwarded-For 以记录客户端的真实 IP。如果你将负载均衡器的 IP 地址配置在 set_real_ip_from 中,Nginx 会读取并信任 X-Forwarded-For 中的客户端真实 IP。

  • 不在范围内: 如果请求不是通过你信任的负载均衡器发来的(可能是直接访问 Nginx,或者来自不可信的代理服务器),Nginx 会认为这个请求中的 X-Forwarded-For 不可信,于是使用实际请求来源 IP(负载均衡器或代理的 IP 地址)作为客户端 IP。

3、log_format 配置(参考)

配置日志格式时,可以直接使用 $remote_addr 变量。Nginx 在解析 real_ip_header 后,会自动将 $remote_addr 替换为解析后的真实 IP 地址。

日志格式配置

nginx">log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
  • $remote_addr:在配置了 real_ip_header 之后,这个变量将代表客户端的真实 IP 地址。

二、调试与测试

为了确保配置正确,我们可以使用一个简单的调试日志来测试 X-Forwarded-For 头部的内容。

  1. 添加调试日志

    可以通过下面的配置,将 X-Forwarded-For 头部记录到一个专门的调试日志文件中。

    调试日志配置

    nginx">log_format debug '$http_x_forwarded_for';
    access_log /path/to/log/debug.log debug;
    

    通过这一配置,你可以在调试过程中直接查看 X-Forwarded-For 头部的内容,以确认它是否包含客户端的真实 IP 地址。

  2. 检查调试日志

    配置完成后,重启 Nginx,并通过访问应用生成一些日志。然后,查看调试日志 /path/to/log/debug.log 以验证 X-Forwarded-For 头部的值。

    tail -f /path/to/log/debug.log
    

    如果 X-Forwarded-For 头部中包含了客户端的真实 IP 地址,那么说明配置正确,Nginx 能够正确获取并记录客户端的真实 IP。

三、Lua 中使用客户端真实 IP(参考)

在实际应用中,如果你使用了 OpenResty 或 Nginx 的 Lua 模块,可以在 Lua 代码中使用 ngx.var.remote_addr 来获取解析后的真实 IP。

示例代码

lua">access_by_lua "
local uid = ngx.var.cookie_bb_id
if not uid thenuid = ngx.md5(ngx.now() .. ngx.var.remote_addr .. ngx.var.http_user_agent)ngx.header['Set-Cookie'] = 'bb_id=' .. uid .. '; path=/; Expires=' .. ngx.cookie_time(ngx.time() + 3650*86400) .. '; Secure; SameSite=None'
end
";

在上面的 Lua 代码中,ngx.var.remote_addr 会获取到解析后的客户端真实 IP。这在用户跟踪或日志记录中非常有用。

四、总结

通过正确配置 real_ip_headerset_real_ip_from,我们可以确保 Nginx 能够通过 $remote_addr 获取并记录客户端的真实 IP 地址。在配置完成后,通过调试日志可以验证配置是否生效。如果你在 Lua 中需要获取真实 IP,可以直接使用 ngx.var.remote_addr

这篇博客介绍了如何配置、调试并验证 Nginx 的真实 IP 获取配置,希望能对你有所帮助。如果你在实际操作中遇到其他问题,欢迎进一步探讨!


http://www.ppmy.cn/news/1522434.html

相关文章

MySQL · 性能优化 · 提高查询效率的实用指南(上)

前言 在过去的几年里,MySQL作为一款开源数据库,因其稳定性和性能得到了广泛的应用。始终保持着强劲的增长趋势,越来越多的企业和开发者将其作为首选数据库,甚至有部分企业从Oracle迁移至MySQL。然而,随着使用的普及&a…

Django中的第一个自动化测试编写

跟着Django官网中的投票应用学习,其中有官方说明的一个bug:如果 Question 是在一天之内发布的,那么这个Question 应该显示“published_recently”,返回值为True ,然而现在如果问题发布时间为30天之后(未来时间),也会返…

防封!数字人直播防封!铭顺科技AI数智人抖音直播防封落地方案!!

数字人直播防不防封? 数字人直播有没有流量? 数字人直播能不能落地? 这是目前所有想入局AI数字人赛道、想用数字人直播、想做数字人项目的老板们最担心、最关心的问题!但是,同行友商对此都噤若寒蝉,不敢跟…

手机同时传输USB功能与充电的实现及LDR6500的作用

在智能设备日益普及的今天,用户对于手机的功能需求愈发多样化,其中同时实现USB数据传输与充电功能成为了许多用户的迫切需求。这一功能的实现离不开先进的硬件技术和创新的芯片解决方案,而LDR6500正是这样一款能够满足这一需求的USB PD&#…

Spark与Kafka进行连接

在Java中使用Spark与Kafka进行连接,你可以使用Spark Streaming来处理实时流数据。以下是一个简单的示例,展示了如何使用Spark Streaming从Kafka读取数据并进行处理。 1. 引入依赖 首先,在你的pom.xml文件中添加必要的依赖项(假设…

nginx配置负载均衡的几种方式

1,轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down掉,能自动剔除。 # 反向代理配置upstream server_list{# 这个是tomcat的访问路径server localhost:8080;server localhost:9999;}serv…

八股集合1

在HTTPS中,加密方法主要包括两种类型的加密技术:非对称加密(也称为公钥加密)和对称加密。这两种加密技术在HTTPS握手过程中协同工作,确保数据的安全传输。下面是具体的加密方法及其作用: 公钥加密 (非对称…

无人机飞控之光流知识小结

要完成飞行器的定位,则必须要有位置的反馈数据。在户外,我们一般使用GPS作为位置传感器,然而,在室内,GPS无法使用,要完成定位功能,可以选用光流传感器。 本讲主要介绍如何通过下视摄像头估计飞…

K12智慧校园云平台源码,智慧校园小程序源码,支持PC+小程序,提供丰富的API接口,支持和其他系统的融合对接

智慧校园平台是目前教育信息化领域的热点之一。随着数字化转型的加速,越来越多的学校开始寻求解决方案,以提高教育管理的效率和质量。 智慧校园电子班牌系统是一种集成信息化技术、物联网、智能化的教育管理解决方案,它在校园内实现了信息共…

四个pdf软件分享,你更爱哪一款?

如果说现在用的最多的电子文档是什么,不是Word就是PDF,所以PDF编辑器几乎成了我们日常工作中不可或缺的工具。但面对市面上琳琅满目的PDF编辑器,到底哪一款才是你的菜呢?今天,我就来和大家聊聊我用过的四款编辑器&…

【重学 MySQL】十六、算术运算符的使用

【重学 MySQL】十六、算术运算符的使用 加法 ()减法 (-)乘法 (*)除法 (/ 或 div )取模(求余数) (% 或 mod )注意事项 在 MySQL 中,算术运算符用于执行数学运算,如加法、减法、乘法、除法和取模(求余数)等。…

Html、Css3动画效果

文章目录 第九章 动画9.1 transform动画9.2 transition过渡动画9.3 定义动画 第九章 动画 9.1 transform动画 transform 2D变形 translate():平移函数,基于X、Y坐标重新定位元素的位置 scale():缩放函数,可以使任意元素对象尺…

选择服务器机柜租用要注意哪些方面?

企业在进行选择服务器租用和托管后,大多数的企业会选择租用服务器机柜来进行放置,同时机房中也有着不同款式的机柜,使计算机行业中不可或缺的用品,那我们在选择服务器机柜租用时需要注意哪些方面呢? 接下来就让我们了解…

Flask如何创建并运行数据库迁移

Flask创建并运行数据库迁移的过程是一个涉及多个步骤的操作,旨在帮助开发者在开发过程中管理数据库模式的变化,而不需要手动地删除和重建数据库表,从而避免数据丢失。以下是一个详细的步骤说明: 一、准备工作 1. 安装必要的包 …

紫色UI趣味测试小程序源码,包含多种评测

紫色UI趣味测试小程序源码,包含多种评测。 该源码里面包含了多种评测,每一种评测都包含大多小细节。 代码下载

计算机基础知识复习9.6

点对点链路:两个相邻节点通过一个链路相连,没有第三者 应用:PPP协议,常用于广域网 广播式链路:所有主机共享通信介质 应用:早期的总线以太网,无线局域网,常用于局域网 典型拓扑结…

CentOS7虚拟机下安装及使用Docker

文章目录 一,准备工作二、安装Docker三、启动Docker四、验证Docker五、使用Docker六,卸载Docker 有一个Centos7的虚拟机,想要安装个docker测试一些docker用法和熟悉命令 一,准备工作 1,使用uname -r命令检查系统内核…

2024国赛数学建模B题完整分析参考论文38页(含模型和可运行代码)

2024 高教社杯全国大学生数学建模完整分析参考论文 B 题 生产过程中的决策问题 目录 摘要 一、问题重述 二、问题分析 三、 模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码(仅供参考) 4.…

2024最新!Facebook手机版和网页版改名教程!

Facebook作为全球最大的社交平台之一,允许用户自定义名字和昵称。在Facebook更新姓名可以帮助您更好的展现账号形象。本文将为您提供详细的步骤指导,帮助您在手机APP和网页版上轻松完成Facebook改名操作。 Facebook手机版改名 打开Facebook APP并登录账号…

SAP学习笔记 - 开发02 - BTP实操流程(账号注册,BTP控制台,BTP集成开发环境搭建)

上一章讲了 BAPI的概念,以及如何调用SAP里面的既存BAPI。 SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI-CSDN博客 本章继续讲开发相关的内容,主要就是BTP的实际操作流程,比如账号注册,登录&#…