Client VPN daje klijentu adresu, rukovanje se završava, a veza ipak ne ide nikuda. Prije nego što dirnete certifikate ili verzije klijenta, pogledajte vlastitu tabelu ruta endpointa. AWS Client VPN endpoint prosljeđuje paket samo kada jedna od njegovih ruta pokriva prefiks odredišta; ako ništa ne odgovara, paket se odbacuje na endpointu i ciljni host nikada ne vidi SYN.

To je odluka o prosljeđivanju, a ne o autentifikaciji. Događa se nakon što je tunel podignut i nakon što su pravila autorizacije procijenjena, zato valjan certifikat i valjana grupa ipak mogu dati mrtvu vezu.

Endpoint prosljeđuje samo ono što pokriva njegova tabela ruta

Svaka ruta je CIDR odredišta plus podmreža koja treba primiti saobraćaj. Endpoint upoređuje klijentovo odredište s tim spiskom, bira odgovarajući zapis i šalje paket u pridruženu podmrežu. Nema zapisa znači nema sljedećeg skoka.

Obratite pažnju šta ruta nije. Ona nije zapis u tabeli ruta VPC-a i ne autorizuje ništa. Pravila autorizacije određuju može li grupa dosegnuti odredište; rute određuju ima li endpoint kuda poslati paket. Oboje se mora slagati, a otkazuju s različitim simptomima, pa nagađanje šta je pokvareno troši cijelo popodne.

Klasična neusklađenost je peered VPC. Neko doda rutu za 10.20.0.0/24 dok host živi u 10.20.4.0/24, pa adresa pada izvan svakog zapisa. Snimak na strani klijenta pokazuje ponovljene SYN-ove bez odgovora, a zapisi cilja ne pokazuju baš ništa.

Pročitajte spisak ruta prije certifikata

Rute endpointa su zaseban objekat, pa ih pitajte direktno umjesto da čitate tabelu VPC-a:

aws ec2 describe-client-vpn-routes --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0 --query 'Routes[].{Dest:DestinationCidr,Target:TargetSubnet,Origin:Origin}'

Uzmite tačnu adresu i dužinu prefiksa od klijenta koji ne uspijeva, pa provjerite pokrivenost znak po znak. Primjenjuje se podudaranje najdužeg prefiksa, pa vas šira ruta ne spašava kada uža pokazuje negdje drugdje.

Jedan resurs po odredištu uz for_each

Ručno pisani blokovi ruta se raziđu istog trenutka kada neko doda prefiks u konzoli. Držite odredišta u mapi i kreirajte jedan resurs po ključu, da svako dodavanje ili uklanjanje ostane izolovano.

variable "client_vpn_routes" {
  type = map(string)
  default = {
    "10.20.0.0/16"  = "subnet-0aa11bb22cc33dd44"
    "172.31.0.0/20" = "subnet-0aa11bb22cc33dd44"
  }
}

resource "aws_ec2_client_vpn_route" "this" {
  for_each               = var.client_vpn_routes
  client_vpn_endpoint_id = var.client_vpn_endpoint_id
  destination_cidr_block = each.key
  target_vpc_subnet_id   = each.value
  depends_on             = [aws_ec2_client_vpn_network_association.this]
}

Zadržite zavisnost od mrežne asocijacije. Ruta treba pridruženu podmrežu, pa apply koji kreira oboje mora prvo poredati asocijaciju, a bez te reference Terraform je slobodan da prvo pokuša rutu. Zatim pročitajte plan: broj dodavanja ruta treba da odgovara prefiksima koje ste dodali. Ako plan zamjenjuje i endpoint, resurs endpointa je pogrešno napisan, a njegova primjena prekida svakog povezanog klijenta.

Preuzimanje endpointa koji niste kreirali

Većina timova naslijedi endpoint izgrađen u konzoli, zato ne postoji kod za rute. Ne podižite drugi endpoint samo da biste ubacili rute u Terraform.

Umjesto toga uvezite ili proslijedite id-jeve kao varijable i ostavite naslijeđene objekte neupravljanim. Uvoz zahtijeva format identifikatora koji provajder dokumentuje za svaki tip resursa; on kodira endpoint, prefiks odredišta i ciljnu podmrežu. Kopirajte taj niz iz dokumentacije resursa umjesto da ga sastavljate po pamćenju, pokrenite plan i očekujte da nema promjena prije nego što dodate nešto novo.

Pratite paket redom kojim putuje

Kada ruta postoji a veza i dalje ne uspijeva, prođite put redom umjesto da nagađate na gornjem sloju.

  1. Ruta: prefiks pokriva odredište i pokazuje na podmrežu pridruženu endpointu.
  2. Autorizacija: pravilo autorizacije dozvoljava to odredište za korisnikovu grupu. Sama ruta nikada ne daje pristup.
  3. Povratni put: tabela ruta ciljne podmreže šalje odgovore natrag prema endpointu, a sigurnosna grupa dozvoljava port iz bazena adresa klijenta.
  4. Aplikacija: otvorite stvarnu TCP vezu s klijenta, pa potvrdite da zapisi cilja pokazuju očekivanu izvornu adresu iz bazena.

Mijenjajte jedan prefiks po apply, zatim ponovo pročitajte spisak ruta i zabilježite odredište, pravilo koje autorizuje i povratni put zajedno. Sljedeća osoba koja bude ispravljala odbijenu vezu treba da počne od tog popisa, a ne od teorije o certifikatima.

Povezani članci