如何使用普通 tcp 在 docker 负载均衡器后面获取真实客户端 ip?

How to get real client ip behind docker load balancer using plain tcp?

我想要的

我想在我的 TCP 服务器中获取客户端的 IP 并将其用于 whitelist/bind 操作、检测区域(语言和货币)等。

我是如何处理的

我正在使用 python 的 TornadoWeb 框架来设置我的 tcp 服务器。

它包含TCPServer.handler_stream(stream: IOStream, address: tuple[str, int]) 从哪里我可以得到客户的 IP 地址。当 运行 主机网络(即直接公开我的端口)

时一切都很好

问题

如果在 docker 群中启动多个任务(容器),因此使用 docker 的负载均衡器,客户端的 IP 地址将替换为 docker 的内部地址。

问题

我如何配置 docker swarm 或其他负载平衡器以某种方式将真实客户端的 ip 发送到我的服务器?

我并没有特别局限于一个软件或另一个软件,我也不知道哪个更好,我唯一不会考虑的是使用 Kubernetes(至少现在不是),所以任何关于也欢迎使用软件而不是配置!

客户端和服务器可以更改,因此无论协议本身如何,我都可以使用的其他技术也很有用。但是,可以使用 HTTPs 请求通过 X-Forwarded-ForX-Real-IP headers 收集 IP 地址,但我不想这样做。

How do i configure docker swarm or another load balancer to somehow send real client's ip to my server?

Docker 已经有一个未解决的问题,请参阅 https://github.com/docker/roadmap/issues/157 。目前无法进行任何配置。

正如您之前提到的,在问题关闭之前,您将不得不使用一些自定义方法来处理它。

最简单的解决方案是用另一个类似 nginx 的负载均衡器替换负载均衡器,这里有一个 nifty guide for swarm 在 nginx 配置文件中,你只需要保留原始请求 headers 以密切关注它们,你可以看到如何 here 但要点是添加一个带有 [=10 的 nginx 指令=] 当您将请求代理到您的负载平衡实例之一时,它的变量

取决于您使用的实例数量 docker-compose 可能比使用 swarm 更容易,后者不那么简单