【问题标题】:Can X-Real-IP be set when using Proxy Protocol?使用代理协议时可以设置 X-Real-IP 吗?
【发布时间】:2018-12-13 07:40:23
【问题描述】:

我的设置如下:

负载均衡器 → nginx → Traefik

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

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

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

我如何告诉 Traefik总是X-Real-IP 设置为代理协议建议的 IP?

【问题讨论】:

    标签: traefik


    【解决方案1】:

    我解决了我的问题,现在可以看得更清楚了。 它取决于配置中的哪个节点(负载均衡器 → 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 标头的来源。

    【讨论】:

      【解决方案2】:

      由于类似的问题,我只是查看了源代码。 Traefik 将标头 X-Real-Ip 设置为被转发请求的源 IP 地址。如果标头 X-Real-Ip 已经存在,则将不加改变地通过。 我希望这能回答这个问题。

      if req.Header.Get (XRealIp) == "" {
        req.Header.Set (XRealIp, clientIP)
      }
      

      【讨论】:

      • 很遗憾没有。 X-Real-IP 通过的事实是我的问题的一部分。我的问题是如何告诉 Traefik 始终根据从代理协议收集的 IP 设置 X-Real-IP。我想我的问题的正确答案是“Patch Traefik”;-)
      猜你喜欢
      • 2021-07-18
      • 2019-01-07
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 2011-05-18
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多