GCP Classic VPN in Terraform: maak de tunnel routegebaseerd
In Classic VPN bepaalt het label niet het gedrag. Routegebaseerd betekent een lokale selector 0.0.0.0/0, overeenkomende externe selectors en een expliciete route.
Het plan wordt schoon toegepast, de tunnel komt omhoog en de console noemt hem beleidsgebaseerd. Verkeer gaat nog steeds niet door, en het zoeken naar een routegebaseerde schakelaar in de Terraform-resource leidt nergens toe omdat dat veld niet bestaat. In Classic VPN is routegebaseerd gedrag geen modus die je kiest. Het is wat je krijgt als de lokale traffic-selector 0.0.0.0/0 is, de externe selectors de netwerken opsommen die je echt wilt en een route naar de tunnel wijst. Drie dingen, en het label volgt.
De mythe: een veld voor tunnelmodus
Het consolelabel weerspiegelt wat de API in de selectors ziet. Niets in de resource zegt routegebaseerd, dus er is niets om op waar te zetten.
Dat veld zoeken kost het eerste uur van het probleem, terwijl het lezen van de selectorwaarden de laatste vijf minuten kost.
Wat routegebaseerd hier betekent
Google documenteert de routegebaseerde tunnels van Classic VPN als beleidsgebaseerde tunnels waarvan de lokale selector 0.0.0.0/0 is. Alleen de externe bereiken worden benoemd, en de lokale kant wordt als elk adres behandeld. Daarom is de markering in je configuratie een waarde en geen modus. Schrijf beide selectors expliciet en lees ze in de planuitvoer:
local_traffic_selector = ["0.0.0.0/0"]
remote_traffic_selector = ["10.20.0.0/16"]
Het peer-voorvoegsel in dat fragment is illustratief; de vorm is het deel dat telt.
De route is een apart object
Een tunnelobject installeert geen route. Pakketten kunnen bij het beleid van de tunnel passen en toch nergens heen kunnen, omdat de VPC-routingtabel de volgende hop bepaalt. De route heeft het bestemmingsbereik, het netwerk, de tunnel als volgende hop en een prioriteit nodig die alles breder verslaat. Wie dat vergeet, krijgt een tunnel die gevestigd rapporteert en een ping die de VPC nooit verlaat.
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
}
Maak de route in dezelfde module als de tunnel, zodat de twee in de review niet uit elkaar lopen.
Spiegel de selectors op de peer
Het externe apparaat moet met het spiegelbeeld worden geconfigureerd: zijn lokale bereik is jouw externe selector, en zijn externe bereik moet de GCP-subnetten dekken die je verwacht te gebruiken. Als een van beide kanten versmalt, mislukt fase 2 ook al lukt fase 1. Dat is de meest voorkomende vorm van een configuratie die er in de console goed uitziet en geen verkeer draagt.
Print de selectors van beide kanten naast elkaar tijdens de wijzigingsreview.
Splits het statische adres in twee toepassingen
Het gereserveerde adres en de tunnel die ernaar verwijst in één toepassing aanmaken is een bekende bron van onrust, omdat het adres moet bestaan voordat de doorstuurregel het kan gebruiken. Pas eerst alleen de adresresource toe, voeg dan de gateway, de doorstuurregels en de tunnel toe en pas opnieuw toe. Terraform leest het bestaande adres bij de tweede run uit de state en hergebruikt het. Sla je dat over, dan kan de tunnel bij elke toepassing een nieuw openbaar adres krijgen, wat de peer-configuratie elke keer breekt.
Twee toepassingen nu zijn goedkoper dan een peer-wijziging bij elke release.
Verifieer de onderhandeling, niet het label
Controleer na het toepassen drie afzonderlijke feiten: de tunnel rapporteert gevestigd, de route bestaat met de bedoelde volgende hop, en de peer rapporteert dat zowel fase 1 als fase 2 omhoog zijn.
Een tunnel die omhoog is terwijl fase 2 omlaag is, betekent dat de twee kanten het niet eens zijn over de selectors:
- De ene kant noemt een subnet dat de andere niet noemt.
- De ene kant gebruikt een aggregatie die de andere heeft versmald.
- De route bestaat maar wijst naar een andere tunnel.
Classic VPN is één tunnel met een lagere SLA dan HA VPN, en HA VPN gebruikt twee interfaces, twee tunnels en BGP met andere resourcetypen. Een klassiek voorbeeld naar een HA-configuratie kopiëren en verwachten dat de selectorvelden zich hetzelfde gedragen is een aparte fout die het waard is te vermijden. De tunnelvelden zelf zijn gedocumenteerd in de referentie voor google_compute_vpn_tunnel.