使用阿里云负载均衡时获取客户端真实IP的方法

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 使用阿里云负载均衡时获取客户端真实IP的方法

很多用户朋友在使用阿里云负载均衡时,都有获取客户端真实IP的需求,并且还要求可以防止X-Forwarded-For伪造,这里笔者在这里向大家提供三种获取客户端真实IP的方法,其中第三种方法还可以防止X-Forwarded-For伪造。


实验环境说明:


  1. 本文均是基于 客户端 --> 负载均衡SLB --> ECS 这种网络架构测试。


  1. 本文提及到的域名 aliyunslb.osmonitor.cn 是解析到阿里云负载均衡SLB的IP上。


  1. 本文提及到的ECS安装的Web软件是Nginx。


  1. 本文提及到的主机名 beijing-ecs-1 是Web服务器(Nginx Server),主机名 aliyun 是客户端。



基础知识讲解


当用户访问网站时,大多数情况下并不是直接访问到Web服务器端的。而是客户端请求先到中间代理,再由代理转发给真实的Web服务器,这样就导致Web服务器端拿到的客户端IP会是中间代理设备的IP,而不是真实的客户端IP。


remote_addr


remote_addr指的是和Web服务器建立TCP连接的客户端IP。当我们的浏览器访问某个网站时,假设中间没有任何代理,那么就可以把remote_addr当为客户端IP;如果中间使用了某些代理(比如CDN、WAF、SLB等),那么我们的浏览器会先访问到代理,然后再由代理层层转发到真正的Web服务器,这时Web服务器拿到的remote_addr实际是上级代理设备的IP。也就是说,remote_addr其实代表的是和Web服务器"直连"(进行TCP三次握手)的客户端IP。


X-Forwarded-For


如前面所述,当我们的Web服务器前端部署有CDN、WAF、SLB等代理产品时,Web服务器就不知道真实的客户端IP了。为了避免这种情况,中间的代理服务器通常会在HTTP Request Header中增加一个叫做X-Forwarded-For的扩展头信息,X-Forwarded-For简称XFF头,其格式规定如下:

X-Forwarded-For: client, proxy1, proxy2

从上可以看出,X-Forwarded-For头信息可以有多个参数值,每个参数值之间用"英文逗号+空格"进行分隔,左边第一个参数值为真实的客户端IP,后边的就是曾经依次经过的代理设备的IP地址。


举个例子,某个客户端在访问到Web服务器之前,依次经过了3个代理产品,分别是CDN、WAF、SLB,这些代理产品的IP分别为IP1-CDN、IP2-WAF、IP3-SLB,用户真实IP为IP0,那么Web服务端最终会收到以下信息:

X-Forwarded-For: IP0, IP1, IP2

SLB直连Web服务器,它会在XFF头中追加IP2,表示它是在帮WAF转发请求。XFF头的值中并没有IP3,IP3可以在Web服务器上通过 $remote_addr 字段获得。


获取客户端真实IP的三种方法


第1种:传统获取法


传统获取法是指直接通过X-Forwarded-For扩展头获取客户端真实IP。

阿里云的负载均衡IP地址段是100.64.0.0/10,对应的主机地址范围是 100.64.0.1  - 100.127.255.254。

Nginx服务端配置如下图所示:



客户端发起访问:


Nginx服务端查看日志进行验证:


第2种:排除获取法


排除获取法是指通过http_realip_module模块解析X-Forwarded-For记录从而获得客户端真实IP。这是笔者自己起的方法名字,主要是为了方便理解和记忆。

阿里云官方文档对此方法亦有介绍,可以点此直接查看详情。

默认情况下,通过yum直接安装的Nginx,是已经集成有http_realip_module模块的,我们无需再手动编译添加该模块。


Nginx服务端配置如下图所示:

指令

说明

set_real_ip_from

指定前端代理产品的IP地址段。

如果前端有多层代理(例如客户端--CDN--WAF-SLB-ECS),那么要多次使用该指令,把前端所有代理产品(CDN、WAF、SLB)的IP地址段都写进来,不能只写一个代理的。

由于本文实验环境是:客户端--SLB--ECS,对于ECS中的Nginx来说,前端代理就是SLB,而SLB的IP地址段是 100.64.0.0/10,因此这个指令的值就需要填写为SLB的地址段 100.64.0.0/10 ,参见下方示例截图。

real_ip_header

表示让Nginx从SLB哪个Header头中提取真实IP。

real_ip_recursive

是否排除IP地址,这也是笔者定义为排除获取法名称的由来。

如果该指令的值设置为on,那么表示从右至左逐个检索并排除set_real_ip_from里面指定的IP,如果出现了不属于set_real_ip_from指令中的IP,那么这个IP将被认为是用户的真实IP,并被赋值给remote_addr变量。此时在日志中打印$remote_addr变量,就会看到客户端的真实IP地址。

客户端发起访问:


Nginx服务端查看日志进行验证:


第3种:另辟蹊径法


这也是笔者自己起的方法名字,主要是为了方便理解和记忆。


众所周知,和服务器直接建立TCP连接的客户端IP必定是客户端真实IP,必定是无法伪造的。目前很多云产品都会新增一个自定义Header头,把remote_addr(也就是和其直接建立TCP连接的客户端IP)的值赋给该字段,然后转发给后端服务器,那么后端应用只需要提取自定义Header头的值即可得到客户端的真实IP。


即使客户端知道了我们云产品新增的Header头,刻意去伪造该字段,也是行不通的。因为云产品无论如何都会强制把建立TCP连接的客户端IP赋给新增的这个Header头,通过这种方法去避免客户端伪造X-Forwarded-For头而导致后端应用无法通过X-Forwarded-For获取到客户端真实IP的情况发生。


