【问题标题】:How to get real client ip behind docker load balancer using plain tcp?如何使用普通 tcp 在 docker 负载均衡器后面获取真实的客户端 IP?
【发布时间】:2021-11-21 16:00:35
【问题描述】:

我想要什么

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

我是如何接近它的

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

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

问题

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

问题

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

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

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

【问题讨论】:

    标签: python docker tcp network-programming docker-swarm


    【解决方案1】:

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

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

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

    【讨论】:

    • 这里有一些。不就是http吗?
    • 它应该对tcp有效并且依赖于docker网络。
    【解决方案2】:

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

    根据您使用 docker-compose 的实例数量,可能比使用 swarm 更容易,后者稍微少了一点裸露的骨头

    【讨论】:

    • 我是笨笨的,还是关于http的?
    • 不仅,nginx支持更多的协议
    猜你喜欢
    • 2019-06-21
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多