Amazon Elastic Load Balancer поддерживает протокол PROXY версия 1. Это позволяет серверу за балансировщиком нагрузки определять исходный исходный IP-адрес клиентского соединения.
Однако спецификация протокола В разделах 2 и 5 разъясняется, что вы должны каким-то образом гарантировать, что только авторизованные конечные точки могут подключаться к порту, поддерживающему этот протокол. В противном случае злоумышленник может напрямую подключиться к серверу, обойти прокси-сервер и отправить заголовок PROXY, требуя любой исходный IP-адрес, который он пожелает.
У меня вопрос, как это сделать с ELB? Насколько я могу судить, нет фиксированного списка исходных IP-адресов, которые могут подключаться к вашим серверам. Невозможно ограничить порт так, чтобы к нему мог подключаться только ваш ELB. Кажется, что любой может создать экземпляр EC2 и напрямую подключиться к вашему серверу через тот же порт, к которому прокси ELB, выдать себя за балансировщик нагрузки и заявить, что подключается с любого IP-адреса, который ему нравится.
Это не может быть правдой. Что мне не хватает?
Итак, вы пытаетесь разрешить подключения к своим экземплярам EC2 только из ELB.
Вы можете сделать это в консоль управления или (как и большинство других вещей AWS) через API. Я определю метод консоли управления.
Сначала нам нужно определить пользователя безопасности и имя вашего ELB. Перейти к консоль управления, выберите EC2 и вкладку Load Balancers. Выберите балансировщик нагрузки из списка и перейдите на вкладку «Безопасность» в настройках. Здесь вы увидите свой Группа безопасности источника. Вероятно, это будет "amazon-elb / amazon-elb-sg", но я сохраню эту инструкцию здесь на случай, если она изменится в будущем ;-)
Теперь перейдите в меню «Группы безопасности» и выберите группу, которую вы используете для своих серверов EC2. Добавьте новое правило, где Источником является "amazon-elb / amazon-elb-sg" (или другая группа ELB). Убедитесь, что у вас нет других правил для входящего трафика для этого порта, хотя вы все равно можете разрешить прямой доступ к другим портам, не охваченным ELB.
Используя последнюю версию haproxy, вы можете использовать:
tcp-request connection expect-proxy layer4 if *condition*
Это включит протокол прокси только для соответствия правилам состояние. Таким образом, вы можете включить его только для узлов ELB (конечно, если вы знаете их адреса).
Сетевой интерфейс, который ваш виртуальный сервер использует для связи, позволяет подключаться только к частным IP-адресам (192.168.x, 172.16.x, 10.x), принадлежащим другим виртуальным серверам, запущенным тем же клиентом. Таким образом, вы не можете произвольно получить доступ к виртуальному серверу другого клиента, подключившись к его частному IP-адресу и порту.