• 【转载】服务器日志之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 
  • 相关阅读:
    macOS 升级后重装命令行工具的问题
    Windows系统制作Ubuntu启动U盘(命令行)
    远程管理相关命令的学习(域名和端口号的概念)
    远程管理相关命令的学习(ssh工作方式的简介)
    远程管理相关命令的学习(网卡和IP地址)
    远程管理相关命令的学习(shutdown)
    其他命令的使用(echo find 硬软链接)
    文件内容相关命令(cat more grep)
    拷贝和移动文件(tree cp mv命令的使用)
    touch mkdir rm命令的使用
  • 原文地址:https://www.cnblogs.com/myyan/p/5731782.html
Copyright © 2020-2023  润新知