安装辽宁十一选五体彩|辽宁十一选五电视版走势图

232017/06 F5服务器做负载均衡时WebService获取真实客户端IP地址

        最近在工作中,遇到一个关于IP过滤的问题,因为在日常运维中使用了F5服务器,导致初始的获取IP地址的方法以及不能使用,因为获取的都是F5服务器的IP地址,而不是真实的客户端的IP地址,所以只要IP白名单里面有F5服务器的IP,一?#22411;?#36807;F5服务器的访问都是允许的,IP校验就失去了作用。

 

        首先,我先来介绍一下什么是F5服务器,内容来自百度:

负载均衡,英文名称为Load Balance,其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器?#25512;?#23427;关键任务服务器等,从而共同完成工作任务。

 

负载均衡建立在现有网络结构之上,它提供了一种廉价?#34892;?#36879;明的方法扩展网络设备和服务器的带宽、增加吞吐量、加?#23458;?#32476;数据处理能力、提高网络的灵活性和可用性。需要说明的是:负载均衡设备不是基础网络设备,而是一?#20013;?#33021;优化设备。对于网络应用而言,并不是一开始就需要负载均衡,当网络应用的访问量不断增长,单个处理单元无法满足负载需求时,网络应用流量将要出?#21046;?#39048;时,负载均衡才会起到作用。


负载均衡有两方面的含义:首先,单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高,这就是我们常说的集群(clustering)技术。第二层含义就是:大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间,这主要针对Web服务器、FTP服务器、企业关键应用服务器等网络应用。

那么问题来了,如果获取经过负载均衡后的真实IP地址呢?

 

其实可以利用HTTP请求中的X-Forwarded-For属性

 

  • X-Forwarded-For说明

X-Forwarded-For: client1, proxy1, proxy2

  •  

其中的值通过一个 逗号+空格 把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。

鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来?#30784;?/p>

 

所以只要F5设置好记录每次X-Forwarded-For的?#25285;?#28982;后就可以获取具体IP了:

 

下面附上同事写好的方法代码:

/**

* @Description: 获取客户端IP

* @param @return   

* @return String  

* @throws

*/

public static String getClientAddress() {

//CXF获取Http对象

Message message = PhaseInterceptorChain.getCurrentMessage();

//获取请求信息

HttpServletRequest req = (HttpServletRequest)message.get(AbstractHTTPDestination.HTTP_REQUEST);

//获取ip信息串

String ip = req.getHeader("x-forwarded-for");

log.info("the ip from header X-Forwarded-For:"+ip);

   

        if (ip != null) {    

       if (ip.indexOf(',') == -1) {    

           return ip;    

       }    

       return ip.split(",")[0];    

   }    

 

   if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    

//如果x-forwarded-for属性为空,则走原来的获取IP逻辑

       ip = req.getRemoteAddr();  

       log.info("the proxy ip:"+ip);

   }  

   

   return ip;    

 

}

 



YC & 原创官方微信
Contact Us & 联系我们

TEL:0532-68072250

地址:青岛市李沧区中海国际5号楼

Copyright 2015-2017 青岛三联众科信息科技有限公司 All Rights Reserved 版权所有

鲁ICP备14012598号-3

安装辽宁十一选五体彩