Mano nešiojamasis rodė prisijungęs. AWS Client VPN klientas rodė žalią būseną, endpoint užregistravo sesiją, ir vis tiek negalėjau atidaryti MongoDB prievado EC2 instancijoje privačiame potinkyje. Niekas akivaizdžiai nebuvo sugedę: sertifikatas galiojo, profilis atėjo iš konsolės, o tunelis pernešė srautą. Klaida buvo mano, nes prisijungęs skaičiau kaip autorizuotas.

Prisijungimas atsako tiksliai į vieną klausimą: ar ši tapatybė gali užmegzti sesiją? Viską po to sprendžia atskiros taisyklės, kurios niekada nemato tavo sertifikato. Sesija, kuri autentifikuojasi, ir paketas, kuris atvyksta, yra dvi skirtingos sėkmės, o tarpas tarp jų yra vieta, kur gyvena dauguma pranešimų tipo VPN įjungtas, bet hostas nepasiekiamas.

Žemiau pateikti patikrinimai yra ta tvarka, kurią dabar naudoju.

Ką iš tikrųjų įrodo prisijungusi sesija

Per handshake endpoint tikrina kliento sertifikatą savo trust store atžvilgiu arba, kai sukonfigūruotas SAML, nukreipia naršyklę į tavo tapatybės teikėją. Jei tai praeina, klientas gauna adresą iš endpoint kliento CIDR, o konsolė rodo aktyvų ryšį. Nė vienu to mainų momentu niekas neklausia, ar gali pasiekti 10.0.4.17 per 27017 prievadą.

Leidimas į paskirties tašką yra atskiras objektas endpoint. Kiekvienas srautas lyginamas su autorizacijos taisyklėmis, ir kiekviena jų susieja paskirties CIDR su grupe, kuriai taisyklė suteikta. Kai nė viena taisyklė neapima paskirties, endpoint priima sesiją ir meta srautą. Nėra jokio banerio, jokios persijungimo kilpos ir nieko kliento sąsajoje, kas sakytų atmesta.

Palygink autorizacijos taisyklę su ištekliumi, o ne su VPC

Išvardyk taisykles ir padėk jas šalia adreso, kurį instancija iš tikrųjų turi:

aws ec2 describe-client-vpn-authorization-rules \
  --client-vpn-endpoint-id cvpn-endpoint-0a1b2c3d4e5f6a7b8

Išvestis rodo paskirties CIDR ir grupės ID kiekvienai taisyklei. Joje slypi dvi nesėkmės. Taisyklė gali autorizuoti 10.0.0.0/16, o instancija yra peeringu sujungtoje VPC 10.1.0.0/16; peering maršrutas yra, bet niekas neparašė autorizacijos taisyklės antrajam diapazonui. Arba taisyklė nurodo katalogo grupę, kuriai naudotojas priklauso kataloge, bet ne tai grupei, kurią vertina endpoint.

Parašyk siauriausią taisyklę, kuri apima paskirtį, ir antrą pridėk tik tada, kai antro CIDR tikrai reikia. Plati 0.0.0.0/0 taisyklė iš greitos pradžios veikia, ir būtent todėl ji išlieka produkcijoje ir paslepia modelį.

Ar paketas judės, sprendžia dvi maršrutų lentelės

Endpoint maršrutas susieja paskirties CIDR su vienu iš potinkių, su kuriais endpoint susietas. Tai pusė kelio. Paties potinkio maršrutų lentelė vis dar turi žinoti, kaip perduoti paketą toliau, ir tai svarbu tą akimirką, kai paskirtis yra už peering ryšio, transit gateway ar vietinio diapazono, pasiekiamo per site-to-site tunelį.

aws ec2 describe-client-vpn-routes \
  --client-vpn-endpoint-id cvpn-endpoint-0a1b2c3d4e5f6a7b8

Ieškok maršruto, kurio paskirtis atitinka ištekliaus CIDR ir kurio tikslas yra susietas potinkis. Jei maršruto nėra, pridėk jį. Jei jis yra, o hostas vis tiek tyli, tarpas yra VPC pusėje, tad palygink su asociacijos potinkio maršrutų lentele.

