从 Google Compute Engine 网络负载平衡器后面访问外部客户端 IP
Posted
技术标签:
【中文标题】从 Google Compute Engine 网络负载平衡器后面访问外部客户端 IP【英文标题】:Access external client IP from behind Google Compute Engine network load balancer 【发布时间】:2016-07-06 14:37:25 【问题描述】:我正在 Google Container Engine 上运行 Ruby on Rails 应用程序(在 nginx 模式下使用 Passenger)。这些 pod 位于 GCE 网络负载均衡器后面。我的问题是如何从 Rails 应用程序内部访问外部Client IP
。
Github 问题here 似乎提出了解决方案,但我运行了建议:
for node in $(kubectl get nodes -o name | cut -f2 -d/); do
kubectl annotate node $node \
net.beta.kubernetes.io/proxy-mode=iptables;
gcloud compute ssh --zone=us-central1-b $node \
--command="sudo /etc/init.d/kube-proxy restart";
done
但我仍然收到 10.140.0.1
的 REMOTE_ADDR
标头。
关于如何访问真实的Client IP
(用于地理定位)的想法?
编辑:更清楚地说,我知道从 Rails 内部访问客户端 IP 的方法,但是所有这些解决方案都让我获得了内部 Kubernetes IP,我相信没有配置 GCE 网络负载均衡器(或可能无法)发送真实的客户端 IP。
【问题讨论】:
***.com/questions/4465476/rails-get-client-ip-address ***.com/questions/3887943/… How to access client IP of an HTTP request from Google Container Engine?的可能重复 【参考方案1】:Google 员工对我的问题的another version 的回答验证了我目前正在尝试使用 Google 容器引擎网络负载均衡器执行的操作是不可能的。
编辑(2017 年 5 月 31 日):从 Kubernetes v1.5 及更高版本开始,这可以在 GKE 上使用 beta 注释 service.beta.kubernetes.io/external-traffic
。这是在 SOhere 上回答的。请注意,当我添加注释时,健康检查不是在现有节点上创建的。重新创建 LB 并重启节点解决了这个问题。
【讨论】:
【参考方案2】:似乎这根本不是 Rails 问题,而是 GCE 问题之一。你可以试试第一部分
request.env["HTTP_X_FORWARDED_FOR"]
说明
Getting Orgin IP From Load Balancer 建议https://cloud.google.com/compute/docs/load-balancing/http/ 有文字
代理设置 HTTP 请求/响应标头如下:
Via: 1.1 google
(请求和响应)X-Forwarded-Proto: [http | https]
(仅限请求)X-Forwarded-For: <client IP(s)>, <global forwarding rule external IP>
(仅限请求) 可以是逗号分隔的 IP 地址列表,具体取决于客户端所在的中介附加的 X-Forwarded-For 条目 穿越。部分中的第一个元素 显示原始地址。X-Cloud-Trace-Context: <trace-id>/<span-id>;<trace-options>
(仅限请求) Stackdriver Trace 的参数。
【讨论】:
感谢您的回复。我的问题应该更清楚,我同意你的观点,这不是 Rails 问题,而且 HTTP 负载平衡器似乎确实有可能,但是我目前正在使用 network 负载平衡器,我找不到有关如何检索原始 IP 的文档。 @JaredS:感谢您的反馈。似乎网络负载平衡器仅在 TCP 级别工作(出于您的目的,还有 AH、UDP 等,截至cloud.google.com/compute/docs/load-balancing/network/…)。这使得添加原始 IP 变得非常重要。您可能能够重定向到 Squid 代理或 HTTP 负载平衡器,然后添加源 IP,如 ***.com/a/8108013/1587329 中所述,但我可能误解了。以上是关于从 Google Compute Engine 网络负载平衡器后面访问外部客户端 IP的主要内容,如果未能解决你的问题,请参考以下文章
Google Compute Engine:无法从 gcloud 终端查询 API
将文件从 Google Compute Engine VM 复制到 Windows 本地主机
ImportError:没有名为 google_compute_engine 的模块
Google Compute Engine 上的 Flask - 无法从外部/浏览器访问