从后面访问外部客户端 IP Google Compute Engine 网络负载平衡器
Access external client IP from behind Google Compute Engine network load balancer
我是 运行 Ruby Rails 应用程序(在 Nginx 模式下使用 Passenger),在 Google 容器引擎上。这些 pods 位于 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
但我仍然得到 REMOTE_ADDR
header 的 10.140.0.1
。
关于如何访问真实 Client IP
(用于地理定位)的想法?
编辑:更清楚地说,我知道从内部访问客户端 IP 的方法 Rails,但是所有这些解决方案都让我获得了内部 Kubernetes IP,我相信 GCE 网络负载平衡器未配置(或可能无法)发送真实客户端 IP。
这似乎根本不是 rails 问题,而是 GCE 问题之一。您可以尝试
的第一部分
request.env["HTTP_X_FORWARDED_FOR"]
说明
advises that https://cloud.google.com/compute/docs/load-balancing/http/ 有文字
The proxies set HTTP request/response headers as follows:
Via: 1.1 google
(requests and responses)
X-Forwarded-Proto: [http | https]
(requests only)
X-Forwarded-For: <client IP(s)>, <global forwarding rule external IP>
(requests only)
Can be a comma-separated list of IP addresses depending on the X-Forwarded-For entries appended by the intermediaries the client is
traveling through. The first element in the section
shows the origin address.
X-Cloud-Trace-Context: <trace-id>/<span-id>;<trace-options>
(requests only)
Parameters for Stackdriver Trace.
Googler 对我的问题 的回答证实了我目前正在尝试做的事情目前无法通过 Google 容器引擎网络负载均衡器实现。
编辑(2017 年 5 月 31 日):从 Kubernetes v1.5 及更高版本开始,这可以在带有 beta 注释 service.beta.kubernetes.io/external-traffic
的 GKE 上实现。这在 SO here 上得到了回答。请注意,当我添加注释时,健康检查是 而不是 在现有节点上创建的。重新创建 LB 并重新启动节点解决了问题。
我是 运行 Ruby Rails 应用程序(在 Nginx 模式下使用 Passenger),在 Google 容器引擎上。这些 pods 位于 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
但我仍然得到 REMOTE_ADDR
header 的 10.140.0.1
。
关于如何访问真实 Client IP
(用于地理定位)的想法?
编辑:更清楚地说,我知道从内部访问客户端 IP 的方法 Rails,但是所有这些解决方案都让我获得了内部 Kubernetes IP,我相信 GCE 网络负载平衡器未配置(或可能无法)发送真实客户端 IP。
这似乎根本不是 rails 问题,而是 GCE 问题之一。您可以尝试
的第一部分request.env["HTTP_X_FORWARDED_FOR"]
说明
The proxies set HTTP request/response headers as follows:
Via: 1.1 google
(requests and responses)X-Forwarded-Proto: [http | https]
(requests only)X-Forwarded-For: <client IP(s)>, <global forwarding rule external IP>
(requests only) Can be a comma-separated list of IP addresses depending on the X-Forwarded-For entries appended by the intermediaries the client is traveling through. The first element in the section shows the origin address.X-Cloud-Trace-Context: <trace-id>/<span-id>;<trace-options>
(requests only) Parameters for Stackdriver Trace.
Googler 对我的问题
编辑(2017 年 5 月 31 日):从 Kubernetes v1.5 及更高版本开始,这可以在带有 beta 注释 service.beta.kubernetes.io/external-traffic
的 GKE 上实现。这在 SO here 上得到了回答。请注意,当我添加注释时,健康检查是 而不是 在现有节点上创建的。重新创建 LB 并重新启动节点解决了问题。