GCP Classic VPN в Terraform: сделайте туннель маршрутным
В Classic VPN метка не определяет поведение. Маршрутный режим — это локальный селектор 0.0.0.0/0, соответствующие удалённые селекторы и явный маршрут.
План применяется чисто, туннель поднимается, а консоль называет его основанным на политиках. Трафик всё равно не проходит, а поиск переключателя маршрутного режима в ресурсе Terraform ни к чему не ведёт, потому что такого поля нет. В Classic VPN маршрутное поведение — это не режим, который вы выбираете. Это то, что получается, когда локальный селектор трафика — 0.0.0.0/0, удалённые селекторы перечисляют сети, которые действительно нужны, а маршрут указывает на туннель. Три вещи, и метка следует за ними.
Миф: поле режима туннеля
Метка в консоли отражает то, что API видит в селекторах. Ничто в ресурсе не говорит маршрутный, поэтому нечего установить в значение истина.
Поиск этого поля съедает первый час проблемы, а чтение значений селекторов занимает последние пять минут.
Что здесь означает маршрутный
Google документирует маршрутные туннели Classic VPN как туннели на основе политик, локальный селектор которых — 0.0.0.0/0. Именуются только удалённые диапазоны, а локальная сторона рассматривается как любой адрес. Поэтому маркер в вашей конфигурации — это значение, а не режим. Запишите оба селектора явно и прочитайте их в выводе плана:
local_traffic_selector = ["0.0.0.0/0"]
remote_traffic_selector = ["10.20.0.0/16"]
Префикс партнёра в этом фрагменте иллюстративен; важна форма.
Маршрут — отдельный объект
Объект туннеля не устанавливает маршрут. Пакеты могут соответствовать политике туннеля и всё равно не иметь куда идти, потому что следующий шаг определяет таблица маршрутизации VPC. Маршруту нужны диапазон назначения, сеть, туннель как следующий шаг и приоритет, который побеждает всё более широкое. Если об этом забыть, получится туннель, сообщающий об установленном соединении, и проверка, которая никогда не покидает VPC.
resource "google_compute_route" "office" {
name = "office-via-vpn"
dest_range = "10.20.0.0/16"
network = google_compute_network.vpc.name
next_hop_vpn_tunnel = google_compute_vpn_tunnel.to_office.id
priority = 1000
}
Создавайте маршрут в том же модуле, что и туннель, чтобы они не разошлись при проверке.
Отразите селекторы на партнёре
Удалённое устройство нужно настроить зеркально: его локальный диапазон — это ваш удалённый селектор, а его удалённый диапазон должен покрывать подсети GCP, которые вы планируете использовать. Если любая сторона сузится, фаза 2 не удаётся, хотя фаза 1 успешна. Это самая распространённая форма конфигурации, которая выглядит правильно в консоли и не пропускает трафик.
Распечатайте селекторы обеих сторон рядом друг с другом во время проверки изменения.
Разделите статический адрес на два применения
Создание зарезервированного адреса и туннеля, который на него ссылается, в одном применении — известный источник нестабильности, потому что адрес должен существовать до того, как правило пересылки сможет его использовать. Сначала примените только ресурс адреса, затем добавьте шлюз, правила пересылки и туннель и примените снова. Terraform читает существующий адрес из состояния при втором запуске и использует его повторно. Если это пропустить, туннель может получить новый публичный адрес при каждом применении, что каждый раз ломает конфигурацию партнёра.
Два применения сейчас дешевле, чем изменение партнёра при каждом выпуске.
Проверяйте согласование, а не метку
После применения проверьте три отдельных факта: туннель сообщает об установленном соединении, маршрут существует с нужным следующим шагом, а партнёр сообщает, что и фаза 1, и фаза 2 подняты.
Туннель работает, но фаза 2 опущена — значит, стороны не сходятся в селекторах:
- Одна сторона перечисляет подсеть, которую другая не перечисляет.
- Одна сторона использует агрегат, который другая сузила.
- Маршрут существует, но указывает на другой туннель.
Classic VPN — это один туннель с более низким SLA, чем у HA VPN, а HA VPN использует два интерфейса, два туннеля и BGP с другими типами ресурсов. Копировать классический пример в конфигурацию HA и ожидать, что поля селекторов будут вести себя так же, — отдельная ошибка, которой стоит избегать. Сами поля туннеля описаны в справочнике google_compute_vpn_tunnel.