Kako iz kode zaznati aktiven tunel VPN na kateri koli platformi
Ali tunel obstaja, ali gre ta cilj skozenj, ali odgovarja oddaljeni konec? To so tri različna preverjanja in trije različni signali.
„Je VPN vklopljen?” so v resnici tri vprašanja v enem stavku. Katero od njih potrebuje vaša koda, je prva odločitev, in prav to večina izvedb preskoči. Ali na tej napravi obstaja tunel, ali promet do tega cilja odhaja skozenj, ali oddaljeni konec odgovori z identiteto, ki jo pričakujete. Izberite lastnost, nato izberite signal, ki jo meri, in na koncu v dnevnik zapišite, katero ste v resnici izmerili.
Tri lastnosti, trije signali
Stisnjena na eno vrstico vsaka, imajo tri vprašanja tri različne odgovore. Spodnja tabela je odločitev sama, ne njen povzetek.
| Property | Signal that answers it | What it still leaves open |
|---|---|---|
| Existence | The platform's own connection state: RAS on Windows, NetworkManager on D-Bus on Linux, scutil on macOS | Tunnels of a type the platform does not manage, which includes most third-party clients |
| Path | A route lookup for the one destination, or a scoped proxy or interface key that names the tunnel | Whether the far end is the peer you trust |
| Identity | An authenticated response from the far end, or a source-address policy applied on the server | Which local interface carried the packets |
Preberite zadnjo vrstico počasi. Zasebni gostitelj, ki odgovori, dokazuje, da je nekaj odgovorilo, ne pa da je odgovor prišel skozi tunel, in ne pove ničesar o tem, kdo je na drugi strani. Če je lastnost, ki jo potrebujete, pot, merite pot.
Obstoj: lastno stanje platforme
Windows to za izvorne profile odgovori prek Remote Access Service API. RasEnumConnections našteje, kaj je povezano, RasGetConnectStatus poroča stanje enega vnosa, RasGetLinkStatistics pa doda hitrost, števce bajtov in starost povezave. Omejitve so bistvo: OpenVPN, WireGuard in odjemalci proizvajalcev nikoli ne registrirajo povezave RAS, zato zdrav tunel te vrste pokaže prazen seznam in naivna koda ga prijavi kot izklopljenega.
Namizja Linux razkrijejo isto lastnost prek NetworkManagerja na D-Bus, kjer PropertiesChanged na objektu povezave VPN spremeni preverjanje v dogodek in lastnost State poroča, kdaj povezava doseže stanje povezano. Iz lupine nmcli connection show --active bere iste informacije, in to je tisto, kar želite med razhroščevanjem. macOS hrani ta seznam v ogrodju System Configuration, scutil pa je njegov pogled iz ukazne vrstice. Vse tri opisujejo povezavo, ki jo upravlja platforma, in vse tri utihnejo za tunel, ki ga ne upravlja.
Pot: kam paket v resnici gre
Ujemanje imen je bližnjica, po kateri vsi najprej posežejo: naštejte vmesnike, preizkusite niz proti tun, tap, ppp ali ipsec in zadetek vzemite kot dokaz. To je heuristika, in nabor vmesnikov je lahko videti enak ne glede na to, ali gre kaj skozenj. Starejše različice iOS so odgovarjale tako, novejše pa so prenehale, ker vidni vmesniki niso več razlikovali obeh stanj.
Kar je to tam nadomestilo, je sistemski slovar proxyja. Dokler je VPN povezan, klic nastavitev proxyja vrne ključe, omejene na vmesnike, povezane s tunelom, in ko ni nič povezano, se slovar vrne prazen. To je šibkejša trditev, kot se sliši, ker beleži sistemsko prepričanje, da tunel obstaja, ne pa, kateri cilj ga uporablja.
Android ima svojo različico te pasti: oddajanje vpn.connectivity doseže prejemnike, deklarirane v manifestu, v nekaterih gradnjah in prejemnike, registrirane med izvajanjem, v drugih. Obravnavajte ga kot najboljši trud in za njim obdržite neposredno sondo.
Ko je cilj tisto, kar šteje, vprašajte usmerjevalno tabelo namesto seznama adapterjev. Heuristike privzetega prehoda se zlomijo na strojih z več omrežji in na tunelih, ki namestijo svoj prehod.
Identiteta: preizkusite oddaljeni konec
Zanka, ki vsakih nekaj sekund pošlje odmev ICMP na oddaljeni konec, je najcenejše preverjanje te vrste in odpove v koristno smer. Usmerite jo na naslov, ki obstaja samo znotraj zasebnega omrežja, ker javni odgovori prek katere koli delujoče povezave navzgor in ne dokaže ničesar. Kjer je ICMP filtriran, opravi isto delo kratka povezava TCP na vrata storitve.
Preverjanje na strani strežnika ima na voljo natanko en signal: naslov vira na povezavi. Vzdrževanje evidence obsegov je vzdrževalno delo in ne more ločiti tunela od katerega koli drugega omrežja, ki slučajno uporablja isti blok.
Groba politika lahko živi s tem. Identiteta ne more, zato overite odjemalca, namesto da bi zaupali temu, od kod se zdi, da prihajajo njegovi paketi.
Zapišite kategorijo, ne razsodbe
Kategorije napak imejte v dnevniku ločene: nobenega vmesnika, vmesnik je, a cilj ni dosegljiv, cilj je dosegljiv, a overjanje je zavrnjeno. To so trije različni lastniki in vsak odpre drugačno preiskavo.
Če jih zlijete v en sam „VPN je dol”, pošljete poročilo ekipi, ki tega ne more popraviti. Kategorija je koristen izhod; razsodba je tisto, kar ga naredi napačnega.