apisix透传客户端真实IP(real-ip插件)

news2025/5/21 4:04:58

文章目录

  • apisix透传客户端真实IP
    • 需求和背景
    • apisix real-ip插件
      • 为什么需要 trusted_addresses?
        • 安全架构的最佳实践
      • 示例场景
      • apisix界面配置

apisix透传客户端真实IP

需求和背景

当 APISIX 前端有其他反向代理(如 Nginx、HAProxy、云厂商的 LB)时,如何正确获取到真实的客户端 IP 地址。

默认情况下,APISIX 会将直接连接到它的那个代理服务器的 IP 视为客户端 IP ($remote_addr)。但真实的客户端 IP 通常被放在 X-Forwarded-For (XFF) 请求头中。

当 APISIX 位于反向代理(如负载均衡器、CDN)之后时,客户端的真实 IP 会被代理服务器的 IP 覆盖(例如,APISIX 看到的 remote_addr 是负载均衡器的 IP,而非用户的真实 IP)。

k8s 集群入口一般都需要过负载均衡,然后再到 apisix。
这时如果后台业务需要获取客户端 ip,可能拿到的是 lb 或者相关的内网 ip。

这里一般要获取真实 ip 需要做几个处理。

  1. 负载均衡上,一般支持配置获取真实 ip 参数,需要配置上。然后 lb 会把客户真实 ip 写入 x-forwarded-for 参数。
  2. apisix 上配置 real-ip 插件。作用和 nginx 的 realip 插件相同。

apisix real-ip插件

官方文档: https://apisix.apache.org/zh/docs/apisix/plugins/real-ip/

real-ip 插件是 Apache APISIX 的一个功能模块,用于通过 HTTP 请求头或查询字符串中的 IP 地址设置客户端的真实 IP,特别适用于 APISIX 位于反向代理后的场景。该插件类似于 NGINX 的 ngx_http_realip_module,但提供了更多灵活性,支持从 URI 参数、请求头或多层代理中获取真实 IP,并可通过配置可信地址和递归选项来精确控制 IP 替换逻辑。

  • 插件支持从 URI 参数(如 arg_realip)或请求头(如 X-Forwarded-For)中提取真实 IP。
  • 可配置 trusted_addresses 指定可信代理 IP 范围(支持 CIDR 表示法):
    • 只有请求的 remote_addr(直接连接的客户端 IP)在 trusted_addresses 列表中时,插件才会处理 IP 替换。
    • 避免恶意用户伪造 X-Forwarded-For 头篡改 IP,确保只有可信代理的请求能触发 IP 替换。
    • 确保只有受信任的代理(如负载均衡器、CDN)能触发 IP 替换,防止伪造攻击。
    • 不配置 trusted_addresses 或留空会完全禁用 IP 替换功能。
    • 支持单个 IP、CIDR 范围或多层代理递归处理

为什么需要 trusted_addresses?

在 Apache APISIX 的官方文档中,trusted_addresses 是 real-ip 插件的一个可选参数

当 APISIX 位于反向代理(如负载均衡器、CDN)之后时,客户端的真实 IP 会被代理服务器的 IP 覆盖(例如,APISIX 看到的 remote_addr 是负载均衡器的 IP,而非用户的真实 IP)。为了解决这个问题,代理服务器通常会在请求头(如 X-Forwarded-For)中附加用户的真实 IP。

风险:如果任何客户端都能直接访问 APISIX,并随意伪造 X-Forwarded-For 头,恶意用户可以通过篡改该头字段伪装成任意 IP,绕过安全策略(如 IP 黑名单或速率限制)。

攻击场景(无 trusted_addresses)
恶意用户直接访问 APISIX,伪造请求头

GET /api/data HTTP/1.1
Host: apisix.example.com
X-Forwarded-For: 6.6.6.6  # 伪造的 IP

APISIX 错误地将客户端 IP 识别为 6.6.6.6(实际是恶意用户的真实 IP)。

防御机制(启用 trusted_addresses)

  1. 配置只信任负载均衡器的 IP(如 203.0.113.10)
"trusted_addresses": ["203.0.113.10"]
  1. 只有通过负载均衡器的请求才会触发 IP 替换:
    负载均衡器转发请求时,remote_addr 是 203.0.113.10(可信)。
    插件读取 X-Forwarded-For 中的真实用户 IP(如 1.2.3.4)。

在理想的生产环境部署中,APISIX 的 IP 确实不应该直接暴露在公网,而是应该隐藏在反向代理(如负载均衡器、CDN、API 网关)之后,并通过安全组/防火墙严格限制访问来源。

因此,感觉这个配置不是很需要。APISIX 原本设计为内网服务,但被错误地绑定到公网 IP 或未启用认证。

防止内部威胁:

  • 攻击者可能通过内网横向移动(如入侵其他服务器后访问 APISIX)。
  • 恶意内部人员可能直接发送伪造请求。
安全架构的最佳实践
  1. 网络层隔离
    仅允许代理 IP 访问 APISIX:
