我们都知道当AD旁路模式部署做服务器负载均衡的时候,在应用端就无法获取到客户端电脑的真实IP。这个都是因为我们在AD上配置虚拟服务的时候启用了自动snat功能,将客户端发来的数据包的源IP替换成了AD接口地址,以确保服务器将应答回送给AD,达到数据包来回路径的一致。
很多应用程序都会做一些基于客户端IP的设置,比如基于IP的防爆力破解等等,那么这个时候应用程序段怎么获取到客户端的真实IP呢?当然是开启优化策略,并在虚拟服务中关联该策略。
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。 Squid 缓存代理服务器的开发人员最早引入了这一HTTP头字段,并由IETF在Forwarded-For HTTP头字段标准化草案中正式提出。开启了AD的优化策略后,AD会在客户端的请求报文中http头部中插入这个X-Forwarded-For字段,并写上客户端IP地址。这样后端的服务器就可以通过读取http头部中的X-Forwarded-For来获取客户端的真实IP。
这里以PHP为例。PHP中有一个超级全局变量,$_SERVER 是一个包含诸如头信息(header)、路径(path)和脚本位置(script locations)的数组。我们可以在 PHP 程序的任何地方直接访问它。在PHP程序中可以通过读取$_SERVER['HTTP_X_FORWARDED_FOR']这个变量来获取到客户端http请求中的X-Forwarded-For字段,而获取到客户端的真实IP。我们来看看效果。
- <font size="3" face="微软雅黑"><font size="2">echo "通过X-Forwarded-For获取到的客户端真实IP:".$_SERVER['HTTP_X_FORWARDED_FOR'];</font></font>
复制代码
在Http头部中拓展的X-Forwarded-For字段格式是这样的,HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2。clientip表示客户端的IP,proxy1表示代理服务器的地址,proxy2表示代理服务器的IP,http的请求每经过一个代理服务器就会在后面添加一个代理服务器的IP。上面我们看到显示了2个地址第一个地址是公网IP显然是客户端的真实IP。第二个是一个私网IP,这个是AD的地址。
显然,我只需要知道客户端的真实IP即可,不需要知道代理服务器的IP,我可以再优化下代码: - <font size="3" face="微软雅黑"><font size="2">echo "通过X-Forwarded-For获取到的客户端真实IP:".strstr($_SERVER['HTTP_X_FORWARDED_FOR'], ',', TRUE);</font></font>
复制代码
最后,建议大家在部署AD的时候尤其是做服务器负载均衡的时候,最好先了解下客户的应用,是否有功能需要基于客户的IP,如果有需要提醒客户在应用端做下调整,告知客户需要通过x-Forwarded-for来读取客户端的真实IP。以免上线后影响客户的正常使用,确保上线顺利。
|