首页 > 解决方案 > 使用代理协议时可以设置 X-Real-IP 吗?

问题描述

我的设置如下:

负载均衡器 → nginx → Traefik

现有的负载均衡器支持代理协议。相反,它将客户端的真实 IP 添加到 TCP 选项字段(哎呀,我知道!详细信息)。这是 Traefik 不支持的。

为了获得 Traefik 的真实 IP,我在中间添加了一个 nginx,它只接受端口 80 和 443 上的连接,并在使用 SSL 时添加代理协议。Traefik 配置为代理协议。事情按预期工作。

但是,当使用代理协议时,我想将X-Real-IP标头设置为正确的 IP。当我尝试通过curl手动设置标题时,会使用该标题,因此客户端可以覆盖它。

如何告诉 Traefik始终按照代理协议的建议将X-Real-IP设置为 IP?

标签: traefik

解决方案


我解决了我的问题,现在可以看得更清楚了。它取决于配置中的哪个节点(负载均衡器 → nginx → Traefik)终止客户端请求。在我的设置(负载均衡器 → Traefik)中,负载均衡器使用 NATing 将请求发送到 Traefik。Traefik 然后接受客户端的请求并将新请求发送到相应的后端。所以我不得不将 Traefik 配置为从不信任 X-Real-Ip 标头,但始终在 X-Real-Ip 标头中设置请求的源 IP。配置是这样的:

    [entryPoints.http.proxyProtocol]
      insecure = true
      trustedIPs = ["10.10.10.1", "10.10.10.2"]
    [entryPoints.http.forwardedHeaders]
      trustedIPs = ["10.10.10.1", "10.10.10.2"]

最常见的配置(我认为)是负载均衡器接受客户端的请求,然后向 nginx(反向代理负载均衡器)发送一个新请求。在这种情况下,负载均衡器必须设置 X-Real-Ip 标头,nginx 必须将标头传播到 Traefik,并且 Traefik 必须配置为信任 nginx 作为 X-Real-Ip 标头的源。


推荐阅读