在docker-swarm httpd代理中获取真实客户端远程ip?

在docker-swarm httpd代理中获取真实客户端远程ip?

我正在以模式运行httpd apache2代理。docker swarmdocker stack deploy

问题:当我访问 时mymachine:80access.log仅显示docker ingressswarm网络的远程ip,如10.0.0.2。 而不是真实客户端的ip。

问题:我怎样才能告诉 Swarm 保留原始 IP 地址(也许将其写入另一个 IP 标头?),而不必强制我的容器或端口进入mode: host

因为我不想使用零停机部署,这是我在 docker-swarm 模式下没有主机模式下的容器所拥有的。

答案1

简而言之,在您要求的限制内没有办法实现这一点。

Docker swarm 使用流量转发而不是监听端口来处理入口流量。您可以通过 看到这种迹象iptables -nL,并注意到 docker 防火墙规则(DOCKER-USERDOCKER-INGRESS等)在FORWARD链中,而不是INPUT链中(并且时不时地您会看到用户感到惊讶,他们的入口防火墙规则没有阻止流量)。

正如您所指出的,打开端口mode: host将解决“真实 IP”问题(因为监听端口将位于主机的“真实”网络命名空间上),但这会阻止您进行零停机部署(因为端口是正在使用的单一资源)。

相关内容