从 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.1REMOTE_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 - 无法从外部/浏览器访问

从 Google Compute Engine 网络负载平衡器后面访问外部客户端 IP

从 Django/Python3 部署到 Google Compute Engine Managed VM