AWS Client VPN или bastion для доступа к VPC с peering
Оба пути работают, но ломаются в разных местах. Сравните маршруты endpoint, обратную маршрутизацию и три случая, когда bastion — честная граница.
Один endpoint Client VPN может достучаться до VPC, который соединён peering с его связанным VPC, и для законности этого bastion не нужен. Выбор, который стоит сделать, — где трафик меняет хозяина: маршрут endpoint, который попадает в подсеть ассоциации и пересекает peering-соединение, или хост в VPC с peering, который завершает сеанс. Оба пути работают и отказывают в разных местах, поэтому решение о владении и аудите, а не о том, что разрешает AWS. Вот как я выбираю между ними, и четыре записи, которые заставляют маршрутизируемый путь работать.
Два пути, один endpoint, разные владельцы
На маршрутизируемом пути трафик клиента доходит до endpoint, транслируется в адрес сетевого интерфейса Client VPN в подсети ассоциации и покидает эту подсеть через peering-соединение из A в B. VPC B не завершает ни одного VPN-сеанса; он видит обычный трафик из VPC A, поэтому его обратный маршрут указывает на VPC A, а не на пул клиентов.
На пути через bastion клиент сначала попадает на хост. Bastion в A всё ещё оставляет последний переход за peering-соединением, поэтому работа peering остаётся, а сеанс добавляется. Bastion в B тоже требует пути от клиента, и когда этот путь — тот же маршрут endpoint, вы получаете маршрутизируемую схему плюс один переход. Bastion убирает работу только тогда, когда он уже существует, уже одобрен, и тому, что за ним, нужна граница сеанса, а не граница сети.
Четыре записи заставляют маршрутизируемый путь работать
AWS описывает этот сценарий на странице Client VPN how-it-works, и на практике всё сводится к четырём записям, которыми владеют две или три команды. Диапазоны приведены для примера; диапазон с peering должен быть уникальным, а обратный диапазон должен соответствовать вашему плану.
| Control | What it must say |
|---|---|
| Endpoint route | 10.70.0.0/16 targets the association subnet |
| Authorization rule | The approved group may reach 10.70.0.0/16 |
| VPC A association-subnet table | 10.70.0.0/16 targets the peering connection |
| VPC B resource-subnet table | VPC A's range targets the same peering connection |
Маршрут и разрешение — разные средства контроля. Правильный маршрут endpoint без подходящего правила авторизации ничего не даёт клиенту; правило авторизации для адресата, который endpoint не может маршрутизировать, даёт ему чёрную дыру. Оба должны называть один и тот же диапазон.
Маршрут endpoint указывает на подсеть в собственном VPC endpoint, никогда на peering-соединение. Таблицы маршрутов VPC указывают на peering-соединение, никогда на инстанс или интерфейс. Копирование значения между ними сохраняется без возражений и ничего не маршрутизирует.
Поскольку подсеть ассоциации транслирует источник клиента, B должен маршрутизировать обратно в VPC A, а не в пул клиентов. Отправка клиентского диапазона через peering-соединение выглядит симметрично, проходит проверку и тихо отказывает, потому что B никогда не видит пакет с клиентским источником.
Группы безопасности и последний метр разрешения
Маршрутизация приносит пакеты в B; решает по-прежнему B. Для активного peering-соединения в том же регионе группа безопасности в B может ссылаться на группу, применённую к ассоциации Client VPN, что держит правило узким и переживает смену адресов. Там, где ссылка на группу неосуществима, разрешите диапазон подсети ассоциации явно вместо расширения до 0.0.0.0/0, которое превращает ошибку маршрутизации в необъяснимый тайм-аут.
Затем проверьте то, чего маршрутизация никогда не касается: сетевые ACL на обеих подсетях, список разрешённых или аудиторию токена приложения, и DNS. Peering не копирует приватные хост-зоны, поэтому ноутбук может держать рабочий маршрут к адресу, который не может разрешить, а peering-соединение не добавляет доверия сертификату. Направьте endpoint на резолвер, который отвечает за B, и затем подтвердите, что приватное имя и сертификат совпадают.
Когда bastion — честный ответ
Я держу три триггера для осознанного выбора bastion. VPC с peering принадлежит команде, которая не добавит обратный маршрут для вашего диапазона или не примет ссылку на группу. Доступ должен утверждаться или записываться для каждого сеанса, а приложение не может нести это само. Или последний переход должен остаться внутри B, потому что сервис разрешается только там, а его идентичность TLS привязана к внутреннему имени.
Ничто из этого не обходит того, что peering не транзитивен. Нетранзитивность ограничивает то, что могут делать ресурсы в B: они не могут использовать A как транзит к третьему VPC, с которым A соединён peering. Это никогда не означало, что пользователь VPN не может напрямую достичь VPC с peering, а bastion, построенный в обход этого неверного прочтения, — хост, который латают без причины.
Обратная ошибка со временем стоит дороже: проведите каждую команду через единственный уже существующий bastion, а затем обнаружьте, что его группа безопасности, таблица маршрутов и окно обновлений — это производственная зависимость. Запишите, какому триггеру служит хост, и выведите его из эксплуатации, когда триггер исчезнет.
Transit Gateway и несколько ассоциаций меняют арифметику
Если endpoint подключён напрямую к Transit Gateway, а не к подсети, модель меняется: клиенты больше не транслируются в адрес интерфейса в подсети ассоциации, и таблицы маршрутов шлюза должны нести клиентский диапазон плюс подключение, ведущее к VPC с peering. В масштабе это чище, но работа переезжает с четырёх записей в таблицы маршрутов шлюза.
Несколько ассоциаций умножают проверки. Маршрут endpoint принадлежит endpoint, но каждой подсети ассоциации нужна таблица маршрутов с настоящим следующим переходом peering. Сеанс может пройти через одну ассоциацию, пока у другой нет обратного пути, поэтому проверяйте каждую.
Порядок проверки, который быстро находит поломку
Выполняйте их по порядку; каждый шаг может пройти, пока следующий отказывает, а тайм-аут клиента почти никогда не говорит, что именно сломалось.
- Разрешите имя приложения с клиента и проверьте, что адрес находится внутри диапазона с peering.
- Подключитесь, затем прочитайте журнал соединений endpoint для ассоциации, которая завершила сеанс.
- В этой подсети ассоциации подтвердите, что таблица маршрутов направляет диапазон с peering на активное peering-соединение.
- В подсети ресурсов в B подтвердите обратную запись для диапазона интерфейса и соответствующие правила группы.
- Проверьте одну разрешённую операцию и один ресурс, который должен остаться недоступным; второй ловит остатки отладки.
- Переподключитесь после любого изменения маршрута split-tunnel, потому что работающий туннель не примет новый набор маршрутов.
Два симптома стоит запомнить. SYN, который доходит до B без ответа, почти всегда отсутствующий обратный маршрут. Соединение, которое завершается и затем сбрасывается, обычно группа, ACL или приложение. Ни один не появляется в журнале endpoint как причина, поэтому держите четыре записи с владельцем рядом с каждой.
Если ни один из трёх триггеров не действует, завершите маршрутизируемый путь и запишите эти четыре записи. Если действует один, держите bastion только для этой границы и оставьте маршрут endpoint сервисам, которым не нужен сеанс перед ними.