Nginx set_real_ip_from AWS ELB-адреса балансира навантаження


22

У мене є набір серверів Nginx за балансиром навантаження Amazon ELB. Я використовую set_real_ip (від HttpRealIpModule ), щоб я міг отримати доступ до вихідної IP-адреси клієнта на цих серверах (для проходження до php-fpm та для використання в HttpGeoIPModule ).

Здається, що set_real_ip_fromв конфігурації nginx можна приймати лише IP-адресу. Однак, що стосується машин ELB, Amazon кажуть:

Примітка. Оскільки набір IP-адрес, пов'язаних з LoadBalancer, може змінюватися з часом, ви ніколи не повинні створювати запис "A" з будь-якою конкретною IP-адресою. Якщо ви хочете використовувати дружнє ім’я DNS для свого LoadBalancer замість імені, створеного службою Elastic Load Balancing, вам слід створити запис CNAME для імені DNS LoadBalancer або скористатися Amazon Route 53 для створення розміщеної зони. Для отримання додаткової інформації див. Використання доменних імен з еластичним балансуванням навантаження

Але якщо мені потрібно ввести IP-адресу, я не можу використовувати CNAME (амазонську чи власну). Чи є рішення цієї проблеми?

Відповіді:


40

Якщо ви можете гарантувати, що всі запити надходять від ELB (я не знайомий з цим), ви можете спробувати:

real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;

Це повинно сказати nginx довіряти заголовку X-Forwarded-For від будь-кого. Мінус полягає в тому, що якщо хтось безпосередньо звернеться до вашого сервера, він зможе підробити заголовок X-Forwarded-For, а nginx використовує неправильну ip адресу клієнта.


2
Дякую - я не усвідомлював, що можу додати туди IP-діапазон ... Я перевірю, чи є більш конкретний діапазон, на який може бути ELB (я думаю, він 10.0.0.1/8би працював, хоча може бути щось більш конкретне)
vitch

Я додав додаткове запитання, щоб дізнатися, чи знає хто дійсний діапазон: serverfault.com/questions/331697/…
vitch

Якщо це ALB VPC, ваш діапазон (и) такий же, як і ваші діапазони підмереж, до складу яких входить LB.
талонкс

17

Найкращою практикою сьогодні є використання VPC, тож ви дізнаєтесь точний CIDR для свого ELB. Потім ви можете додати щось подібне до файлу конфігурації Nginx:

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;

Вважаючи, що питання з 2011 року, можливо, тоді варіант був недоступний. Я просто включаю всі можливі приватні мережі, оскільки сторонні користувачі не зможуть легко дістатися до них.
Jordan Reiter

7

Використовуйте CIDR VPC для. set_real_ip_fromВи можете знайти його на консолі Amazon під VPC => Ваш VPC (замінити <your VPC CIDR here>на нього):

real_ip_header X-Forwarded-For;
set_real_ip_from <your VPC CIDR here>;

4

Якщо встановити довірений діапазон на 0,0.0,0/0 на Amazon ELB, це точно призведе до виникнення проблем. Ви можете гарантувати, що запити надходять від ELB, якщо ви можете налаштувати групу безпеки для вашого сервера nginx, але початковий запит походитиме з будь-якого можливого джерела (ELBs Amazon - це публічні інтерфейси).

Простий тест виявить це:

curl --header "X-Forwarded-For: 1.2.3.4" "http://your-elb-dns-address/"

Журнали на вашому сервері nginx показуватимуть 1.2.3.4 як справжній IP, який є підробленим. Для кращих відповідей див. Діапазон IP для внутрішнього приватного IP Amazon ELB .


3
Це буде лише проблема, якщо ви ввімкнули real_ip_recursive , що не є типовим, і навіть не існувало, коли я спочатку відповів на це питання.
колб'як

3

У модулі realip_module зазначено, що у випадку X-Forwarded-For цей модуль використовує для заміни останню ip адресу в заголовку X-Forwarded-For. Цей модуль не працюватиме , якщо тільки real_ip_headerі set_real_ip_formвстановлені. Це пояснюється тим, що цей модуль буде використовувати IP-адресу проксі замість IP-адреси клієнта. Для вирішення цієї real_ip_recursiveдирективи слід включити.

Крім того, якщо у вас є сертифікати SSL, які розгорнуті та відновлені в екземплярі (наприклад, сертифікати letsencrypt або certbot). Ці сертифікаційні органи можуть спробувати перевірити ці сертифікати через IPV6.

Тому важливо також мати IPV6. Отже, конфігураційний файл Nginx також повинен містити set_real_ip_від IPV6 адреси.

real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from <your VPC IPV4 CIDR here>;
set_real_ip_from <your VPC IPV6 CIDR here>;

якщо застосовуються додаткові обмеження безпеки, можливо, нам також знадобиться включити set_real_ip_fromVPC CIDR (як IPV4, так і IPV6) для підмереж cloudfront / elb / ec2.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.