# 示例:AWS Security Group 规则
允许入站 80/443 → 源IP: 负载均衡器(203.0.113.10)
拒绝其他所有流量

禁用公网绑定

# APISIX 配置中仅监听内网
listen 192.168.1.100:9080;
  1. 应用层防御(trusted_addresses)
{
  "real-ip": {
    "source": "header",
    "header": "X-Forwarded-For",
    "trusted_addresses": ["203.0.113.10", "192.168.1.0/24"]
  }
}
  1. 监控与告警
    检测异常请求(如直接访问 APISIX 的非代理 IP)。
    定期审计防火墙和代理配置。

总结
1…“APISIX 不暴露”是目标,但 trusted_addresses 是最后一道防线。
2. 安全 = 预防 + 检测 + 容错:即使你相信网络层万无一失,应用层仍需冗余保护。
3. 类比:就像你家有门锁(防火墙),但保险箱(trusted_addresses)仍需要密码。

示例场景

假设你的架构如下:

用户 → 负载均衡器(IP: 203.0.113.10) → APISIX(IP: 192.168.1.100) → 后端服务

负载均衡器会将用户真实 IP 放在 X-Forwarded-For 头中,例如:X-Forwarded-For: 1.2.3.4

配置 real-ip 插件

为了让 APISIX 信任负载均衡器的 IP(203.0.113.10),并替换客户端 IP 为 X-Forwarded-For 中的值(1.2.3.4),配置如下:

{
  "plugins": {
    "real-ip": {
      "source": "header",           // 从请求头获取 IP
      "header": "X-Forwarded-For",   // 指定头字段
      "trusted_addresses": ["203.0.113.10/32"]  // 只信任负载均衡器的 IP
    }
  }
}

递归查找(多层代理)
如果 X-Forwarded-For 包含多个 IP(如 1.2.3.4, 203.0.113.10),启用 recursive 会从右向左找到第一个非可信 IP:

{
  "source": "header",
  "header": "X-Forwarded-For",
  "trusted_addresses": ["203.0.113.10"],
  "recursive": true  // 递归查找
}

结果:客户端 IP 替换为 1.2.3.4(跳过可信的 203.0.113.10)。

apisix界面配置

在这里插入图片描述

  • source指,写入那个参数,一般是http_x_forwarded_for。
  • trusted_addresses指,set_real_ip_from,一般需要设置的内网ip地址。比如lb的内网地址,或者有内网转发的话,集群内网的ip地址。

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

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

相关文章

Oracle 数据库的默认隔离级别

Oracle 数据库的默认隔离级别 默认隔离级别:READ COMMITTED Oracle 默认使用 读已提交(READ COMMITTED) 隔离级别,这是大多数OLTP(在线事务处理)系统的标准选择。 官方文档 https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/da…

代码随想录算法训练营第六十四天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I

每日被新算法方式轰炸的一天,今天是dijkstra(堆优化版)以及Bellman_ford ,尝试理解中,属于是只能照着代码大概说一下在干嘛。 47. 参加科学大会 https://kamacoder.com/problempage.php?pid1047 dijkstra&#xff08…

开启健康生活的多元养生之道

健康养生是一门值得终身学习的学问,在追求健康的道路上,除了常见方法,还有许多容易被忽视却同样重要的角度。掌握这些多元养生之道,能让我们的生活更健康、更有品质。​ 室内环境的健康不容忽视。定期清洁空调滤网,避…

【Vite】前端开发服务器的配置

