
У меня есть набор серверов 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 для создания размещенной зоны. Для получения дополнительной информации см. Использование доменных имен с Elastic Load Balancing
Но если мне нужно ввести IP-адрес, я не могу использовать CNAME (ни Amazon, ни свой собственный). Есть ли решение этой проблемы?
решение1
Если вы можете гарантировать, что все запросы будут поступать из 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
Сегодня лучшей практикой является использование VPC, так что тогда вы будете знать точный CIDR для вашего ELB. Затем вы можете добавить что-то вроде этого в ваш файл конфигурации Nginx:
real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;
решение3
Используйте 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-адресов для внутреннего частного IP-адреса Amazon ELBдля получения лучших ответов.