【问题标题】:Getting Orgin IP From Load Balancer从负载均衡器获取 Orgin IP
【发布时间】:2016-05-16 17:24:22
【问题描述】:

有没有办法从带有 GCloud 的 HTTP 负载平衡中获取用户的原始 IP?我们目前仅使用网络负载平衡,并且需要迁移到跨区域平衡器,尽管我们需要用户的 IP 以进行合规性和日志记录。

它是否传递了标题或类似的东西?

谢谢~Z

【问题讨论】:

    标签: google-compute-engine google-cloud-platform


    【解决方案1】:

    好的,所以在挖掘了标头和其他内容之后,我发现了以下标头,它为用户传递了原始 IP 和你的 IP。

    $_SERVER['HTTP_X_FORWARDED_FOR']
    

    你需要用','来分割它并取字符串的第一部分。这是用户 IP,由 Google Cloud HTTP 平衡器推送。

    【讨论】:

      【解决方案2】:

      文档 (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-F-F 设置为欺骗地址。您是正确的,此标头作为一种安全机制并不完全健全。
      • 我的意思是在这种情况下,GCP 可以对 LB 进行编程,以便它从实际传入请求中设置源 IP,而不是从请求的标头中读取它(并覆盖现有的 X-Real-IP 标头,如果客户已经设置好了)。
      • @Tony,实际上发生的情况是所有云服务提供商都保留标头中的任何内容,在末尾添加连接 IP + 负载均衡器的 IP。请参阅下面 cakraww 的答案
      【解决方案3】:

      如果您确定没有在 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: &lt;unverified IP(s)&gt;, &lt;immediate client IP&gt;, &lt;global forwarding rule external IP&gt;, &lt;proxies running in GCP&gt; (requests only)

      负载平衡器仅提供 &lt;immediate client IP&gt;&lt;global forwarding rule external IP&gt; 条目。中的所有其他条目 该列表未经验证直接传递。

      位于直接客户端 IP 之前的 IP 可能是欺骗 IP 或来自客户端代理的 IP。即使客户端欺骗了 X-Forwarded-For 标头,负载均衡器仍然会附加命中负载均衡器的实际 IP。

      【讨论】:

        【解决方案4】:

        基于 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。

        【讨论】:

          【解决方案5】:

          我找到了这篇文章 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;
          

          【讨论】:

          猜你喜欢
          • 2019-01-09
          • 2021-12-07
          • 1970-01-01
          • 2020-02-20
          • 2018-08-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-10
          • 1970-01-01
          相关资源
          最近更新 更多