我的设置如下:
负载均衡器→nginx→Traefik
已安装的负载均衡器不支持代理协议。而是将客户端的实际IP添加到TCP选项字段中(我知道,是的!Details)。这是Traefik不支持的。
要获得Traefik的真实IP,我在两者之间添加了一个nginx,除了在使用SSL时接受端口80和443上的连接以及添加代理协议外,它什么都没有。 Traefik已配置为代理协议。事情按预期进行。
但是,当我使用代理协议时,我想将 X-Real-IP 标头设置为正确的IP。当我尝试通过 curl 手动设置标头时,将使用该标头,以便客户端可以覆盖它。
如何根据代理协议的建议,告诉Traefik始终设置 X-Real-IP 为IP?
答案 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)
}