例如,阿里云CDN在接收到客户端请求时,会新增一个名为Ali-CDN-Real-IP的Header头,CDN会把客户端的真实IP强制赋值给Ali-CDN-Real-IP字段,然后CDN回源时会带着这个新增的Header头。


再例如,阿里云SLB在接收到客户端请求时,会新增一个名为RemoteIp的Header头,SLB会把客户端的真实IP强制赋值给RemoteIp字段,然后SLB转发客户端请求给后端ECS时,也会带着新增的Header头。


在ECS中抓包可以看到SLB的请求Header头如下:


Nginx服务端配置如下图所示:


客户端发起访问:


Nginx服务端查看日志进行验证:


伪造X-Forwarded-For

客户端发起访问:

curl -I -X GET http://aliyunslb.osmonitor.cn -H "RemoteIp: 1.1.1.1" -H "X-Forwarded-For: 2.2.2.2"


Nginx服务端查看日志进行验证:


在ECS中抓包:


最后说明


通过对比以上3种方法,我们可以发现:


  1. 第1种方法是借助X-Forwarded-For头来获取到客户端真实IP,配置简单,但存在X-Forwarded-For伪造的缺点。


  1. 第2种方法也是借助X-Forwarded-For头来获取到客户端真实IP,配置复杂,需要把前端所有的代理产品的IP段全部写进去进行逐一排除,配置复杂,并且有的代理产品回源IP段不固定,实现起来也不容易。同时也存在X-Forwarded-For伪造的缺点。


  1. 第3种方法不借助X-Forwarded-For头,而是直接提取代理产品所插入的自定义Header头的值,来获取客户端真实IP,配置简单,也避免了X-Forwarded-For伪造的情况。
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
28天前
|
域名解析 移动开发 负载均衡
阿里云DNS常见问题之DNS负载均衡调加权模式失败如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
1月前
|
负载均衡 算法
ribbon的7种负载均衡算法和替换方法
ribbon的7种负载均衡算法和替换方法
34 0
ribbon的7种负载均衡算法和替换方法
|
2月前
|
弹性计算 安全 Linux
新手一键开服!阿里云3分钟成功幻兽帕鲁联机服务器流程方法
新手一键开服!阿里云3分钟成功幻兽帕鲁联机服务器流程方法,如何自建幻兽帕鲁服务器?基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了,一看就懂系列。本文是利用OOS中幻兽帕鲁扩展程序来一键部署幻兽帕鲁服务器,阿里云百科分享官方基于阿里云服务器快速创建幻兽帕鲁服务器教程:
|
3月前
|
弹性计算 Ubuntu Linux
【免费教程】阿里云服务器自建Palworld幻兽帕鲁32人联机服务器方法
今天来教大家怎么搭建自己的幻兽帕鲁游戏服务器,首先需要有一台性价比高的服务器。下面来看看怎么搭建幻兽帕鲁服务器吧。
171 0
|
1月前
|
负载均衡 Cloud Native 网络协议
阿里云负载均衡SLB
阿里云负载均衡SLB支持以下类型的负载均衡
55 3
|
1月前
|
弹性计算 Ubuntu Windows
阿里云自建《幻兽帕鲁Palworld》多人游戏专属服务器,搭建方法分享
对于《幻兽帕鲁》的忠实粉丝来说,与好友一同在游戏中探险、生存无疑增加了更多的乐趣。而为了实现这一愿望,搭建一个专属的多人游戏服务器就显得尤为重要。今天,我将为大家带来一篇极简教程,教您如何在三次点击内,轻松搭建《幻兽帕鲁》的专属服务器。
|
1月前
|
弹性计算 Ubuntu Linux
幻兽帕鲁Palworld服务器搭建教程,2024年阿里云部署帕鲁服务器保姆级方法
对于热爱《幻兽帕鲁》的玩家们来说,能够拥有属于自己的游戏服务器,无疑是提升了游戏的自由度和乐趣。那么,怎样才能部署幻兽帕鲁服务器呢?接下来,就让我们一起走进这个简单易懂、保姆级的教程吧!
120 0
|
2月前
|
移动开发 API
阿里云域名优惠口令及优惠口令获取方法,2024新版口令
2024年阿里云域名优惠口令,com域名续费优惠口令“com批量注册更享优惠”,cn域名续费优惠口令“cn注册多个价格更优”,cn域名注册优惠口令“互联网上的中国标识”,阿里云优惠口令是域名专属的优惠码,可用于域名注册、续费和转入使用,域名优惠口令区分域名后缀,阿里云百科分享2024年阿里云域名优惠口令更新(注册、转入、续费均可使用)
336 0
|
2月前
|
弹性计算 数据安全/隐私保护
2024年雾锁王国(Enshrouded)服务器怎么部署 阿里云上雾锁王国服务器部署方法
2024年雾锁王国(Enshrouded)服务器怎么部署 阿里云上雾锁王国服务器部署方法。雾锁王国(Enshrouded)作为一款热门多人在线游戏,为了给玩家提供稳定、流畅的联机体验,阿里云提供了高效便捷的快速部署解决方案,本文将为大家分享阿里云一键部署雾锁王国联机服务器详细教程。
|
2月前
|
存储 缓存 安全
阿里云网盘与相册问题之如何解除限制境外IP登录
阿里云网盘与相册是阿里云提供的云存储服务,用户可以安全便捷地存储和管理个人文件、照片等数据;本合集将介绍如何使用阿里云网盘和相册服务,包括文件上传、同步、分享,以及处理常见使用问题的技巧。
42 0