Povezani ste na endpoint AWS Client VPN, privatna podmreža odgovara, a svaka javna stranica i dalje istječe. Ta kombinacija sužava problem na jedan od tri objekta na upravljanoj strani: rutu koju klijent instalira, rutu endpointa zajedno s njezinim pravilom autorizacije ili sljedeći skok povezane podmreže. Provjeravam ih tim redom jer svaki kvar izgleda drukčije s klijentske strane. Ovaj priručnik pokriva upravljani endpoint povezan s VPC-om, ne OpenVPN poslužitelj na EC2 instanci i ne Cloud WAN ili Transit Gateway prilog.

Počnite s onim što klijent zapravo usmjerava

Stanje povezanosti dokazuje TLS sesiju i dodjelu CIDR-a klijentu, ništa više. Pitajte operacijski sustav kamo bi javna adresa otišla dok je tunel aktivan. Na Linuxu ip route get 1.1.1.1 treba navesti sučelje tunela; na macOS-u netstat -rn -f inet | head -5 pokazuje zadanu stavku; na Windowsu Find-NetRoute -RemoteIPAddress 1.1.1.1 ispisuje odabrano sučelje i sljedeći skok.

Zatim pročitajte zastavicu split-tunnel, jer ona odlučuje jesu li objavljene rute endpointa jedina odredišta koja klijent šalje u tunel:

aws ec2 describe-client-vpn-endpoints \
  --client-vpn-endpoint-ids cvpn-endpoint-0123456789abcdef0 \
  --query 'ClientVpnEndpoints[0].SplitTunnel'

Kad je SplitTunnel true, javno odredište koristi tunel samo kad endpoint objavi rutu koja ga pokriva, pa nedostajuća 0.0.0.0/0 ostavlja taj promet na lokalnom sučelju. Kad je false, klijent hvata promet, ali endpoint ga ipak mora usmjeriti i autorizirati; inače paketi ulaze u tunel i tamo se zaustavljaju. Ponovno povežite klijent nakon promjene bilo koje od dvije postavke, jer se rute i DNS poslužitelji dostavljaju u trenutku povezivanja i pokrenut klijent može zadržati stari skup.

Čitajte rutu endpointa i pravilo autorizacije odvojeno

To su dva objekta i stvaranje jednoga ne stvara drugi. Izlistajte rute endpointa i potražite zadanu rutu čija je meta povezana podmreža:

aws ec2 describe-client-vpn-routes \
  --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0

Svaka ruta ima točno jednu ciljnu podmrežu, pa tri asocijacije trebaju odgovarajuću zadanu rutu za svaku. AWS dokumentira taj zahtjev pokrivenosti, a praktični simptom praznine je korisnik koji radi iz jedne podmreže i zapinje iz druge, što izgleda kao povremeni kvar umjesto rute koja nedostaje. Službena dokumentacija scenarija Client VPN opisuje raspored javne podmreže kojem te rute pripadaju.

Autorizacija je drugi objekt. Kad nijedno pravilo ne pokriva javno odredište, tunel nosi paket, a servis ga odbacuje, pa privatni resursi nastavljaju raditi dok internet ne radi:

aws ec2 describe-client-vpn-authorization-rules \
  --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0

Pravilo za VPC CIDR ne govori ništa o 0.0.0.0/0. Dodavanje dijelova koji nedostaju za puni tunel znači jednu rutu po povezanoj podmreži plus pravilo autorizacije koje možete kasnije revidirati:

aws ec2 create-client-vpn-route \
  --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0 \
  --destination-cidr-block 0.0.0.0/0 \
  --target-vpc-subnet-id subnet-0a1b2c3d4e5f67890
aws ec2 create-client-vpn-authorization-rule \
  --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0 \
  --destination-cidr-block 0.0.0.0/0 \
  --access-all \
  --description "internet egress for full tunnel"

--access-all daje odredište svakom klijentu endpointa, pa ga držite samo dok tunel treba biti pun; pravilo vezano za grupu imenika bolje je kad imate grupe za vezanje.

Pratite paket izvan povezane podmreže

Ruta endpointa odlučuje da AWS predaje paket toj podmreži. Ona ne odlučuje sljedeći skok nakon nje, koji živi u vlastitoj VPC tablici ruta podmreže:

