„Je VPN zapnutá?” sú v skutočnosti tri otázky v jednej vete. Ktorú z nich váš kód potrebuje, je prvé rozhodnutie, a práve to väčšina implementácií preskakuje. Existuje na tomto zariadení tunel, odchádza prevádzka k tejto destinácii cezeň, alebo vzdialený koniec odpovedá identitou, ktorú očakávate. Vyberte vlastnosť, potom vyberte signál, ktorý ju meria, a nakoniec do logu napíšte, ktorý ste skutočne zmerali.

Tri vlastnosti, tri signály

Stlačené na jeden riadok každá, tri otázky majú tri rôzne odpovede. Tabuľka nižšie je samotné rozhodnutie, nie jeho zhrnutie.

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

Prečítajte si posledný riadok pomaly. Súkromný hostiteľ, ktorý odpovedá, dokazuje, že niečo odpovedalo, nie že odpoveď prišla tunelom, a nič nehovorí o tom, kto je na druhom konci. Ak je vlastnosťou, ktorú potrebujete, cesta, merajte cestu.

Existencia: vlastný stav platformy

Windows to pre natívne profily zodpovedá cez Remote Access Service API. RasEnumConnections vypisuje, čo je pripojené, RasGetConnectStatus hlási stav jednej položky a RasGetLinkStatistics pridáva rýchlosť, počítadlá bajtov a vek pripojenia. Obmedzenia sú podstatou: OpenVPN, WireGuard a klientske aplikácie výrobcov nikdy neregistrujú pripojenie RAS, takže zdravý tunel tohto typu zobrazí prázdny zoznam a naivný kód ho ohlási ako vypnutý.

Linuxové desktopy vystavujú rovnakú vlastnosť cez NetworkManager na D-Bus, kde PropertiesChanged na objekte VPN pripojenia mení kontrolu na udalosť a vlastnosť State hlási, kedy spojenie dosiahne stav pripojené. Z shellu číta nmcli connection show --active rovnaké informácie, a to je presne to, čo chcete pri ladení. macOS drží tento zoznam v rámci System Configuration, s scutil ako svojím pohľadom z príkazového riadka. Všetky tri opisujú pripojenie, ktoré platforma spravuje, a všetky tri zmlknú pri tuneli, ktorý nespravuje.

Cesta: kam paket skutočne ide

Porovnávanie názvov je skratka, po ktorej všetci siahnu najskôr: vypíšte rozhrania, otestujte reťazec proti tun, tap, ppp alebo ipsec a zhodu berte ako dôkaz. Je to heuristika a sada rozhraní môže vyzerať rovnako, či už cez ňu niečo prechádza, alebo nie. Staršie zostavenia iOS odpovedali takto a novšie prestali, pretože viditeľné rozhrania už oba stavy nerozlišovali.

To, čo to tam nahradilo, je systémový slovník proxy. Kým je VPN pripojená, volanie nastavení proxy vracia kľúče obmedzené na rozhrania súvisiace s tunelom, a keď nie je nič pripojené, slovník sa vracia prázdny. Je to slabšie tvrdenie, než to znie, pretože zaznamenáva systémové presvedčenie, že tunel existuje, nie ktorá destinácia ho používa.

Android má svoju vlastnú verziu pasce: vysielanie vpn.connectivity dorazí k prijímačom deklarovaným v manifeste v niektorých zostaveniach a k prijímačom registrovaným za behu v iných. Berte to ako najlepšiu snahu a majte za tým priamu sondu.

Keď ide o destináciu, pýtajte sa smerovacej tabuľky namiesto zoznamu adaptérov. Heuristiky predvolenej brány sa lámu na strojoch s viacerými sieťami a na tuneloch, ktoré inštalujú vlastnú bránu.

Identita: otestujte vzdialený koniec

Slučka, ktorá každých pár sekúnd posiela ICMP ozvenu na vzdialený koniec, je najlacnejšia kontrola tohto druhu a zlyháva užitočným smerom. Mierte ju na adresu, ktorá existuje iba vnútri súkromnej siete, pretože verejná odpovedá cez akékoľvek funkčné pripojenie nahor a nič nedokazuje. Kde je ICMP filtrovaný, urobí rovnakú prácu krátke TCP spojenie s portom služby.

Kontrola na strane servera má k dispozícii presne jeden signál: zdrojovú adresu pripojenia. Udržiavať inventár rozsahov je práca navyše a nedokáže oddeliť tunel od akejkoľvek inej siete, ktorá náhodou používa ten istý blok.

Hrubá politika s tým dokáže žiť. Identita nie, preto overujte klienta, namiesto toho aby ste verili tomu, odkiaľ jeho pakety zdanlivo prichádzajú.

Zaznamenávajte kategóriu, nie verdikt

Držte kategórie zlyhaní v logu oddelené: žiadne rozhranie, rozhranie existuje, ale destinácia je nedostupná, destinácia je dostupná, ale autentizácia bola odmietnutá. To sú traja rôzni vlastníci a každý otvára iné vyšetrovanie.

Zlievanie do jediného „VPN je dole” pošle hlásenie tímu, ktorý to nedokáže opraviť. Kategória je užitočný výstup; verdikt je to, čo ho robí chybným.

Súvisiace články