某云负载均衡真实IP的问题,我们这边已经遇到过两次了。而且每次和售后沟通的时候都大费周折,主要是要给售后说明白目前文档的获取真实IP是有问题的,他们觉得文档上说明的肯定没问题,售后要是不明白,他们不会给LB部门上报,这个事就没法推进。

我们这边的简单的网络架构设这样的。

DNS->负载均衡->web机组

按照文档说明获取客户端真实IP

七层负载均衡(HTTP或HTTPS协议)服务需要对应用服务器进行配置,然后使用X-Forwarded-For的方式获取客户端的真实源IP地址。真实的客户端源IP存放在HTTP头部的X-Forwarded-For字段,格式如下:

X-Forwarded-For: 用户真实IP, 代理服务器1-IP, 代理服务器2-IP,...

当使用此方式获取客户端真实IP时,获取的第一个地址就是客户端真实IP。

我们第一版的获取IP就是按照文档的要求这么写的。

被伪造IP攻击了

某一天,网站接口不停被打,一看攻击IP地址都是一样的,首先想到的是封IP,封了之后还是被打,真实服了,以为代码有问题,检查很多遍确定不是代码的问题,发现攻击IP不停变,又想到会不会购买什么动态IP的服务,user-agent是固定,而且IP地址是按数字累加的,比如刚开始是1.1.1.1,后来是1.1.1.2,再后来1.1.1.3,而且X-Forwarded-For这个头,比正常访问多了一层IP。

然后仔细分析了一下,首先觉得X-Forwarded-For获取IP的方式是有漏铜的,因为所有的请求头都是可以在客户端伪造的,所以我们测试了一下,

curl https://www.aaa.com -H"X-Forwarded-For:1.1.1.1"

通过这种方式,确实拿到了错误的真实ip。

真实IP只有负载均衡知道,因为建立连接的时候可以通过remote_addr拿到真实的IP,只有这种是可信的,如果这个IP错误的话,就无法三次握手建立连接。

没办法,提工单找售后,答复只这样的

您好,目前七层监听都是基于X-Forwarded-For 来获取客户端真实ip 信息的,或者您可以考虑下使用slb 四层监听。

觉得这样简单的东西肯定有啊,一个公有云怎么会没有真实IP。自己在上游服务抓包观察了一下,发现有一个这样的头 RemoteIp,我发现我不管怎么伪造X-Forwarded-For,RemoteIp都是正确的IP。然后找售后确定一下我们的猜测,果然是这个。

您好,RemoteIp也是真实ip,是LB防止 x_forwarded_for 伪造。

改完代码,一切顺利

IP地址又错了

IP地址好几年没出问题了,上个月有用户反馈,IP地址错了,我们网站按照要求,评论需要展示所在地理位置,我TM在苏州啊,怎么给我整到西安去了,没去过啊。

没办法,只能去提工单了。

然后售后说是我们不能使用RemoteIp,应该按照文档说明使用 x_forwarded_for,为了说明 x_forwarded_for 没问题,给我做了各种实验,x_forwarded_for 这个问题从周五下午一直给售后扳扯到周六,说不通了,还贴出了几年前的咨询工单,最后售后大哥终于说了一句,我跟LB部门反馈一下。

大概过了半个小时就有结果了,结果是因为我们开了waf防火墙。售后给的答复。

1、Client -- WAF -- LB -- 上游服务 这种架构 ,那么就得取  X-Real-IP  或X-True-IP 字段获取客户端真实IP。
2、Client -- LB -- 上游服务 这种架构 ,那么就得取 RemoteIp 获取客户端真实IP。

然后改了一下代码,先检查头里面有没有X-True-IP,如果有就使用X-True-IP,如果没有就使用RemoteIp。

