反向代理之后,应用为什么总是看见“代理服务器 IP”?——真实客户端 IP 的原理、风险与正确配置
在自建网站和家庭服务器中,一个非常常见的架构是: 这种架构很实用。HTTPS 可以集中在反向代理处终止,不同域名可以被分发到不同服务,后端应用也不必直接暴露在公网。 但它同时带来了一个容易被忽视的问题: 后端应用看到的客户端 IP,往往不是真正访问者的 IP,而是反向代理服务器的 IP。 这不仅影响日志可读性,还会直接影响登录审计、暴力破解防护、封禁策略和安全取证。 理解这个问题,需要先弄清楚 IP 地址到底是在网络的哪一层产生和传递的。 一、为什么后端应用会看到代理服务器的 IP 假设一个客户端访问网站: 客户端首先与反向代理建立 TCP 连接。 例如: 此时反向代理当然能够知道真正的客户端地址: 但是接下来,反向代理会自己重新建立一个连接到后端应用: 对于后端服务器来说,这是一条新的 TCP 连接。 所以它在网络层看到的源地址实际上是: 而不是最初的: 这不是 Bug,而是反向代理工作的正常结果。 可以理解为: 原始客户端和后端应用之间,并不存在一条完整的端到端 TCP 连接。 中间的反向代理把连接“截断”成了两段。 二、真实 IP 是怎样传给后端应用的 既然 TCP 层的客户端地址已经变成代理服务器,那么真实地址只能通过 HTTP 层额外传递。 最常见的几个 HTTP Header 是: 以及: 因此完整流程变成: 这时候后端应用就有机会恢复真正的客户端地址。 不过,这里马上出现了一个安全问题。 三、X-Forwarded-For …