使用代理协议时可以设置X-Real-IP吗?

时间:2018-12-13 07:40:24

标签: traefik

我的设置如下:

负载均衡器→nginx→Traefik

已安装的负载均衡器支持代理协议。而是将客户端的实际IP添加到TCP选项字段中(我知道,是的!Details)。这是Traefik不支持的。

要获得Traefik的真实IP,我在两者之间添加了一个nginx,除了在使用SSL时接受端口80和443上的连接以及添加代理协议外,它什么都没有。 Traefik已配置为代理协议。事情按预期进行。

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

如何根据代理协议的建议,告诉Traefik始终设置 X-Real-IP 为IP?

2 个答案:

答案 0 :(得分: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标头的源。

答案 1 :(得分:0)

由于类似的问题,我只是研究了源代码。 Traefik将标头X-Real-Ip设置为转发请求的源IP地址。如果标头X-Real-Ip已经存在,则将原样传递。 我希望能回答这个问题。

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