Vienas kliento pusės nustatymas sugadina maršrutizavimą nesugadindamas tunelio: profilis, kuriame yra route-nopull. Direktyva liepia OpenVPN pagrindu veikiančiam klientui ignoruoti maršrutus, kuriuos stumia serveris, todėl sąsaja pakyla tik su paties endpoint adresu, o paskirtis tiesiog neturi maršruto. Patikrink su ip route show Linux arba netstat -rn macOS, ar yra maršrutas per tun sąsają. Jei nėra, pašalink route-nopull iš eksportuoto profilio ir prisijunk iš naujo, kad stumiami maršrutai būtų pritaikyti.

Saugos grupės nemato tavo kliento adreso

Tai dalis, kurią visą popietę turėjau neteisingai. IPv4 endpoint, susietam su potinkiu, paslauga išverčia kliento šaltinio adresą į endpoint tinklo sąsajos adresą tame potinkyje. Paketas, kuris atvyksta į instanciją, neperneša adreso, kurį rodė tavo klientas, todėl saugos grupės taisyklė, leidžianti klientų baseiną, tarkim 172.16.0.0/22, nieko neatitinka.

Leisk prievadą iš endpoint saugos grupės, kuri pritvirtinta prie asociacijos sąsajos, o ne iš kliento CIDR. Nuoroda į grupę yra patvaresnė nei kietai įrašytas adresas, nes sąsajos adreso tu nekontroliuoji. Tinklo ACL yra be būsenos, todėl ten, kur yra pasirinktinių įrašų, ir įeinanti, ir išeinanti kryptis turi leisti srautą.

Prisijunk ir prie instancijos privataus adreso. Viešas IP išveda paketą iš VPC ir grąžina jį atgal kitu keliu su kitomis taisyklėmis, todėl viešo adreso testas nieko nesako apie privatų kelią.

Izoliacijos tvarka, kuri sustoja ties pirmąja nesėkme

Pereik juos iš eilės ir sustok ten, kur vienas nepavyksta. Kiekvienas žingsnis atmeta vieną sluoksnį, o ne visus.

  1. Patvirtink, kurią tapatybę naudojo sesija ir kurią grupę vertina endpoint. Sertifikatas iš vieno trust store nėra tas pats subjektas kaip SAML teiginys iš katalogo.
  2. Patvirtink, kad autorizacijos taisyklė apima ištekliaus CIDR tai grupei.
  3. Patvirtink, kad endpoint maršrutas yra ir nukreiptas į susietą potinkį, o paskui kad potinkio maršrutų lentelė gali perduoti toliau.
  4. Patvirtink, kad saugos grupė leidžia prievadą iš endpoint sąsajos, o ne iš klientų baseino.
  5. Išbandyk iš VPC vidaus, su SSM sesija kitoje to paties potinkio instancijoje, kad atskirtum programos problemą nuo kliento kelio problemos.

Kai žingsniai nėra lemiami, remiuosi šia lentele:

SymptomLayer to inspect
Client shows connected, host times out, no byte growth on the interfaceAuthorization rule, then security group
Ping fails but a TCP connect to the port succeedsICMP is blocked; not an access failure
Tunnel reconnects every few minutesTwo machines sharing one client certificate
Works on one laptop, fails on anotherLocal profile has route-nopull or stale pushed routes

Dvi paskyros detalės sukuria simptomus, kurie atrodo kaip leidimų nesėkmės. Kiekvienam naudotojui reikia atskiro kliento sertifikato; vieną dalijant tarp dviejų mašinų sesijos išstumia viena kitą, o rezultatas yra persijungimo kilpa, o ne atmetimas. Kai sukuriamas naujas endpoint, konsolė rodo DNS vardą, kurį kai kurios kliento versijos priima tik su atsitiktiniu priešdėliu, rodomu endpoint puslapyje, tad nukopijuok visą vardą, o ne atkurk jį.

Jei penktas žingsnis įstringa, prieš ką nors keisdamas ištrauk endpoint ryšių žurnalą ir perskaityk autorizacijos įrašus. Žurnalas nurodo patikrintą paskirtį ir taisyklę, kuri atitiko arba ne, ir tai suveda keturių sluoksnių klausimą į vieną atsakymą.

Susiję straipsniai