GCP Classic VPN no Terraform: torne o túnel baseado em rotas
No Classic VPN o rótulo não decide o comportamento. Baseado em rotas é um seletor local 0.0.0.0/0, seletores remotos correspondentes e uma rota explícita.
O plano aplica-se sem problemas, o túnel sobe e a consola chama-lhe baseado em políticas. O tráfego continua a não passar, e a procura de um interruptor baseado em rotas no recurso Terraform não leva a lado nenhum porque esse campo não existe. No Classic VPN, o comportamento baseado em rotas não é um modo que se escolhe. É o que se obtém quando o seletor de tráfego local é 0.0.0.0/0, os seletores remotos listam as redes que realmente se quer e uma rota aponta para o túnel. Três coisas, e o rótulo segue.
O mito: um campo de modo do túnel
O rótulo da consola reflete o que a API vê nos seletores. Nada no recurso diz baseado em rotas, por isso não há nada para definir como verdadeiro.
Procurar esse campo consome a primeira hora do problema, enquanto ler os valores dos seletores ocupa os últimos cinco minutos.
O que significa aqui baseado em rotas
A Google documenta os túneis baseados em rotas do Classic VPN como túneis baseados em políticas cujo seletor local é 0.0.0.0/0. Apenas os intervalos remotos são nomeados, e o lado local é tratado como qualquer endereço. É por isso que o marcador na sua configuração é um valor e não um modo. Escreva os dois seletores de forma explícita e leia-os na saída do plano:
local_traffic_selector = ["0.0.0.0/0"]
remote_traffic_selector = ["10.20.0.0/16"]
O prefixo do par nesse trecho é ilustrativo; a forma é o que importa.
A rota é um objeto separado
Um objeto de túnel não instala uma rota. Os pacotes podem corresponder à política do túnel e mesmo assim não ter para onde ir, porque a tabela de encaminhamento da VPC decide o próximo salto. A rota precisa do intervalo de destino, da rede, do túnel como próximo salto e de uma prioridade que ganhe a qualquer coisa mais ampla. Quem se esquece disso fica com um túnel que reporta estabelecido e um ping que nunca sai da 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
}
Crie a rota no mesmo módulo do túnel, para que os dois não se afastem na revisão.
Espelhe os seletores no par
O dispositivo remoto tem de ser configurado com a imagem espelhada: o intervalo local dele é o seu seletor remoto, e o intervalo remoto tem de cobrir as sub-redes GCP que espera usar. Se qualquer dos lados estreitar, a fase 2 falha mesmo que a fase 1 tenha sucesso. É a forma mais comum de uma configuração que parece correta na consola e não transporta tráfego.
Imprima os seletores dos dois lados lado a lado durante a revisão da alteração.
Divida o endereço estático em duas aplicações
Criar o endereço reservado e o túnel que lhe faz referência numa única aplicação é uma fonte conhecida de instabilidade, porque o endereço tem de existir antes de a regra de encaminhamento o poder usar. Aplique primeiro apenas o recurso do endereço, depois acrescente a gateway, as regras de encaminhamento e o túnel e aplique de novo. O Terraform lê o endereço existente do estado na segunda execução e reutiliza-o. Se saltar isso, o túnel pode receber um novo endereço público em cada aplicação, o que quebra a configuração do par todas as vezes.
Duas aplicações agora são mais baratas do que uma alteração de par em cada versão.
Verifique a negociação, não o rótulo
Depois de aplicar, verifique três factos separados: o túnel reporta estabelecido, a rota existe com o próximo salto previsto e o par reporta que a fase 1 e a fase 2 estão ativas.
Um túnel ativo com a fase 2 em baixo significa que os dois lados não concordam quanto aos seletores:
- Um lado lista uma sub-rede que o outro não lista.
- Um lado usa um agregado que o outro estreitou.
- A rota existe mas aponta para outro túnel.
O Classic VPN é um único túnel com um SLA inferior ao HA VPN, e o HA VPN usa duas interfaces, dois túneis e BGP com tipos de recurso diferentes. Copiar um exemplo clássico para uma configuração HA e esperar que os campos de seletor se comportem da mesma forma é um erro à parte que vale a pena evitar. Os próprios campos do túnel estão documentados na referência do google_compute_vpn_tunnel.