定义一些开发服务器的行为和代理规则 服务器的基本配置 server: {host: true, // 监听所有网络地址port: 8081, // 使用8081端口open: true, // 启动时自动打开浏览器cors: true // 启用CORS跨域支持 } 代理配置 proxy: {/api: {target: https://…

Spring Security与Spring Boot集成原理

Spring Security依赖的是过滤器机制,首先是web容器例如tomcat作为独立的产品,本身有自己的一套过滤器机制用来处理请求,那么如何将tomcat接收到的请求转入到Spring Security的处理逻辑呢?spring充分采用了tomcat的拓展机制提供了t…

VScode各文件转化为PDF的方法

文章目录 代码.py文件.ipynb文本和代码夹杂的文件方法 1:使用 VS Code 插件(推荐)步骤 1:安装必要插件步骤 2:安装 `nbconvert`步骤 3:间接导出(HTML → PDF)本文遇见了系列错误:解决方案:问题原因步骤 1:降级 Jinja2 至兼容版本步骤 2:确保 nbconvert 版本兼容替代…

Vue3学习(组合式API——Watch侦听器、watchEffect()详解)

目录 一、Watch侦听器。 (1)侦听单个数据。 (2)侦听多个数据。(数组写法?!) (3)immediate参数。(立即执行回调) (3)deep参数。(深层监…

【node.js】安装与配置

个人主页:Guiat 归属专栏:node.js 文章目录 1. Node.js简介1.1 Node.js的特点1.2 Node.js架构 2. Node.js安装2.1 下载和安装方法2.1.1 Windows安装2.1.2 macOS安装2.1.3 Linux安装 2.2 使用NVM安装和管理Node.js版本2.2.1 安装NVM2.2.2 使用NVM管理Node…

《AI大模型应知应会100篇》第62篇:TypeChat——类型安全的大模型编程框架

第62篇:TypeChat——类型安全的大模型编程框架 摘要 在构建 AI 应用时,一个常见的痛点是大语言模型(LLM)输出的不确定性与格式不一致问题。开发者往往需要手动解析、校验和处理模型返回的内容,这不仅增加了开发成本&a…

EdgeShard:通过协作边缘计算实现高效的 LLM 推理

(2024-05-23) EdgeShard: Efficient LLM Inference via Collaborative Edge Computing (EdgeShard:通过协作边缘计算实现高效的 LLM 推理) 作者: Mingjin Zhang; Jiannong Cao; Xiaoming Shen; Zeyang Cui;期刊: (发表日期: 2024-05-23)期刊分区:本地链接: Zhang 等 - 2024 …

火山 RTC 引擎9 ----集成 appkey

一、集成 appkey 1、网易RTC 初始化过程 1)、添加头文件 实现互动直播 - 互动直播 2.0网易云信互动直播产品的基本功能包括音视频通话和连麦直播,当您成功初始化 SDK 之后,您可以简单体验本产品的基本业务流程,例如主播加入房间…

Adminer:一个基于Web的轻量级数据库管理工具

Adminer 是一个由单个 PHP 文件实现的免费数据库管理工具,支持 MySQL、MariaDB、PostgreSQL、CockroachDB、SQLite、SQL Server、Oracle、Elasticsearch、SimpleDB、MongoDB、Firebird、Clickhouse 等数据库。 Adminer 支持的主要功能如下: 连接数据库服…

RK3568下QT实现按钮切换tabWidget

运行效果: 在 Qt 应用程序开发过程中,TabWidget 是一种非常实用的 UI 组件,它能够以选项卡的形式展示多个页面内容,帮助我们有效组织和管理复杂的界面布局。而在实际使用时,常常会有通过按钮点击来切换 TabWidget 页面的需求,本文将通过一个完整的示例,详细介绍如何在 Q…

2025 OceanBase 开发者大会全议程指南

5 月 17 日,第三届 OceanBase 开发者大会将在广州举办。 我们邀请数据库领军者与AI实践先锋,与开发者一起探讨数据库与 AI 协同创新的技术趋势,面对面交流 OceanBase 在 TP、AP、KV 及 AI 能力上的最新进展,深度体验“打破技术栈…

day017-磁盘管理-实战

文章目录 1. 硬盘命名规则2. 添加硬盘2.1 查看硬盘名称 3. 硬盘分区3.1 分区命名规则:mbr分区表格式3.2 创建分区:fdisk3.2.1 fdisk -l:查看硬盘及分区信息3.2.2 fdisk /dev/sdc :为该硬盘分区3.2.3 创建扩展分区和逻辑分区3.2.4 保存设置并退…

【成品设计】STM32和UCOS-II的项目

项目1:《基于STM32和UCOS-II的水质监测系统》 Ps:分为带系统版本和不带系统版本,功能都一样。 功能说明: 1. 单片机主控:STM32F103C8T6单片机作为核心控制。 2. 酸碱度传感器:实时采集当前PH值。 3. 水质…

Ngrok 配置:实现 Uniapp 前后端项目内网穿透

文章目录 一、下载并安装 ngrok二、配置 ngrok Authtoken三、启动本地 uniapp 项目四、使用 ngrok 暴露本地服务五、通过公网 URL 访问项目六、后端API项目的穿透问题排查 (uni-app 后端 API 示例)交互流程图示 七、ngrok Web 界面 (本地监控)八、停止 ngrok总结 ngrok 是一款…

鸿蒙ArkUI体验:Hexo博客客户端开发心得

最近部门也在跟进鸿蒙平台的业务开发,自己主要是做 Android 开发,主要使用 Kotlin/Java 语言。,需要对新的开发平台和开发模式进行学习,在业余时间开了个项目练手,做了个基于 Hexo 博客内容开发的App。鸿蒙主要使用Ark…

鸿蒙NEXT开发动画案例10

1.创建空白项目 2.Page文件夹下面新建Spin.ets文件,代码如下: interface TranslateOffset {x?:numbery?:number } /*** SpinKit动画组件 - SpinTen* author: CSDN-鸿蒙布道师* since: 2025/05/16*/ ComponentV2 export struct SpinTen {Require Para…

【Linux】Linux安装并配置Redis

目录 1.安装 2.启动服务 3.配置 3.1.绑定地址 3.2.保护模式 3.3.持久化选项 3.3.1.RDB 持久化 3.3.2.AOF 持久化 3.3.3.如何选择 1.安装 Redis 可以从默认的 CentOS 软件仓库中安装。运行以下命令来安装 Redis sudo dnf install redis -y 响应如下 2.启动服务 安装完成后&…