【问题标题】:Symfony2 uses wrong "x-forwarded-for" on AWS Load Balancer / 2 Ip addressesSymfony2 在 AWS 负载均衡器 / 2 个 IP 地址上使用了错误的“x-forwarded-for”
【发布时间】:2017-05-30 19:50:04
【问题描述】:

简单/小问题。

我的 Amazon AWS ELB 向我发送以下标头。

x-forwarded-for     84.134.167.231, 172.31.17.157
x-forwarded-host    app.example.org
x-forwarded-port    443
x-forwarded-proto   https
x-forwarded-server  ip-172-31-11-2.eu-central-1.compute.internal

但是请求使用的是第二个,本地机器ip地址。 - 172.31.17.157

有人知道如何解决这个问题吗? 是否可以覆盖 Symfony 的 Get IP 功能?

提前致谢!

//编辑 1 - HTTPs 配置

    files:
      /etc/httpd/conf.d/ssl.conf:
        mode: "000644"
        owner: root
        group: root
        content: |
          LoadModule ssl_module modules/mod_ssl.so
          Listen 443
          <VirtualHost *:443>
            <Proxy *>
              Order deny,allow
              Allow from all
            </Proxy>

            SSLEngine             on
            SSLCertificateFile    "/etc/pki/tls/certs/server.crt"
            SSLCertificateKeyFile "/etc/pki/tls/certs/server.key"
            SSLCipherSuite        EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
            SSLProtocol           All -SSLv2 -SSLv3
            SSLHonorCipherOrder   On
            SSLSessionTickets     Off

            Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
            Header always set X-Frame-Options DENY
            Header always set X-Content-Type-Options nosniff

            ProxyPass / http://localhost:80/ retry=0
            ProxyPassReverse / http://localhost:80/
            ProxyPreserveHost on
            RequestHeader set X-Forwarded-Proto "https" early

          </VirtualHost>

【问题讨论】:

  • 我想你会发现 ELB 确实没有“发送”给你这个,而是你的网络服务器添加 172.31.17.157,它是 ELB 节点的 IP,到 X-Forwarded-For,是 ELB 发送给您的 (84.134.167.231)。这将是您的 Web 服务器配置的问题。
  • @Michael-sqlbot 我已将我的 Web 服务器配置添加到 https 部分。 HTTP 有一个代理。也许这个代理添加了这个标头?那怎么解决这个问题呢?谢谢;-)
  • 它不会出现在与 SSL 相关的配置的这一部分中。我不熟悉 Symphony,但看起来 this 告诉您,如果您配置类似 trusted_proxies: [172.31.0.0/16] 的内容,那么 X-Forwarded-For 末尾的额外地址将被忽略。根据您在问题中显示的内容,172.31.0.0/16 是我认为是您的 VPC 的 CIDR 超网。

标签: php symfony amazon-web-services amazon-elb x-forwarded-for


【解决方案1】:

是的,您需要覆盖 getIP 函数(或任何等效函数)才能使其适用于 ELB。注意,仅适用于 ELB。

根本问题是X-Forwarded-For 没有统一的标准。

大多数代理工具,例如 Nginx,都会设置X-Forwarded-For: client, proxy1, proxy2。 但是,ELB 会设置X-Forwarded-For: proxy1, proxy2, client

因此,大多数 Web 框架在使用 ELB 时都会遇到 IP 欺骗问题。

修复很简单,只需要选择X-Forwarded-For的最后一部分。但是你可以想象,如果一个请求通过多个使用不同标准的代理进行路由,那么最终找到真正的 IP 地址就没有简单的方法了。

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 2021-03-07
    • 1970-01-01
    • 2021-05-02
    • 2016-01-25
    • 1970-01-01
    • 2014-10-22
    • 2012-11-25
    • 1970-01-01
    相关资源
    最近更新 更多