простой / маленький вопрос.
Мой 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
Кто-нибудь знает, как решить эту проблему?
Можно ли переписать функции Get IP в Symfony?
Заранее спасибо!
// edit 1 — Конфигурация HTTP
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>
Да, вам нужно будет переписать функцию getIP (или что-нибудь подобное), чтобы она работала для ELB. Обратите внимание, только для ELB.
Основная проблема заключается в том, что не существует универсального согласованного стандарта для X-Forwarded-For
,
Большинство прокси инструментов, таких как Nginx, установят X-Forwarded-For: client, proxy1, proxy2
,
Тем не менее, ELB установит X-Forwarded-For: proxy1, proxy2, client
,
Поэтому большинство веб-фреймворков будут иметь проблему с подделкой IP при использовании ELB.
Исправление простое, просто нужно выбрать последнюю часть X-Forwarded-For
, Но, как вы можете себе представить, если запрос направляется через несколько прокси-серверов, использующих разные стандарты, то нет простого способа найти реальный IP-адрес в конце.
Других решений пока нет …