【转载】服务器日志之X_Forwarded_For(一)

转自http://blog.csdn.net/zongzhiyuan/article/details/49836597

X_Forwarded_For

X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。它不是RFC中定义的标准请求头信息,在squid缓存代理服务器开发文档中可以找到该项的详细介绍。Squid缓存代理服务器的开发人员最早引入了这一HTTP头字段,并由IETF在Forwarded-For HTTP头字段标准化草案中正式提出。

当今多数缓存服务器的使用者为大型ISP,为了通过缓存的方式来降低他们的外部带宽,他们常常通过鼓励或强制用户使用代理服务器来接入互联网。有些情况下,这些代理服务器是透明代理,用户甚至不知道自己正在使用代理上网。

如果没有XFF或者另外一种相似的技术,所有通过代理服务器的连接只会显示代理服务器的IP地址(而非连接发起的原始IP地址),这样的代理服务器实际上充当了匿名服务提供者的角色,如果连接的原始IP地址不可得,恶意访问的检测与预防的难度将大大增加。XFF的有效性依赖于代理服务器提供的连接原始IP地址的真实性。因此,XFF的有效使用应该保证代理服务器是可信的,比如可以通过建立可信服务器白名单的方式。

这一HTTP头一般格式如下:

X-Forwarded-For: client1, proxy1, proxy2, proxy3

其中的值通过一个“逗号+空格”把多个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不是请求终点,请求会被继续转发。

 

反向代理

通常网站为了支撑更大的访问量,会增加很多web服务器,并在这些服务器前面增加一个反向代理(如HAProxy),它可以把负载均匀的分布到这些机器上。你的浏览器访问的首先是这台反向代理,它再把你的请求转发到后面的web服务器,这就使得web服务器会把remote_addr设为这台反向代理的IP,为了能让你的程序获取到真实的客户端IP,你需要给反向代理服务器(HAProxy)增加以下配置:

 

option forwardfor

 

它的作用就像上面说的,增加一个x_forwarded_for的头信息,把你上网机器的ip添加进去

 

五种情况

一、没有使用代理服务器的情况:

     REMOTE_ADDR = 您的IP
      HTTP_VIA = 没数值或不显示
      HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

     REMOTE_ADDR = 最后一个代理服务器IP 
      HTTP_VIA = 代理服务器 IP
      HTTP_X_FORWARDED_FOR = 您的真实 IP,经过多个代理服务器时,这个值类似如下:203.98.182.163,203.98.182.163, 203.129.72.215。

   这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies

     REMOTE_ADDR = 最后一个代理服务器IP 
      HTTP_VIA = 代理服务器 IP
      HTTP_X_FORWARDED_FOR = 代理服务器 IP,经过多个代理服务器时,这个值类似如下:203.98.182.163,203.98.182.163, 203.129.72.215。

   隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies

     REMOTE_ADDR = 代理服务器IP 
      HTTP_VIA = 代理服务器IP 
      HTTP_X_FORWARDED_FOR = 随机的 IP,经过多个代理服务器时,这个值类似如下:203.98.182.163,203.98.182.163, 203.129.72.215。

   告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)

     REMOTE_ADDR = 代理服务器IP
      HTTP_VIA = 没数值或不显示
      HTTP_X_FORWARDED_FOR = 没数值或不显示

   完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

 

 

 

基于以上介绍,可以采用的一些安全策略:

1. 代理IP识别:

1)根据XFF;

2)根据一段时间ip(remote_addr和XFF中)出现的次数;

2. 基于代理IP的恶意IP识别:

1)如果XFF为空,即针对上述情况一和五:此时,如果remote_addr显示的ip在代理ip库中,则该请求是高匿名代理访问,该代理ip添加标注“高匿名ip”;

2)如果XFF有值,并且remote_addr不在XFF中不同,则remote_addr为“代理ip”,而XFF中ip不好判断是随机ip还是真实ip。

  

参考:

http://baike.baidu.com/link?url=Pt83O09KfqFbiRjXv53yXCMlGW1TACG-ZIHFclt6_vkfY1rU9oJLi0y0Ad830_SwwnKfmwkB16VHjVuFBBKhfa

http://blog.pengqi.me/2013/04/20/remote-addr-and-x-forwarded-for/

http://blog.csdn.net/kfanning/article/details/8277153

 

===================================================================================================

补充:

 

识别一个IP是不是代理IP,技术不外乎就是如下四种:

  1. 反向探测技术:扫描IP是不是开通了80,8080等代理服务器经常开通的端口,显然一个普通的用户IP不太可能开通如上的端口。
  2. HTTP头部的X_Forwarded_For:开通了HTTP代理的IP可以通过此法来识别是不是代理IP;如果带有XFF信息,该IP是代理IP无疑。
  3. Keep-alive报文:如果带有Proxy-Connection的Keep-alive报文,该IP毫无疑问是代理IP。
  4. 查看IP上端口:如果一个IP有的端口大于10000,那么该IP大多也存在问题,普通的家庭IP开这么大的端口几乎是不可能的。
http://www.36dsj.com/archives/35887 

posted on 2016-08-03 10:19  月未央  阅读(527)  评论(0编辑  收藏  举报

导航