aws ec2 describe-route-tables \
  --filters Name=association.subnet-id,Values=subnet-0a1b2c3d4e5f67890 \
  --query 'RouteTables[].Routes[?DestinationCidrBlock==`0.0.0.0/0`]'

Upotrebljiva zadana ruta pokazuje na internet gateway za javnu podmrežu ili na NAT gateway za privatnu, a stanje blackhole znači da je meta izbrisana i put sada tiho umire. To su drukčije tablice od popisa ruta endpointa i popravak jedne ne popravlja drugu.

Na tom skoku stoje dva filtra. Sigurnosna grupa primijenjena na mrežnu asocijaciju mete mora dopuštati izlazni promet prema javnom odredištu, a primjenjivi mrežni ACL mora dopuštati zahtjev i povratni promet na efemernim portovima. Restriktivna sigurnosna grupa asocijacije čest je razlog zašto privatni pristup radi, a javni ne.

Odaberite prvi sloj prema simptomu umjesto da mijenjate sva tri odjednom:

What you observeLayer to check first
No tunnel interface for a public IPClient route or split-tunnel flag
Tunnel interface chosen, request times outEndpoint route and authorization rule
Endpoint route present, still times outSubnet route table, association security group
Named host fails, numeric address worksDNS servers and their own authorization

Odvojite kvar DNS-a od mrtve rute

Razlučivanje imena pada drukčije od prosljeđivanja, a puni tunel čini tu razliku važnom jer se gurnuti resolver sada doseže kroz tunel. Ako endpoint navodi VPC DNS poslužitelje, njihove adrese trebaju pokrivenost rutom i autorizaciju kao i svako drugo odredište. Pitajte resolver izravno da vidite koji kvar imate: dig +short example.com @10.0.0.2, ili nslookup example.com 10.0.0.2 na Windowsu.

Kad numerički URL odgovara, a imenovani ne, prestanite uređivati zadanu rutu i radite na DNS-u. Zahtjev na IP adresu ne dokazuje ništa o imenovanom virtualnom hostu i njegovu certifikatu, pa zadržite jedan imenovani test u završnoj provjeri.

Vrijeme pomaže. TCP veza koja ne dobije odgovor unutar nekoliko sekundi upućuje na usmjeravanje ili filtar, a zahtjev koji visi u traženju imena upućuje na resolver. Promjena zadane rute dok je resolver nedostupan obično pretvara jedan kvar u dva.

Vratite čisto, zatim provjerite izlazni put

Oba su objekta bila aditivna, pa je vraćanje brisanje, a ne popravak:

aws ec2 delete-client-vpn-route \
  --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0 \
  --destination-cidr-block 0.0.0.0/0 \
  --target-vpc-subnet-id subnet-0a1b2c3d4e5f67890
aws ec2 delete-client-vpn-authorization-rule \
  --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0 \
  --destination-cidr-block 0.0.0.0/0 \
  --access-all

Ponovno se povežite i potvrdite kojim putem promet izlazi. Usporedite opaženu javnu adresu s elastičnom IP adresom NAT gatewaya ili s internet gatewayem koji ste namjeravali koristiti i provjerite odgovara li privatni resurs još u istoj sesiji.

Završite kratkim popisom i tretirajte posljednju stavku kao dio promjene, a ne kao dokumentaciju:

  • Jedna 0.0.0.0/0 ruta endpointa za svaku povezanu podmrežu.
  • Pravilo autorizacije koje pokriva 0.0.0.0/0 za klijente kojima namjeravate služiti.
  • Zadana VPC ruta koja nije u stanju blackhole na svakoj povezanoj podmreži.
  • Izlaz sigurnosne grupe asocijacije plus povratni promet ACL-a.
  • Adrese resolvera usmjerene i autorizirane, provjerene imenovanim zahtjevom.
  • Zabilježeno vraćanje za rutu i pravilo.

Jedna napomena o opsegu: ovo je IPv4 put. Dvostruki stog klijenta zadržava kakvu IPv6 povezanost već ima, pa je zadana ruta IPv6 zasebna odluka s vlastitom autorizacijom, a ne nuspojava ove.

Povezani članci