это хорошо известное поведение, которое я с удовольствием объясню.Балансировщик сетевой нагрузки представил функцию сохранения адреса источника - исходные 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.