Google compute engine 从Google计算引擎网络负载平衡器后面访问外部客户端IP

Google compute engine 从Google计算引擎网络负载平衡器后面访问外部客户端IP,google-compute-engine,Google Compute Engine,我正在谷歌容器引擎上运行RubyonRails应用程序(在Nginx模式下使用Passenger)。这些吊舱位于GCE网络负载平衡器后面。我的问题是如何从Rails应用程序内部访问外部客户端IP Github问题似乎提供了一个解决方案,但我运行了以下建议: for node in $(kubectl get nodes -o name | cut -f2 -d/); do kubectl annotate node $node \ net.beta.kubernetes.io/pro

我正在谷歌容器引擎上运行RubyonRails应用程序(在Nginx模式下使用Passenger)。这些吊舱位于GCE网络负载平衡器后面。我的问题是如何从Rails应用程序内部访问外部
客户端IP

Github问题似乎提供了一个解决方案,但我运行了以下建议:

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\u ADDR
标题

关于如何访问真正的
客户端IP
(用于地理定位)的想法


编辑:更清楚地说,我知道从Rails内部访问客户端IP的方法,但是所有这些解决方案都为我提供了内部Kubernetes IP,我相信GCE网络负载平衡器没有配置(或者可能无法)发送真正的客户端IP。

这似乎根本不是Rails的问题,但是GCE的一个。你可以试试第一部分

request.env["HTTP_X_FORWARDED_FOR"]
解释 建议有文本的

代理按如下方式设置HTTP请求/响应头:

  • Via:1.1谷歌
    (请求和响应)
  • X-Forwarded-Proto:[http | https]
    (仅限请求)
  • X-Forwarded-For:,
    (仅限请求) 可以是一个以逗号分隔的IP地址列表,具体取决于客户端所属中介附加的X-Forwarded-For条目 穿越。节中的第一个元素 显示源地址
  • X-Cloud-Trace-Context:/(仅限请求)
    Stackdriver跟踪的参数
Google对我的一个问题的回答验证了我正在尝试做的事情在Google容器引擎网络负载平衡器中是不可能的


编辑(2017年5月31日):从Kubernetes v1.5及更高版本开始,这可以在GKE上通过beta注释
service.beta.Kubernetes.io/external traffic
实现。答案是这样的。请注意,当我添加注释时,没有在现有节点上创建运行状况检查。重新创建LB并重新启动节点解决了此问题。

可能重复感谢您的回复。在我的问题上我应该更清楚,我同意你的看法,这不是Rails的问题,HTTP负载平衡器似乎也有可能,但是我目前使用的是网络负载平衡器,我找不到有关如何检索原始IP的文档。@JaredS:谢谢你的反馈。网络负载平衡器似乎只在TCP级别工作(出于您的目的,还有AH、UDP等,从)。这使得添加原始IP变得非常重要。您可能可以重定向到Squid代理或HTTP负载平衡器,然后添加源IP,如中所述,但我可能误解了。