X-Forwarded-For 和 RemoteAddress 你选择那个优先?

I. 对项目时发现一直是xff优先于remote address,以前项目也是。

既然产品问到了哪个优先就查了下。

最后果然是 RemoteAddress 优先,xff包含经过的每一个代理的ip(除了最后一个,remote address里就是最后一个).

II. https://imququ.com/post/x-forwarded-for-header-in-http.html

通过名字就知道,X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入RFC 7239(Forwarded HTTP Extension)标准之中。

X-Forwarded-For 请求头格式非常简单,就这样:

X-Forwarded-For: client, proxy1, proxy2

可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。

如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:

X-Forwarded-For: IP0, IP1, IP2

Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮 Proxy2 转发请求。列表中并没有 IP3,IP3

可以在服务端通过 Remote Address 字段获得。我们知道 HTTP 连接基于 TCP 连接,HTTP 协议中没有 IP

的概念,Remote Address 来自 TCP 连接,表示与服务端建立 TCP 连接的设备 IP,在这个例子里就是 IP3。

Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。不同语言获取 Remote Address 的方式不一样,例如 php 是$_SERVER["REMOTE_ADDR"],Node.js 是req.connection.remoteAddress,但原理都一样。

2017-04-20 补充 :

项目实测的时候才发现转发的ip全都是nginx服务器的ip。然后赶紧查nginx的配置。奇怪啊,已经配置了转发请求的时候自动添加xff的啊,为何没有把客户端的真实ip获取到呢?

最后看项目发现,之前觉得remote address的准确性高于xff,项目里面直接使用了remote address而没有用xff和nginx转发加上的x-real-ip。

赶紧修改项目使用xff优先,这才减少了广告业务对ip问题的依赖导致的损失。

你可能感兴趣的:(X-Forwarded-For 和 RemoteAddress 你选择那个优先?)