В AWS при создании NLB у вас есть возможность указать идентификатор экземпляра вместо IP-адреса экземпляра. Это заставляет NLB сохранять IP-адрес клиента.
Однако, если я настрою NLB для целевых экземпляров в частной подсети, где таблица маршрутов включает маршрут по умолчанию к шлюзу NAT, как ответ может быть направлен обратно через интерфейс NLB, а не через шлюз NAT?
Рассмотрим следующее:
- VPC с блоком CIDR 10.0.0.0/16;
- общедоступная подсеть с блоком CIDR 10.0.3.0/24;
- Частная подсеть с блоком CIDR 10.0.6.0/24.
Общедоступная подсеть имеет маршрут по умолчанию к интернет-шлюзу, а частная подсеть имеет маршрут по умолчанию к шлюзу NAT. Шлюз NAT имеет интерфейс с частным IP-адресом 10.0.3.12, а NLB имеет интерфейс с частным IP-адресом 10.0.3.18.
Экземпляр EC2 с IP 10.0.6.4 развернут в частной подсети и является частью целевой группы NLB. Экземпляр имеет маршрут по умолчанию к маршрутизатору VPC по адресу 10.0.6.1 в таблице маршрутизации ОС.
Предположим, что пакет с IP-адресом клиента 22.128.22.136 перенаправляется на экземпляр EC2, как экземпляр EC2 сможет отправить пакет обратно на 10.0.3.18, а не на шлюз NAT. В таблице маршрутизации частной подсети по умолчанию указан маршрут 10.0.3.12.
Я предполагаю, что AWS немедленно «вводит» маршрут к NLB для любого IP-адреса клиента, когда пакет поступает на интерфейс NLB. Хотелось бы узнать больше о внутренностях.
С tcpdump
на экземпляре EC2 я вижу, что IP-адрес клиента сохраняется:
$ sudo tcpdump -n -i eth0 хост 22.128.22.136 порт 80