繁体   English   中英

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

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

我想要的是

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

我是如何接近它的

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

它包含TCPServer.handler_stream(stream: IOStream, address: tuple[str, int])从那里我可以得到客户端的 IP 地址。 使用 host.network 运行时一切都很好(即直接公开我的端口)

问题

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

问题

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

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

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

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

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

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

最简单的解决方案是用另一个类似 nginx 的负载均衡器替换负载均衡器,这是一个很好的 swarm 指南在 nginx 配置文件中,您只需要保留原始请求标头以密切关注它们,您可以在此处查看操作方法,但是要点是添加带有X-Forwarded-For变量的 nginx 指令,用于当您将请求代理到您的负载平衡实例之一时

取决于您使用 docker-compose 的实例数量,可能比使用 swarm 更容易,而 swarm 的裸骨少一些

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM