Eden

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

最近在为nginx 反向代理后jboss获取客户端真实IP的事情苦恼,原来我的想法是比较简单的。在不考虑客户端使用代理的情况下,直接使用X-Real-IP来获取客户端真实的IP,在客户端使用代理的情况下通过(X-Forwared-For)来获取客户端IP(关于X-Forwared-For的说明请参考我的另一个文章)。

      如果多重代理的情况下,有的代理服务器不在header中添加信息,那么获取的将是否正确?这个问题非常好。我们关注的只是客户端IP,中间的代理服务器是否填写我们并不太关心,只要我们在nginx中设置X-Forwared-For的值为$proxy_add_x_forwarded_for,nginx会把$remote_addr值放在第一个位置,如果用户没有使用代理,则$proxy_add_x_forwarded_for等于$remote_addr,也就是客户端的真实IP,但真的是这样的么?

     No,因为代理服务器有不同种类型,另外X-Forwared-For的值是可以篡改的,并且 $remote_addr的值根据代理服务器的不同而不同,也不一定是客户端真实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 = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

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

    看完了上面的几种情况有什么感想?我的第一个想法就是“杯具”了,没有办法来提供一个方法来获取一个完全真实的客户端的IP,而只是一个相对真实的客户端IP。这个目前还没有想到什么好的解决方法,如果谁有好的方法可以补充一下。

posted on 2010-10-27 11:01  Johney  阅读(1239)  评论(0编辑  收藏  举报