某云负载均衡获取客户端真实IP的问题的更多相关文章

  1. Nginx作为负载均衡把客户端真实IP发送给后端配置

    Nginx作为负载均衡获取到客户端的真实IP,但是后端获取到的IP为nginx负载均衡的IP,需要修改配置使后端获取到客户端的真实IP 修改nginx配置增加3行 proxy_set_header H ...

  2. Kubernets中获取客户端真实IP总结

    1. 导言 绝大多数业务场景都是需要知道客户端IP的 在k8s中运行的业务项目,如何获取到客户端真实IP? 本文总结了通行的2种方式 要答案的直接看方式一.方式二和总结 SEO 关键字 nginx i ...

  3. Java Web 获取客户端真实IP

    Java Web 获取客户端真实IP 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP.一般分为两种情况: 方 ...

  4. 获取客户端真实IP地址

    Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: ...

  5. Java 获取客户端真实IP地址

    本文基于方法 HttpServletRequest.getHeader 和 HttpServletRequest.getRemoteAddr 介绍如何在服务器端获取客户端真实IP地址. 业务背景 服务 ...

  6. 获取客户端真实ip

    // 获取客户端真实ip() protected function getIP() { global $ip; if (getenv("HTTP_CLIENT_IP")) $ip ...

  7. nginx 代理模式下,获取客户端真实IP

    最近做博友推荐,发现个小问题,用$_SERVER['REMOTE_ADDR'];得到的都是服务器的地址192.168.96.52,搜索了一下,发现问题,改为$_SERVER['HTTP_X_REAL_ ...

  8. Nginx反向代理后应用程序获取客户端真实IP

    Nginx反向代理后,Servlet应用通过request.getRemoteAddr()取到的IP是Nginx的IP地址,并非客户端真实IP,通过request.getRequestURL()获取的 ...

  9. 伪造IP及获取客户端真实IP地址

    Fiddler支持自定义规则,可以实现对HTTP请求数据发送给Server前或HTTP应答数据发送给浏览器前进行修改.下面的例子将演示如何向所有HTTP请求数据中增加一个头.1)打开Fiddler,点 ...

随机推荐

  1. MATLAB复习资料——浙商大管工学院适用

    包含12套复习卷,课堂PPT 下载链接:MATLAB练习模拟题库(12套).pdf - 蓝奏云 (lanzoub.com)

  2. Arm32进行远程调试

    Arm 32bit Goland 远程调试 32位支持issue Goland配置Go remote支持文档 https://mojotv.cn/go/golang-remote_debug Delv ...

  3. 数据仓库模型之CDM、LDM与PDM的区别

    在数据仓库建设中,概念数据模型设计与逻辑数据模型设计.物理数据模型设计是数据库及数据仓库模型设计的三个主要步骤. conceptual data model 概念数据模型是最终用户对数据存储的看法,反 ...

  4. playwright录制脚本

    我喜欢Playwright! 这是微软开源的一款非常强大的自动化工具,再过几年,他很有可能取代Selenium在浏览器自动化的通知地位.使用过一段时间,我没有找到很好的中文资料可以参考,导致很多问题无 ...

  5. 1.2 Hadoop快速入门

    1.2 Hadoop快速入门 1.Hadoop简介 Hadoop是一个开源的分布式计算平台. 提供功能:利用服务器集群,根据用户定义的业务逻辑,对海量数据的存储(HDFS)和分析计算(MapReduc ...

  6. Charles自动保存响应数据

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! 操作环境 win10 nexus5x c ...

  7. 万答#4,延迟从库加上MASTER_DELAY,主库宕机后如何快速恢复服务

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 当主库宕机后,延迟从库如何才能"取消"主动延迟,以便恢复服务 ...

  8. Flutter-填平菜鸟和高手之间的沟壑

    Flutter-填平菜鸟和高手之间的沟壑 准备写作中... 1.Flutter-skia-影像,Flutter skia-图形渲染层.应用渲染层2.方法通道使用示例,用于演示如何使用方法通道实现与原生 ...

  9. Java四大引用详解:强引用、软引用、弱引用、虚引用

    面试官考察Java引用会问到强引用.弱引用.软引用.虚引用,具体有什么区别?本篇单独来详解 @mikechen Java引用 从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活 ...

  10. ASP.NET Core 5.0中的Host.CreateDefaultBuilder执行过程

      通过Rider调试的方式看了下ASP.NET Core 5.0的Web API默认项目,重点关注Host.CreateDefaultBuilder(args)中的执行过程,主要包括主机配置.应用程 ...