【发布时间】:2016-05-16 17:24:22
【问题描述】:
有没有办法从带有 GCloud 的 HTTP 负载平衡中获取用户的原始 IP?我们目前仅使用网络负载平衡,并且需要迁移到跨区域平衡器,尽管我们需要用户的 IP 以进行合规性和日志记录。
它是否传递了标题或类似的东西?
谢谢~Z
【问题讨论】:
标签: google-compute-engine google-cloud-platform
有没有办法从带有 GCloud 的 HTTP 负载平衡中获取用户的原始 IP?我们目前仅使用网络负载平衡,并且需要迁移到跨区域平衡器,尽管我们需要用户的 IP 以进行合规性和日志记录。
它是否传递了标题或类似的东西?
谢谢~Z
【问题讨论】:
标签: google-compute-engine google-cloud-platform
好的,所以在挖掘了标头和其他内容之后,我发现了以下标头,它为用户传递了原始 IP 和你的 IP。
$_SERVER['HTTP_X_FORWARDED_FOR']
你需要用','来分割它并取字符串的第一部分。这是用户 IP,由 Google Cloud HTTP 平衡器推送。
【讨论】:
文档 (https://cloud.google.com/compute/docs/load-balancing/http/) 说它是 X-Forwarded-For 标头的第一个 IP 地址。
X-Forwarded-For: <client IP(s)>, <global forwarding rule external IP>
【讨论】:
X-Forwarded-For 的请求,则此标头可能会被欺骗。如果 GCP 可以指定一个选项来创建一个 X-Real-IP 标头,该选项将覆盖具有此名称的任何请求标头,那将是很棒的,只设置请求的 IP,因此它不会被欺骗..
X-Real-IP 标头,如果客户已经设置好了)。
如果您确定没有在 Google Cloud Balancing 后面运行任何其他代理(将附加 IP 附加到 X-Forwarded-For),则可以从 X-Forwarded-For 获取倒数第二个 IP 作为直接客户端 IP .或者,即使您有一些代理,但知道将附加的额外 IP 的确切数量,您也可以将它们添加到考虑中。
来自https://cloud.google.com/compute/docs/load-balancing/http/#components:
X-Forwarded-For: <unverified IP(s)>, <immediate client IP>, <global forwarding rule external IP>, <proxies running in GCP> (requests only)负载平衡器仅提供
<immediate client IP>和<global forwarding rule external IP>条目。中的所有其他条目 该列表未经验证直接传递。
位于直接客户端 IP 之前的 IP 可能是欺骗 IP 或来自客户端代理的 IP。即使客户端欺骗了 X-Forwarded-For 标头,负载均衡器仍然会附加命中负载均衡器的实际 IP。
【讨论】:
基于 HTTP_X_FORWARDED_FOR 标头,一个很好的 Nginx 规则来分割 IP 链:
set $realip $remote_addr;
if ($http_x_forwarded_for ~ "^(\d+\.\d+\.\d+\.\d+)") {
set $realip $1;
}
fastcgi_param REMOTE_ADDR $realip;
将其粘贴在 include fastcgi_params; 指令之后即可生效。
如果您使用 Cloudflare,您可以从 HTTP_CF_CONNECTING_IP 获取原始客户端 IP。
【讨论】:
我找到了这篇文章 https://geko.cloud/forward-real-ip-to-a-nginx-behind-a-gcp-load-balancer/
您可以将 GCP 已知的 IP 列入白名单/忽略,例如注册负载均衡器所需的静态 ip
set_real_ip_from 36.129.221.25/32; // LB Public IP address
set_real_ip_from 130.211.0.0/22; // Private IP range for GCP Load Balancers
set_real_ip_from 35.191.0.0/16; //Private IP range for GCP Load Balancers
real_ip_header X-Forwarded-For;
real_ip_recursive on;
【讨论】: