版权声明:知识是属于全人类的,欢迎探讨和分享 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 地址