5. X-Forwarded-For 与 Remote Addr

版权声明:知识是属于全人类的,欢迎探讨和分享 https://blog.csdn.net/hukfei/article/details/88556634

简介

X-Forwarded-For 是一个 HTTP 扩展头部,主要是为了让 Web 服务器能够获取到客户端真实的 ip。(可以被伪造,客户端发送请求时可以 override 这个请求头)

REMOTE_ADDR 表示与服务器进行 TCP 连接的 IP,这个值不能够被伪造。(TCP 连接会经过三次握手,如果伪造了,便没有后续的请求)


Remote addr

首先我们来看一个请求在到达服务端之前可能出现的路径。

客户端->(正向代理->透明代理->反向代理->)web 服务器

其中正向代理、透明代理和反向代理不一定存在。首先解释下这三个概念:

  • 正向代理:很多企业会在自己的出口网关上设置代理(主要是为了加速和节省流量)
  • 透明代理:可能是用户自己设置的代理(比如为了翻墙,这样也绕开了公司的正向代理)
  • 反向代理:一般部署在 Web 服务器前面的,主要原因是为了负载均衡和安全考虑。

现在假设以下几种情况下,Remote Addr 的值是什么:

  • 客户端直连 Web 服务器,则 Remote Addr 获取到的是客户端真实的 ip
  • web 服务器部署了反向代理(如 nginx),则 Remote Addr 获取的是反向代理设备的 ip(nginx)
  • 客户端通过正向代理直连 web 服务器,则 Remote Addr 获取到的是正向代理的 ip

综上,我们只需谨记一点,Remote Addr 获取的是与 web 服务器进行 TCP 连接的 ip 即可。


X-Forwarded-For

由于客户端的一个请求可能会经过多种代理,在不同的情况下 REMOTE ADDR 获取到的值会发生变化,无法获取到客户端真实的 IP,此时 X-Forwarded-For 请求头出现了,这个协议头的格式:

X-Forwarded-For:client, proxy1, proxy2

client 表示用户真实的 ip,每经过一次代理服务器,代理服务器会在这个头增加用户的 ip。

注意:

最后一个代理服务器请求 web 服务器的时候,不会讲自己的 ip 加到 X-Forwarded-For 上,而是应该通过 Remote Addr 来获取。

举个栗子:

用户的 IP 为(A),分别经过两个代理服务器(B、C),那么 X-Forwarded-For 获取到的 ip 为 A,B,Remote Addr 获取到的 ip 为 C


配置反向代理

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

简单的解释如下:

  • X-Forwarded-For,表示 nginx 接收到的头,原样转发过来(如果不转发,web 服务器就不能获取到这个头)
  • X-Real_IP,这是一个内部协议头(就是反向代理服务器和 Web 服务器约定的,即自定义的),这个头表示连接反向代理服务器的 IP 地址

猜你喜欢

转载自blog.csdn.net/hukfei/article/details/88556634