Symfony2在AWS Load Balancer / 2 Ip地址上使用了错误的“x-forwarded-for”

时间:2017-01-16 02:10:00

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

简单/小问题。

我的亚马逊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>

1 个答案:

答案 0 :(得分:0)

是的,您将需要覆盖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的最后一部分即可。但是,您可以想象,如果一个请求通过使用不同标准的多个代理进行路由,那么最终将找不到简单的方法。