`
chinese.darren
  • 浏览: 100459 次
  • 性别: 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
分享到:
评论

相关推荐

    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位系统的...

    GetIpAddress.rar_GetIPAddress_获取IP地址_获取真实IP

    另一方面,获取真实IP地址有时需要考虑到CDN(内容分发网络)和代理服务器的影响,因为它们可能会改变请求头中的IP信息。为了获取准确的地理位置信息,可能需要使用第三方IP库或API,例如MaxMind的GeoIP数据库或...

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

    在场景一中,当AD设备(应用交付设备)单臂部署作为HTTP应用的负载均衡器时,服务器无法直接获取到客户端的真实IP地址。这对于数据分析至关重要。为了解决这个问题,可以通过HTTP头部改写,将客户端的请求头添加一个...

Global site tag (gtag.js) - Google Analytics