我有一个虚拟化路由器,其公共 IP 地址直接在 proxmox 中分配给它。当我从其他网络(从浏览器)向端口 443 发送请求时,路由器会正确地将其端口转发到私有 IP 上的 NGINX 容器。

由于路由器对数据包执行了从公有 IP 到本地 10.0.0.0/8 地址的 NAT,NGINX 如何知道原始客户端 IP 是什么?它在 access.log 中正确报告了我的公有 IP,但它应该看到的所有 IP 信息都是路由器的私有 IP,不是吗?

另外,当我在客户端上的“网络”选项卡中检查标头时,没有 X-Forwarded-For 标头,也没有其他反向代理(我所知道的)可以添加标头,肯定没有具有正确 SSL 证书的代理可以执行此操作。

谢谢


最佳答案
1

因为路由器正在转换传入 IP 数据包的目标地址(朝向路由器的公共 IP),并将其转换为具有 NGINX 私有 IP 地址的目标地址(当它转发数据包时),而数据包上的原始地址保持不变。

因此,只修改了目标地址,而不是源(原始)地址,我认为这称为 DNAT。

路由器之所以能做到这一点,是因为它能够在自己的 NAT 跟踪表中跟踪内部连接。一旦跟踪并建立了初始入站连接,任何从 NGINX 返回的数据包都可以再次进行适当的去 NAT 出站处理。

这个过程保留了源地址,这就是为什么 NGINX 知道那是什么。