x-forward-for详解

转载:http://www.360doc.com/content/14/0110/17/15459414_344165975.shtml

如今利用nginx做负载均衡的实例已经很多了,针对不同的应用场合,还有很多需要注意的地方,本文要说的就是在通过CDN 后到达nginx做负载均衡时请求头中的X-Forwarded-For项到底发生了什么变化。下图为简单的web架构图:

x-forward-for详解

先来看一下X-Forwarded-For的定义: X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。它不是RFC中定义的标准请求头信息,在squid缓存代理服务器开发文档中可以找到该项的详细介绍。 标准格式如下: X-Forwarded-For: client1, proxy1, proxy2 从标准格式可以看出,X-Forwarded-For头信息可以有多个,中间用逗号分隔,第一项为真实的客户端ip,剩下的就是曾经经过的代理或负载均衡的ip地址,经过几个就会出现几个。

按照上图的Web架构图,可以很容易的看出,当用户请求经过CDN后到达Nginx负载均衡服务器时,其X-Forwarded-For头信息应该为 客户端IP,CDN的IP 但实际情况并非如此,一般情况下CDN服务商为了自身安全考虑会将这个信息做些改动,只保留客户端IP。我们可以通过php程序获得X-Forwarded-For信息或者通过Nginx的add header方法来设置返回头来查看。

下面来分析请求头到达Nginx负载均衡服务器的情况;在默认情况下,Nginx并不会对X-Forwarded-For头做任何的处理,除非用户使用proxysetheader 参数设置: proxysetheader X-Forwarded-For $proxyaddxforwardedfor;

$proxyaddxforwardedfor变量包含客户端请求头中的"X-Forwarded-For",与$remoteaddr用逗号分开,如果没有"X-Forwarded-For" 请求头,则$proxyaddxforwardedfor等于$remoteaddr。

$remote_addr变量的值是客户端的IP

当Nginx设置X-Forwarded-For等于$proxyaddxforwardedfor后会有两种情况发生

1、如果从CDN过来的请求没有设置X-Forwarded-For头(通常这种事情不会发生),而到了我们这里Nginx设置将其设置为$proxyaddxforwardedfor的话,X-Forwarded-For的信息应该为CDN的IP,因为相对于Nginx负载均衡来说客户端即为CDN,这样的话,后端的web程序时死活也获得不了真实用户的IP的。

2、CDN设置了X-Forwarded-For,我们这里又设置了一次,且值为$proxyaddxforwardedfor的话,那么X-Forwarded-For的内容变成 ”客户端IP,Nginx负载均衡服务器IP“如果是这种情况的话,那后端的程序通过X-Forwarded-For获得客户端IP,则取逗号分隔的第一项即可。

如上两点所说,如果我们知道了CDN设置了X-Forwarded-For信息,且只有客户端真实的IP的话,那么我们的Nginx负载均衡服务器可以不必理会该头,让它默认即可。

其实Nginx中还有一个$httpxforwardedfor变量,这个变量中保存的内容就是请求中的X-Forwarded-For信息。如果后端获得X-Forwarded-For信息的程序兼容性不好的话(没有考虑到X-Forwarded-For含有多个IP的情况),最好就不要将X-Forwarded-For设置为 $proxyaddxforwardedfor。应该设置为$httpxforwardedfor或者干脆不设置!

参考文章:http://en.wikipedia.org/wiki/X-Forwarded-For

另在不同的代理情况下,其中x-forward-for的情况

对于这三个值:REMOTEADDR、HTTPVIA、HTTPXFORWARDEDFOR 来说,可以分以下五种情况: 一、没有使用代理服务器的情况: REMOTEADDR = 您的 IP HTTPVIA = 没数值或不显示 HTTPXFORWARDEDFOR = 没数值或不显示 二、使用透明代理服务器的情况:Transparent Proxies REMOTEADDR = 最后一个代理服务器 IP HTTPVIA = 代理服务器 IP HTTPXFORWARDEDFOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。 这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。 三、使用普通匿名代理服务器的情况:Anonymous Proxies REMOTEADDR = 最后一个代理服务器 IP HTTPVIA = 代理服务器 IP HTTPXFORWARDEDFOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。 隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。 四、使用欺骗性代理服务器的情况:Distorting Proxies REMOTEADDR = 代理服务器 IP HTTPVIA = 代理服务器 IP HTTPXFORWARDEDFOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。 告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。 五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies) REMOTEADDR = 代理服务器 IP HTTPVIA = 没数值或不显示 HTTPXFORWARDEDFOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。 完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

x-forward-for详解

上一篇:理解Android Binder机制(2/3):C++层


下一篇:vue : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。