„Ar VPN įjungtas?” iš tikrųjų yra trys klausimai viename sakinyje. Kurio jų reikia jūsų kodui, yra pirmasis sprendimas, ir būtent jį dauguma realizacijų praleidžia. Ar šiame įrenginyje yra tunelis, ar srautas į šį tikslą išeina per jį, ar tolimasis galas atsako identitetu, kurio tikitės. Pasirinkite savybę, tada pasirinkite signalą, kuris ją matuoja, ir galiausiai žurnale parašykite, kurią iš jų iš tikrųjų išmatavote.

Trys savybės, trys signalai

Sutraukti į po vieną eilutę, trys klausimai turi tris skirtingus atsakymus. Toliau pateikta lentelė yra pats sprendimas, o ne jo santrauka.

PropertySignal that answers itWhat it still leaves open
ExistenceThe platform's own connection state: RAS on Windows, NetworkManager on D-Bus on Linux, scutil on macOSTunnels of a type the platform does not manage, which includes most third-party clients
PathA route lookup for the one destination, or a scoped proxy or interface key that names the tunnelWhether the far end is the peer you trust
IdentityAn authenticated response from the far end, or a source-address policy applied on the serverWhich local interface carried the packets

Paskutinę eilutę skaitykite lėtai. Atsakantis privatus hostas įrodo, kad kažkas atsakė, o ne tai, kad atsakymas atėjo per tunelį, ir nieko nesako apie tai, kas yra kitame gale. Jei savybė, kurios jums reikia, yra kelias, matuokite kelią.

Egzistavimas: pačios platformos būsena

Windows tai atsako vietiniams profiliams per Remote Access Service API. RasEnumConnections išvardija, kas prijungta, RasGetConnectStatus praneša vieno įrašo būseną, o RasGetLinkStatistics prideda greitį, baitų skaitiklius ir ryšio amžių. Ribos ir yra esmė: OpenVPN, WireGuard ir gamintojų klientai niekada neregistruoja RAS ryšio, todėl sveikas tokio tipo tunelis rodo tuščią sąrašą, o naivus kodas praneša jį esant išjungtą.

Linux darbalaukiai tą pačią savybę atskleidžia per NetworkManager D-Bus, kur PropertiesChanged VPN ryšio objekte paverčia patikrinimą įvykiu, o savybė State praneša, kada jungtis pasiekia prijungtą būseną. Iš shell nmcli connection show --active skaito tą pačią informaciją, ir būtent to norite derindami. macOS laiko šį sąrašą System Configuration sistemoje, o scutil yra jo komandinės eilutės vaizdas. Visi trys aprašo platformos valdomą ryšį, ir visi trys nutyla apie tunelį, kurio ji nevaldo.

Kelias: kur paketas iš tikrųjų eina

Pavadinimų sutapatinimas yra tas trumpiausias kelias, kurio visi pirmiausia griebiasi: išvardinkite sąsajas, patikrinkite eilutę su tun, tap, ppp arba ipsec ir laikykite sutapimą įrodymu. Tai euristika, ir sąsajų rinkinys gali atrodyti vienodai, nesvarbu, ar per jį kas nors juda. Senesnės iOS versijos atsakydavo taip, o vėlesnės nustojo, nes matomos sąsajos nebeatskyrė dviejų būsenų.

Tai, kas ten pakeitė, yra sistemos proxy žodynas. Kol VPN prijungtas, proxy nustatymų kvietimas grąžina raktus, apribotus su tuneliu susijusioms sąsajoms, o kai nieko neprijungta, žodynas grįžta tuščias. Tai silpnesnis teiginys, nei skamba, nes jis užfiksuoja sistemos įsitikinimą, kad tunelis egzistuoja, o ne kuri paskirtis jį naudoja.

Android turi savo šių spąstų versiją: vpn.connectivity transliacija pasiekia manifeste deklaruotus imtuvus kai kuriuose builduose, o kituose – vykdymo metu registruotus imtuvus. Laikykite tai geriausiomis pastangomis ir laikykite tiesioginę patikrą už jos.

Kai svarbi paskirtis, klauskite maršrutizavimo lentelės, o ne adapterių sąrašo. Numatytojo šliuzo euristikos lūžta kompiuteriuose su keliomis tinklais ir tuneliuose, kurie įdiegia savo šliuzą.

Tapatybė: patikrinkite tolimąjį galą

Ciklas, kas kelias sekundes siunčiantis ICMP aidą tolimajam galui, yra pigiausias tokio tipo patikrinimas, ir jis nepavyksta naudinga kryptimi. Nukreipkite jį į adresą, kuris egzistuoja tik privačiame tinkle, nes viešas adresas atsako per bet kokią veikiančią viršutinę jungtį ir nieko neįrodo. Kur ICMP filtruojamas, trumpas TCP ryšys su paslaugos prievadu atlieka tą patį darbą.

Serverio pusės patikrinimas turi lygiai vieną signalą: ryšio šaltinio adresą. Diapazonų inventorizacijos palaikymas yra priežiūros darbas, ir jis negali atskirti tunelio nuo bet kurio kito tinklo, kuris atsitiktinai naudoja tą patį bloką.

Grubi politika gali su tuo gyventi. Tapatybė negali, todėl autentiškinkite klientą, o ne pasitikėkite tuo, iš kur tarsi ateina jo paketai.

Registruokite kategoriją, o ne nuosprendį

Laikykite gedimų kategorijas žurnale atskirai: visai nėra sąsajos, sąsaja yra, bet paskirtis nepasiekiama, paskirtis pasiekiama, bet autentifikacija atmesta. Tai trys skirtingi savininkai, ir kiekvienas atveria kitą tyrimą.

Sujungus juos į vieną „VPN neveikia“, ataskaita siunčiama komandai, kuri to negali pataisyti. Kategorija yra naudinga išvestis; nuosprendis yra tai, kas ją daro klaidingą.

Susiję straipsniai