Внутренний networkloadbalancer не будет маршрутизировать к экземпляру X, когда curl от NLB DNS от экземпляра X - PullRequest
0 голосов
/ 28 мая 2019
  • У меня есть внутренний балансировщик сетевой нагрузки (NLB) (преобразование в частные ips)
  • Приемник NLB на порте 80 указывает на целевую группу. Экземпляр 10.141.80.140 в целевой группе является единственным.

Проблема:
Когда я на экземпляре 10.141.80.140 и свернуть DNS NLB Я не получил ответа.
Я ожидаю, что NLB перенаправит на 10.141.80.140 , но этого не происходит.
DNS NLB не перенаправляет только, когда я нахожусь на 10.141.80.140 - перенаправление работает от других экземпляров в той же подсети

Подробности:

  • Группа безопасности вокруг EC2 10.141.80.140 является открытой, входящей и исходящей
  • Когда я скручиваю DNS NLB из другого экземпляра 10.141.80. 122 в той же подсети с той же группой безопасности и другими настройками - NLB правильно разрешается в 10.141.80.140
  • Когда я скручиваю DNS NLB из экземпляра, для которого NLB должен разрешить 10.141.80. 140 - NLB DOESNT разрешить до 10.141.80.140
  • Когда я скручиваю экземпляр ip 10.141.80.140 из экземпляра 10.141.80. 140 - я получаю ответ
  • Когда я скручиваю экземпляр ip 10.141.80.140 из экземпляра 10.141.80. 122 - я получаю ответ

Вопрос:
Есть ли что-то, что мешает NLB разрешить запрос экземпляра, который направил бы обратно к экземпляру в целевой группе слушателей NLB?

enter image description here

1 Ответ

0 голосов
/ 28 мая 2019

это хорошо известное поведение, которое я с удовольствием объясню.Балансировщик сетевой нагрузки представил функцию сохранения адреса источника - исходные IP-адреса и исходные порты для входящих соединений остаются неизменными.Когда цель отвечает на запрос, внутреннее устройство VPC перехватывает этот пакет и пересылает его в NLB, который перенаправляет его к месту назначения.

Такое поведение имеет побочный эффект: когда ядро ​​ОС обнаруживает, что выходной пакетимеет в качестве адреса назначения один из локальных адресов, он будет перенаправлять этот пакет непосредственно в приложение.

Например, с учетом следующих компонентов:

  • У нас есть внутренний NLB иэкземпляр бэкэнда.Оба развернуты в подсети 10.0.0.0/24.
  • . NLB имеет IP 10.0.0.10 и прослушиватель на порту 80, который перенаправляет запрос на порт 8080.
  • Внутренний экземпляр имеет адрес 10.0.0.55 и веб-сервер, прослушивающий порт 8080. Он имеет группу безопасности, которая разрешает весь входящий локальный трафик.

  • Если экземпляр пытается установитьсвязь с NLB;поток обмена данными будет следующим:

    • Экземпляр хочет подключиться к NLB по протоколу telnet: он запрашивает установление TCP-соединения с DNS-именем NLB на порту 80.
      • Поскольку это исходящее сообщение, оно начинается с эфемерного порта;экземпляр отправляет пакет SYN (1):
        • Источник: 10.0.0.55:40000
        • Назначение: 10.0.0.10:80
      • NLBполучает пакет и пересылает его в бэкэнд-экземпляр (10.0.0.55:80).
      • Благодаря функции сохранения адреса, бэкэнд-экземпляр получает пакет SYN со следующей информацией:
        • Source:10.0.0.55:40000
        • Назначение: 10.0.0.55:80
      • Операционная система маршрутизирует пакет внутренне (так как ее назначением является собственная машина), и здеськогда возникает проблема:
        • Инициирующий сокет ожидает SYN_ACK от 10.0.0.10:80 (NLB).
        • Однако он получает SYN_ACK от 10.0.0.55:40000 (экземплярсама).
        • ОС будет отправлять несколько TCP_RETRANSMISSION до истечения времени ожидания.

Это не будетпроизойдет с общедоступным NLB, так как экземпляр должен будет выполнять NAT в VPC, чтобы использовать свой публичный IP-адресотправить запрос в NLB.Ядро не будет пересылать пакет изнутри.

Наконец, возможный обходной путь - регистрация бэкэндов по их IP-адресу, а не по идентификатору экземпляра;с помощью этого метода трафик, передаваемый NLB, будет содержать внутренний IP-адрес NLB в качестве исходного IP-адреса, отключая функцию «сохранения исходного адреса».К сожалению, если вы запускаете экземпляры с помощью группы AutoScaling, она сможет зарегистрировать запущенные экземпляры только по ее идентификатору.В случае задач ECS настройка сети как «awsvpc» заставляет NLB регистрировать каждую цель по ее IP.

...