【HTTP协议系列4】服务器日志之X_Forwarded_For

来源:互联网 发布:淘宝登录名可以修改吗 编辑:程序博客网 时间:2024/06/18 07:18


X_Forwarded_For

X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTPExtension)标准之中

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

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

这一HTTP头一般格式如下:

X-Forwarded-For: client, proxy1, proxy2

可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。

如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:

X-Forwarded-For: IP0, IP1, IP2


Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮 Proxy2 转发请求。列表中并没有 IP3,IP3 可以在服务端通过 Remote Address 字段获得。我们知道 HTTP 连接基于 TCP 连接,HTTP 协议中没有 IP 的概念,Remote Address 来自 TCP 连接,表示与服务端建立 TCP 连接的设备 IP,在这个例子里就是 IP3。Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。
 



反向代理

通常网站为了支撑更大的访问量,会增加很多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

《HTTP 请求头中的 X-Forwarded-For》https://imququ.com/post/x-forwarded-for-header-in-http.html 

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

补充:

识别一个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 

0 0
原创粉丝点击