Nginx set_real_ip_from Адрес балансировщика нагрузки AWS ELB

22

У меня есть набор серверов Nginx за балансировщиком нагрузки Amazon ELB. Я использую set_real_ip (от HttpRealIpModule ) , так что я могу получить доступ к IP - адрес исходящего клиента на этих серверах (для прохождения через РНР-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 (ни свой Amazon, ни свой). Есть ли решение этой проблемы?

vitch
источник

Ответы:

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-адрес клиента.

kolbyjack
источник
2
Спасибо - я не осознавал, что могу добавить диапазон IP-адресов ... Я проверю, есть ли более конкретный диапазон, на котором может быть ELB (думаю, 10.0.0.1/8будет работать, хотя может быть что-то более конкретное)
vitch
Я добавил прослеживания вопрос , чтобы выяснить , если кто - нибудь знает допустимый диапазон: serverfault.com/questions/331697/...
vitch
Если это VPC ALB, ваш диапазон (ы) совпадает с диапазонами вашей подсети, частью которой является LB.
talonx
17

На сегодняшний день лучше всего использовать VPC, поэтому вы будете знать точный CIDR для своего ELB. Затем вы можете добавить что-то вроде этого в ваш файл конфигурации Nginx:

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;
николай
источник
Учитывая, что вопрос с 2011 года, возможно, этот вариант не был доступен тогда. Я просто включил все возможные частные сети, поскольку внешние пользователи не смогут легко к ним добраться.
Джордан Рейтер
7

Используйте VPC CIDR, чтобы 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, но исходный запрос будет исходить из любого возможного источника (Amazon ELB являются открытыми интерфейсами).

Простой тест покажет это:

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

В журналах на вашем сервере nginx 1.2.3.4 будет показан реальный IP-адрес, который является поддельным. Посмотрите IP Range для внутреннего частного IP Amazon ELB для лучших ответов.

Эвен Андре Фисквик
источник
3
Это будет проблемой только в том случае, если вы включите real_ip_recursive , который не используется по умолчанию и даже не существовал, когда я первоначально ответил на вопрос.
kolbyjack
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_from адрес 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.

Хариш Ченнамсетти
источник