`
chinese.darren
  • 浏览: 101201 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

在负载均衡环境中如果获取真实的客户IP

阅读更多
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。

    如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.bt285.cn / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。

    经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.5q520.cn /index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

    于是可得出获得客户端真实IP地址的方法一:

public String getRemortIP(HttpServletRequest request) {
  if (request.getHeader("x-forwarded-for") == null) {
  return request.getRemoteAddr();
  }
  return request.getHeader("x-forwarded-for");
}


    可是当我访问http://www.5a520.cn /index.jsp/ 时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我访问http://192.168.1.110:2046/index.jsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squid.conf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off  则:X-Forwarded-For: unknown

    于是可得出获得客户端真实IP地址的方法二:

public String getIpAddr(HttpServletRequest request) {
      String ip = request.getHeader("x-forwarded-for");
      if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
          ip = request.getHeader("Proxy-Client-IP");
      }
      if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
          ip = request.getHeader("WL-Proxy-Client-IP");
      }
      if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
          ip = request.getRemoteAddr();
      }
      return ip;
  }


    可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值,究竟哪个才是真正的用户端的真实IP呢?

    答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。

    如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100用户真实IP为: 192.168.1.110
分享到:
评论

相关推荐

    深信服AD负载均衡设备提取的联通IP地址库-更新时间2023-11-09

    深信服AD负载均衡设备是企业网络环境中常用的一种高级网络设备,它主要负责在多台服务器之间分配网络流量,以确保服务的高可用性和性能。负载均衡技术在现代数据中心和互联网服务中扮演着至关重要的角色,它通过智能...

    nginx负载均衡后如何记录来访者IP访客IP浏览者的IP

    总的来说,通过在Nginx中设置`proxy_set_header`以及在后端服务器正确解析`X-Forwarded-For`头,我们可以确保即使在负载均衡环境中也能准确记录来访者的IP地址。这对于进行用户行为分析、安全监控和故障排查等任务至...

    IIS日志中获取访客真实IP的解决方案

    然而,在使用负载均衡器(如HAProxy)的情况下,直接从后端服务器(例如运行IIS的服务器)的日志文件中获取客户端的真实IP可能会变得复杂,因为请求经过负载均衡器后,原始IP信息可能被更改或丢失。本文将详细介绍...

    A10负载均衡配置手册

    客户端IP地址插入/替换功能可以帮助应用程序获取客户端的真实IP地址,这对于日志记录和安全审计至关重要。 **5.10 HTTP标头插入或删除** 此功能允许添加或删除HTTP标头,以便更好地控制HTTP通信。 **5.11 URL...

    CDN获取真实IP

    ### CDN获取真实IP 在互联网应用中,内容分发网络(Content Delivery Network,简称CDN)是一种广泛采用的技术,用于加速网站内容的加载速度、提高访问稳定性和安全性。然而,当用户通过CDN访问网站时,服务器接收...

    tencentyun#intlcloud-documents#负载均衡七层转发获取来访真实IP的方法_en1

    As Layer-4 cloud load balance (TCP protocol) can directly access the real IP add

    负载均衡服务器负载HTTP头部改写.pptx

    在场景一中,当AD设备单臂部署并执行HTTP应用负载时,服务器无法获取到客户端的真实IP,这在数据分析中可能是个问题。为了解决这个问题,可以利用HTTP头部的X-forwarded-for字段。X-forwarded-for字段通常用来记录...

    获取用户真实IP地址

    值得注意的是,如果你的应用托管在云服务提供商(如AWS、Google Cloud或Azure)上,它们可能提供了API或配置选项来获取用户的真实IP,这通常涉及到配置负载均衡器或CDN服务。 在某些场景下,例如处理内网访问或者...

    负载均衡原理与技术实现.doc

    - 在四层负载均衡中,负载均衡器基于传输层(TCP/UDP)的IP和端口号来分配流量。客户端的请求首先发送到负载均衡设备,该设备根据预设的调度算法(如轮询、最少连接数、哈希等)选择一台真实的服务器,然后通过网络...

    java socket 用户真实IP测试

    3. **注意安全性**:虽然"X-Forwarded-For"通常被用来获取真实的客户端IP,但它的值可以被客户端篡改,因此在生产环境中,不应完全依赖此头字段,而是结合其他安全措施,如验证服务器的日志或使用更安全的协议。...

    获取访问者真实的IP地址

    下面的Java方法展示了如何在JSP环境中通过分析HTTP头部信息来获取客户端的真实IP地址: ```java public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Real-IP"); if...

    nginx扩展应用-获取真实IP.docx

    "nginx扩展应用-获取真实IP" 本文将详细介绍如何使用nginx扩展应用来获取访问者真实IP,主要是通过在七层上配置Apache服务器前端(负载均衡),将真实的IP放在X-Forwarded-For的字段里,然后在日志中记录真实IP地址...

    java获取用户真实ip

    总之,通过上述方法可以在Java中有效地获取到客户端的真实IP地址,这对于许多应用场景都是非常有用的。同时,在实现过程中还需要注意处理各种特殊情况,确保获取到的数据准确无误,并且符合相关的安全与隐私规定。

    MGW——美团点评高性能四层负载均衡1

    而FULLNAT模式在NAT模式基础上增加了源地址转换(SNAT),使得应答流量能经过正常三层路由返回负载均衡,降低了对网络环境的要求,但也可能导致应用服务器无法获取客户端的真实IP。 在美团点评的MGW中,特别提到了...

    软路由ROS固定IP、adsl双线NTH负载均衡借鉴.pdf

    在RouterOS –1和RouterOS –3中,我们配置了PPPOE拨号服务器,并在RouterOS –1和RouterOS –2中配置了NAT,以便让WinXP通过RouterOS –3 Ether3的固定IP访问外部真实局域网。 在配置过程中,我们首先需要标记奇偶...

    nginx 负载均衡与反向代理资源

    在Win7 64位系统上安装Nginx,可以利用其强大的负载均衡和反向代理功能,优化网站性能并提升可用性。** ### 一、Nginx的安装 1. **下载Nginx安装包**:首先,你需要从Nginx官方网站获取适用于Windows 64位系统的...

    PHP通过$_SERVER['REMOTE_ADDR']得到的是内网IP?如何才能获得客户的公网IP(真实IP地址).zip

    在PHP开发中,获取用户公网IP(真实IP地址)是一个常见的需求,这通常涉及到网络通信和服务器配置。当我们使用PHP内置的全局数组`$_SERVER`中的`'REMOTE_ADDR'`来获取用户IP时,有时会发现它返回的是内网IP而非公网...

Global site tag (gtag.js) - Google Analytics