前几天在自己的linode上装了个squid3,用来在个别情况下挂个代理进行测试。使用一切都正常,squid3的配置网上也有一大把,这里就不赘述了。但很快发现一个有趣的问题,就是访问一些IP检测网站时还是会看到我的原始IP,例如:
下面三个图为三处不同的网站检测出的结果,其中IP为106的是我配置了squid3的HTTP代理服务器,IP为159的是我的本机。
-------------------------------------------------------------------------------------------------------
图1,直接使用百度内置服务显示出了代理IP
-------------------------------------------------------------------------------------------------------
图2:,访问ip138则显示了内网IP;
-------------------------------------------------------------------------------------------------------
图3,访问ip.cn则同时显示了处于代理后的主机与代理本身;
-------------------------------------------------------------------------------------------------------
从最后一张图可以发现,外部服务器可以准确的识别出我的代理服务器和代理后面的主机的IP,显然很多情况下这不是我想要的结果,同时我也很奇怪为什么会这样。
于是用google开始一番搜索,首先找到这个帖子:代理工作原理 。 其中有人问到代理服务器的具体工作原理,这个原理我本身是了解的,但回答中透露了一个重要的信息:“The proxy, depending on the configuration, will often add a "X-Forwarded-For" header to the HTTP request. ” 这里算是接近真相了。
然后继续搜索X-Forwarded-For,自然找到其维基百科的介绍:里面说的更详细了,X-Forwarded-For是代理服务器在转发HTTP时加上的标识原始请求主机信息的字段,其格式为:
“ X-Forwarded-For: client, proxy1, proxy2 ”
该格式还可以支持多个代理串行使用,最左边的client表示最原始的主机,后面依次加上后续的代理。
到这里就清楚了,squid3在默认情况下转发我159主机的请求时附加了X-Forwarded-For字段,并填入了我的159的IP。这也就是为什么上图中后面两个检测网站成功识别出了所谓的内网IP(理论上透明的代理是可能识别出内网IP的)。
到这里问题基本解决。收获了一个HTTP头X-Forwarded-For的设置和含义。另外需要注意的是,这个字段显然是不可信的,毕竟最后一站的代理可以任意修改这些数据。因此服务器不可完全信赖该字段表示的IP,因为这里的IP完全可以任意伪造等。
一句话回答题目的问题:默认情况下squid3不是透明代理(或者说要搞清楚:不是所有的代理都是透明代理。虽然我们现实中用代理的大部分情况是希望透明代理,进而隐藏身份的)