Less About X-Fowared-For
REMOTE-ADDR
是nginx与客户端进行TCP连接过程中,获得的客户端真实地址.Remote Address无法伪造,因为建立TCP连接需要三次握手,如果伪造了源 IP,无法建立TCP连接,更不会有后面的HTTP请求.不同语言获取Remote Address的方式不一样,
php:
$_SERVER["REMOTE_ADDR"]
Node.js:
req.connection.remoteAddress
X-Real-IP
自定义头
X-Real-Ip 通常被 HTTP 代理用来表示与它产生 TCP 连接的设备 IP,这个设备可能是其他代理,也可能是真正的请求端。需要注意的是,X-Real-Ip 目前并不属于任何标准,代理和 Web 应用之间可以约定用任何自定义头来传递这个信息
X-Forwarded-For
扩展头
HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示HTTP请求端真实 IP,现在已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入RFC7239(Forwarded HTTP Extension)标准之中.
可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。
X-Forwarded-For: client, proxy1, proxy2
如果一个HTTP请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:
X-Forwarded-For: IP0, IP1, IP2
简单画了一个客户端经过CDN然后经过Nginx到服务器的一个流转图:
