X-Forwarded-For

X-Forwarded-For(XFF)是一个HTTP扩展头部,用于记录客户端的真实IP,尤其在经过代理或负载均衡服务器时。该头信息会包含一系列IP地址,最前端是客户端的IP,后面依次是每级代理的IP。XFF有效性依赖于代理服务器的可靠性,且$remote_address可以获取最后建立TCP连接的设备IP。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简称XFF头,是一个扩展头,它代表客户端也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项(百度百科:用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址HTTP请求头字段)。
X-Forwarded-For请求头格式:

X-Forwarded-For:client,proxy1,proxy2

格式比较简单,首先是离服务端最远的设备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。
详细分析一下,这样的结果是经过这样的流程而形成的:

  1. 用户IP0—> 代理Proxy1(IP1),Proxy1记录用户IP0,并将请求转发给Proxy2时,带上一个Http Header X-Forwarded-For: IP0
  2. Proxy2收到请求后读取到请求有 X-Forwarded-For: IP0,然后Proxy2 继续把链接上来的Proxy1 IP追加到 X-Forwarded-For 上面,构造出X-Forwarded-For: IP0, IP1,继续转发请求给Proxy 3。
  3. 同理,Proxy3 按照第二部构造出 X-Forwarded-For: IP0, IP1, IP2,转发给真正的服务器,比如nginx,nginx收到了http请求,里面就是 X-Forwarded-For: IP0, IP1, IP2 这样的结果。所以Proxy 3 的IP3,不会出现在这里。
  4. nginx 获取Proxy3的IP 能通过$ remote_address获取到,因为这个
    $ remote_address就是真正建立TCP链接的IP,这个不能伪造,是直接产生链接的IP。$remote_address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。

如果没有XFF或者另外一种相似的技术,所有通过代理服务器的连接只会显示代理服务器的IP地址,而非连接发起的原始IP地址,这样的代理服务器实际上充当了匿名服务提供者的角色,如果连接的原始IP地址不可得,恶意访问的检测与预防的难度将大大增加
XFF的有效性依赖于代理服务器提供的连接原始IP地址的真实性,因此,XFF的有效使用应该保证代理服务器是可信的,比如可以通过创建可信服务器白名单的方式。

部分转载自https://www.jianshu.com/p/15f3498a7fad,(侵权删

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值