有没有办法从GCloud的HTTP负载平衡中获取用户的原始IP?我们目前只使用网络负载平衡,并且需要转移到跨区域平衡器,尽管我们需要用户的IP来进行合规性和日志记录。
它是否传入标题或沿着这些行的东西?
谢谢~Z
答案 0 :(得分:7)
文档(https://cloud.google.com/compute/docs/load-balancing/http/)表示它是X-Forwarded-For标头的第一个IP地址。
X-Forwarded-For: <client IP(s)>, <global forwarding rule external IP>
答案 1 :(得分:4)
如果您确定没有在Google Cloud Balancing之后运行任何其他代理(将额外的IP附加到X-Forwarded-For),您可以从X-Forwarded获取倒数第二个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。
答案 2 :(得分:1)
好的,所以在通过标题和其他东西挖掘后,我发现以下标题是为用户传递原始IP和IP。
$_SERVER['HTTP_X_FORWARDED_FOR']
您需要将其拆分为','并取出字符串的第一部分。这是用户IP,由Google Cloud HTTP Balancer推送。
答案 3 :(得分:0)
基于 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。
答案 4 :(得分:0)
我找到了这篇文章 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;