ngx_http_realip_module 模块概述

一、使用场景

  • 日志记录
    记录真实客户端 IP 而非反向代理的 IP,有助于流量分析和安全审计。
  • 访问控制
    基于真实 IP 实现防火墙规则(allow/deny)或限流,而非误将上游 IP 视为客户端。
  • GeoIP、WAF、限速等功能
    模块化的上游真实 IP 支持与诸如 ngx_http_geoip_modulelimit_req、WAF 插件等配合使用。

二、示例配置

http {# 信任的上游地址列表(CIDR、单 IP 或 unix 域 socket)set_real_ip_from  192.168.1.0/24;set_real_ip_from  10.0.0.0/8;set_real_ip_from  unix:;# 指定从哪个请求头获取真实地址# 常见的有:X-Real-IP、X-Forwarded-For、proxy_protocolreal_ip_header    X-Forwarded-For;# 开启递归模式时,将跳过链中信任的上游,选取第一个非信任地址real_ip_recursive on;server {listen 80;location / {# 此时 $remote_addr 是真实客户端 IPproxy_pass http://backend;}}
}

三、指令详解

1. set_real_ip_from

Syntax:   set_real_ip_from address | CIDR | unix:;
Default:  —;
Context:  http, server, location
  • address | CIDR:IPv4/IPv6 网络或单地址,如 192.168.2.12001:db8::/32
  • unix::信任所有 UNIX 域套接字连接。
  • 用途:指定哪些上游代理地址可信,只有来自这些源的请求头中携带的 IP 才会被视为真实客户端。

注意

  • 支持主机名(1.13.1 起),解析后再进行匹配。
  • IPv6 支持自 1.2.1/1.3.0 起。

2. real_ip_header

Syntax:   real_ip_header field | X-Real-IP | X-Forwarded-For | proxy_protocol;
Default:  real_ip_header X-Real-IP;
Context:  http, server, location
  • field:HTTP 请求头名,常见有 X-Real-IPX-Forwarded-For
  • proxy_protocol:从 PROXY 协议头部获取地址,需先在 listen 中启用 proxy_protocol
  • 端口替换:若头部中同时包含 IP:PORT,则还可替换 $remote_port

3. real_ip_recursive

Syntax:   real_ip_recursive on | off;
Default:  real_ip_recursive off;
Context:  http, server, location
  • off(默认):取请求头最末尾(最后一个)IP,只要发现第一个可信代理,即替换为该代理后面的 IP。
  • on:递归查找,跳过所有可信代理,取第一个非信任地址,适用于多级反代场景。

四、内置变量

变量含义
$realip_remote_addr原始客户端 IP(被替换前的 $remote_addr
$realip_remote_port原始客户端端口(被替换前的 $remote_port

这些变量可用于日志或者后续条件判断,方便同时保留“原始代理IP”与“替换后真实IP”。

五、处理流程

  1. 接收请求
    Nginx 监听到请求,初始 $remote_addr 为 TCP 连接的对端地址。

  2. 匹配可信源
    检查该地址是否在任一 set_real_ip_from 列表中。

  3. 提取头部值
    读取 real_ip_header 指定的头部字段,按逗号拆分(若是 X-Forwarded-For,可能包含多级 IP)。

  4. 选取 IP

    • real_ip_recursive off:取列表末尾(最后一个)IP;
    • real_ip_recursive on:倒序遍历,跳过可信源,取第一个非信任 IP。
  5. 替换地址
    更新 $remote_addr(及可选 $remote_port),并记录旧值至 $realip_remote_addr

  6. 继续其它模块处理
    后续日志、WAF、限速等模块均以新的 $remote_addr 为准。

六、常见注意事项

  • 安全性
    仅信任可信网络或反向代理,避免客户端伪造 X-Forwarded-For 欺骗源 IP。
  • 多级代理
    开启 real_ip_recursive on 以正确获取最初客户端 IP;否则仅能获取到第一级代理前的 IP。
  • PROXY 协议
    使用 proxy_protocol 时,需要在 listen ... proxy_protocol; 中启用,并由上游(如 LVS、HAProxy)发送 PROXY 首部。
  • 端口保留
    若需要真实端口信息,可在头部中附加 <ip>:<port> 格式,并确保 Nginx 版本 ≥1.11.0。

通过 ngx_http_realip_module,可以在 Nginx 层面安全、灵活地恢复原始客户端 IP 和端口,为日志、限流、安全防护等功能提供可靠的基础。

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

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

相关文章

实战5:个性化数字艺术生成与销售

盈利思路 数字艺术销售&#xff1a; 平台销售&#xff1a;将生成的数字艺术作品上传到像OpenSea、Foundation等NFT平台进行售卖。每一件独特的艺术品可以通过NFT技术保证其唯一性&#xff0c;吸引收藏家和投资者。 定价策略&#xff1a;根据作品的复杂度、创意性以及市场需求来…

游戏引擎学习第303天:尝试分开对Y轴和Z轴进行排序

成为我们自己的代码精灵α 所以现在应该可以正常使用了。不过&#xff0c;这两周我们没办法继续处理代码里的问题&#xff0c;而之前留在代码里的那个问题依然存在&#xff0c;没有人神奇地帮我们修复&#xff0c;这让人挺无奈的。其实我们都希望有个神奇的“代码仙子”&#…

InetAddress 类详解

InetAddress 类详解 一、核心作用 封装 IP 地址&#xff1a;同时支持 IPv4 和 IPv6 地址域名解析&#xff1a;将域名转换为 IP 地址&#xff08;DNS 查询&#xff09;地址验证&#xff1a;检查网络地址的有效性无构造方法&#xff1a;通过静态工厂方法获取实例 二、核心方法 …

spring cloud alibaba-Geteway详解

spring cloud alibaba-Gateway详解 Gateway介绍 在 Spring Cloud Alibaba 生态系统中&#xff0c;Gateway 是一个非常重要的组件&#xff0c;用于构建微服务架构中的网关服务。它基于 Spring Cloud Gateway 进行扩展和优化&#xff0c;提供了更强大的功能和更好的性能。 Gat…

iOS 直播技术及优化

iOS直播技术的实现和优化涉及多个技术环节&#xff0c;需结合协议选择、编解码方案、播放器技术及性能调优等多方面。 一、核心技术实现 协议选择与传输优化 HLS&#xff08;HTTP Live Streaming&#xff09;&#xff1a;苹果官方推荐&#xff0c;基于HTTP分片传输&#xff0c…

目标检测135个前沿算法模型汇总(附源码)!

目标检测是计算机视觉核心方向之一&#xff0c;也是发论文的热门领域&#xff01; 近来不仅YOLO算法迎来了新突破&#xff0c;迭代出YOLOv12&#xff01;Mamba、大模型等新技术的发展&#xff0c;也给该领域注入了全新的力量&#xff0c;取得了诸多显著成果。比如性能飙升82.3…

期刊采编系统安装升级错误

我们以ojs系统为例&#xff1a; PHP Fatal error: Uncaught Error: Call to a member function getId() on null in /esci/data/html/classes/install/Upgrade.inc.php:1019 Stacktrace: #0 /esci/data/html/lib/pkp/classes/install/Installer.inc.php(415): Upgrade->con…

浅谈无服务器WebSocket的优势

实际上&#xff0c;一个实用的解决方案是将构建业务关键型实时平台的复杂性卸载到专门的云服务中。 完全托管的无服务器 WebSocket 解决方案为事件驱动的消息传递提供了基础结构;它使底层基础设施成为一种商品。客户端使用提供程序服务发送/接收低延迟消息&#xff0c;并专注于…

Python数据可视化高级实战之二——热力图绘制探究

目录 一、热力图的作用 二、热力图反映的信息类型 三、热力图的典型应用场景 1. 地球信息系统 (GIS) 2. 城市交通分析 3. 市场分析 4. 用户行为分析 5. 网络流量分析 6. 传染病传播分析 7. 社交媒体舆情分析 四、Python 绘制热力图的关键技术要点 1. 数据预处理 2. 颜色选择与渐…

配电网运行状态综合评估方法研究

1评估指标体系的构建 [1]冷华,童莹,李欣然,等.配电网运行状态综合评估方法研究[J].电力系统保护与控制,2017,45(01):53-59. 1.1评估范围 图1为配电系统组成示意图&#xff0c;其中A、B、C分别表示高、中、低压配电系统。高压配变(也称主变)将35kV或110kV的电压降到10kV&#…

Docker安装MinIO对象存储中间件

MinIO 是一个高性能、分布式的对象存储系统&#xff0c;兼容 Amazon S3 云存储服务协议&#xff0c;广泛应用于企业存储、大数据、机器学习和容器化应用等领域。以下是详细介绍&#xff1a; 核心特点 兼容 S3 API &#xff1a;全面兼容 Amazon S3 API&#xff0c;这意味着使用…

HTML回顾

html全称:HyperText Markup Language(超文本标记语言) 注重标签语义,而不是默认效果 规则 块级元素包括: marquee、div等 行内元素包括: span、input等 规则1:块级元素中能写:行内元素、块级元素(几乎什么都能写) 规则2:行级元素中能写:行内元素,但不能写:块…

JAVA Spring MVC+Mybatis Spring MVC的工作流程*,多表连查

目录 注解总结 将传送到客户端的数据转成json数据 **描述一下Spring MVC的工作流程** 1。属性赋值 BeanUtils.copyProperties(addUserDTO,user); 添加依赖&#xff1a; spring web、mybatis framework、mysql driver Controller和ResponseBody优化 直接改成RestControl…

H2数据库中一条insert语句到生成java对象到数据写入磁盘的完整步骤

H2 数据库将 SQL 语句转换为磁盘存储的全过程可以分为以下 8 个关键步骤&#xff0c;我们以 INSERT INTO users (id, name) VALUES (1, Alice) 为例详细说明&#xff1a; 1. SQL 解析与语法树生成 词法分析&#xff1a;拆分语句为 INSERT、INTO、users 等 Token语法分析&#…

重磅升级!Google Play商店改版上线

5 月 21 日消息&#xff0c;Android Headline 今天&#xff08;5 月 21 日&#xff09;发布博文&#xff0c;报道称在 2025 年 I/O 开发者大会上&#xff0c;谷歌宣布更新 Google Play 应用商店&#xff0c;在优化用户体验的同时&#xff0c;提升开发者收益。 本次更新中&…

Docker面试题(1)

什么是Docker 一个容器化平台 形式是容器 将你的应用程序及所有依赖项打包在一起 确保应用程序在任何环境中无缝运行 什么是Docker镜像 Docker镜像是Docker容器的源代码 用于创建容器 使用build命令创建镜像 什么是 Docker容器 包括应用程序及所有的依赖项 作为操作系统的独立进…

Ulisses Braga-Neto《模式识别和机器学习基础》

模式识别和机器学习基础 [专著] Fundamentals of pattern recognition and machine learning / (美)乌利塞斯布拉加&#xff0d;内托(Ulisses Braga-Neto)著 ; 潘巍[等]译 推荐这本书&#xff0c;作者有自己的见解&#xff0c;而且提供代码。问题是难度高&#xff0c;对于初学…

RabbitMQ的简介

三个概念 生产者&#xff1a;生产消息的服务消息代理&#xff1a;消息中间件&#xff0c;如RabbitMQ消费者&#xff1a;获取使用消息的服务 消息队列到达消费者的两种形式 队列&#xff08;queue&#xff09;:点对点消息通信&#xff08;point-to-point&#xff09; 消息进入队…

自动切换剪贴板路径中反斜杠为正斜杠

有时候需要将我们常见的win全路径中反斜杠为正斜杠&#xff0c;每次用记事本&#xff0c;编辑替换非常麻烦&#xff0c;于是写了这个工具&#xff0c;能自动修改剪贴板中的数据&#xff0c;只需要运行一下即可。 实现效果&#xff0c;将类似于下面的路径&#xff1a; C:\User…

【时时三省】Python 语言----文件

目录 1,文件打开 2, 文件关闭 3, 文件写入 4, 文件读出 5, 文件定位 6, 文件重命名 7, 复制文件 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,文件打开 file = open(file, mode, buffering, encoding, errors, newline, closefd, opener) 2, 文…