5. X-Forwarded-For 与 Remote Addr

本文介绍了HTTP头中的X-Forwarded-For和REMOTE_ADDR的概念及用途。X-Forwarded-For用于获取客户端真实IP,可能经过多个代理服务器,而REMOTE_ADDR表示与服务器直接建立TCP连接的IP地址,无法被伪造。在反向代理场景中,REMOTE_ADDR通常是代理服务器的IP,而X-Forwarded-For可记录客户端及中间代理的IP。在配置反向代理时,可以通过X-Forwarded-For和X-Real_IP来追踪真实客户端IP。

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

简介

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 获取到的是
### Nginx 配置 `X-Forwarded-For` 头以包含客户端真实 IP 地址 为了确保 Nginx 正确记录并传递客户端的真实 IP 地址,在配置文件中应合理设置 `proxy_set_header` 其他相关指令。 #### 使用 `proxy_set_header` 当使用反向代理时,可以通过如下方式来设置 `X-Forwarded-For` 请求头: ```nginx location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } ``` 此命令会将原始的 `X-Forwarded-For` 值保留下来,并追加当前请求者的 IP 地址到列表中[^1]。这有助于保持整个链路中的所有中间节点信息。 对于多层代理的情况,如果希望覆盖而不是简单地附加新的 IP 到现有头部,则可以采用下面的方式直接替换 `$remote_addr` 的值: ```nginx location / { proxy_set_header X-Forwarded-For $remote_addr; } ``` 但是需要注意这样做可能会丢失来自上游服务器的信息[^3]。 #### 结合 `real_ip_module` 模块增强安全性准确性 为了让后端应用能够信任由前端负载均衡器或缓存服务传入的特定 HTTP 头部字段所携带的实际客户机 IP 地址,建议启用 Nginx 自带的 `ngx_http_realip_module` 并做适当配置: ```nginx http { ... set_real_ip_from a.a.a.a/24; # 允许指定网段内的设备修改远程地址 real_ip_header X-Forwarded-For; server { listen 80; server_name example.com; location / { proxy_pass http://backend_server; # 设置真实的客户端IP给后端服务 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } } ``` 上述配置允许来自特定网络范围(`a.a.a.a/24`)内机器发送过来的数据包更新内部处理逻辑使用的 `$remote_addr` 变量;同时指定了哪些类型的HTTP头部应该被用来解析实际访客IP——这里选择了常见的 `X-Forwarded-For` 。此外还启用了递归查找功能 (`real_ip_recursive on;`) ,使得即使经过多个层次的代理也能正确识别最初的访问者IP[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值