Kako preveriti stanje VPN brez pinga v sistemih Android, iOS in Windows
Ping dokaže le, da je en gostitelj odgovoril, ne pa, da je tunel aktiven. Vprašajte statusne API-je Androida, iOS in Windows, nato preverite pot, ki jo vaša aplikacija resnično potrebuje.
Ping na 192.0.2.10 vam pove le, da je en naslov odgovoril na odmev ICMP, in nič več. V omrežju brez tunela lahko kljub temu uspe, ker je naslov morda v lokalnem podomrežju; z zdravim tunelom lahko spodleti, ker strežnik zavrže ICMP, medtem ko streže HTTPS. Preverjanje, ki ga vaša skripta potrebuje, je poizvedba o stanju platforme in preskus poti do cilja, ki ga aplikacija uporablja. Obravnavajte ju kot dve ločeni polji, nikoli kot eno logično vrednost.
Kaj odgovor na odmev v resnici dokaže
ICMP je protokol dosegljivosti, ki ne pozna vmesnikov ali tunelov. Ko prispe odgovor, jedro sporoči, da je gostitelj odgovoril; ne sporoči, katera pot je nosila zahtevo in katera odgovor. Filtriranje naredi signal še bolj šumen, ker požarni zid, ki blokira zahteve za odmev, ne pove ničesar o vratih za njim. In profil z razdeljenim tunelom lahko namerno izključi testirani naslov, medtem ko vsi drugi cilji delujejo.
V resnici želite vedeti, ali je določena storitev uporabna na poti, po kateri gre aplikacija. Izberite gostitelja in vrata, ki jih kliče aplikacija, nato zahtevajte odgovor na aplikacijskem sloju.
Dosegljivost in stanje tunela sta različni dejstvi in eno je lahko resnično, medtem ko je drugo napačno. Če ju ločujete, veste, čigava je napaka. Če ju združite v eno preverjanje, dobite zahtevek, ki ga nihče ne more usmeriti.
Androida vprašajte za prenos, ne za ping
Android neposredno odgovori na vprašanje o stanju prek ConnectivityManager. Zmogljivosti aktivnega omrežja nosijo zastavico prenosa VPN, ki se nastavi, ko je promet usmerjen skozi vmesnik VPN. Klic je lokalen, poceni in neodvisen od tega, ali kateri oddaljeni gostitelj odgovori.
Ta različica Jave vrne false, namesto da bi vrgla izjemo, ko ni aktivnega omrežja. Ker bere aktivno omrežje, odraža profil, ki ga je uporabnik izbral v Nastavitvah.
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkCapabilities caps = cm.getNetworkCapabilities(cm.getActiveNetwork());
boolean tunnel = caps != null && caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
Za obvestila o spremembah registrirajte NetworkCallback, namesto da anketirate s časovnikom. Tega ne zamenjujte z VpnService.prepare, ki sporoča le, ali je uporabnik dal dovoljenje za VPN, ne pa, ali paketi tečejo. Preklic prispe prek VpnService.onRevoke, a pozabljen profil v Nastavitvah ne sproži nobenega oddajanja.
iOS: imena vmesnikov so heuristika, ne pogodba
Številni izseki za iOS pregledujejo nastavitve proxyja, najdejo slovar __SCOPED__ in iščejo ključe vmesnikov, kot so tap, tun, utun2, ppp ali ipsec. Ta pristop je dogovor o poimenovanju, ne dokumentirano jamstvo, zato ga posodobitev sistema, ki preimenuje vmesnik, lahko pokvari. Prav tako rad poroča true za zastarele vnose, ki preživijo tunel.
Ko je konfiguracija v lasti vaše aplikacije, NEVPNManager da resnično stanje. Opisuje tunel, ki ga je zagnala vaša aplikacija; pri VPN za vsako aplikacijo so lahko druge aplikacije povsem zunaj tega tunela.
Pred branjem stanja znova naložite nastavitve, ker se vrednost spreminja, ko tunel narašča in upada:
let manager = NEVPNManager.shared()
manager.loadFromPreferences { error in
let up = manager.connection.status == .connected
print(up)
}
Zastavica stanja platforme še vedno ne dokaže, da promet doseže partnerja. Prav to vrzel pokriva preskus poti, zato ena logična vrednost ne zadostuje za podporo.
Profili Windows razkrijejo resnično polje stanja
Windows spremlja profile VPN ločeno od adapterjev, Get-VpnConnection pa razkrije ConnectionStatus za vsak znan profil. Tu se pojavijo profili, ustvarjeni prek odjemalca Windows ali paketa za pripravo. Ta cmdlet ni splošen zaznavalnik tunelov.
Preberite polje za imenovani profil in dodajte -AllUserConnection, ko profil pripada vsem uporabnikom:
Get-VpnConnection -Name "Fabrikam" | Select-Object Name, ConnectionStatus, ServerAddress
Odjemalci tretjih strani pogosto ostanejo nevidni temu cmdletu, tudi ko njihov tunel deluje, zato prazen rezultat pomeni neznano, ne prekinjeno. Tudi seznami adapterjev zavajajo: adapter ponudnika lahko vztraja, medtem ko miruje, in nekateri adapterji obstajajo le med sejo. Za profil, ki ga ima Windows, rasdial sporoči izhodno kodo, po kateri se lahko razvejate. Vse to opisuje lokalno prepričanje, ne dosegljivosti partnerja.
Stanje plus pot: preverjanje v dveh delih
Povezan profil ne pove ničesar o tem, kam gredo paketi. Razdeljen tunel lahko ohrani tunel aktivni in izključi cilj, ki vam je pomemben. Profili always-on ostanejo povezani z mrtvim strežnikom, kill switch pa namerno blokira promet, ko tunel pade.
Preskusite oba sloja: potrdite, da je prenos VPN ali profil aktiven, nato potrdite, da se cilj razreši in odgovori po tej poti. V Linuxu vprašajte jedro, kateri vmesnik bi uporabilo:
ip route get 192.0.2.10
resolvectl query intranet.example.test
Ko je odjemalec zunaj vašega nadzora, zabeležite oba rezultata in pustite vzorcu, da pokaže na sloj. Povezano in neuspešen preskus poti nakazuje razdeljen tunel, DNS ali politiko. Prekinjeno in delujoč preskus poti pomeni, da promet nosi druga pot.
Preskus, ki ga lahko izvedete po vrsti
Najprej zabeležite stanje platforme, preden spremenite kakršno koli stanje omrežja. Razrešite ime gostitelja in zabeležite družino naslovov, ker lahko zapis AAAA ubira drugačno pot kot zapis A. Odprite vrata storitve in zahtevajte odgovor aplikacije, ne le rokovanja. Vsako opažanje hranite v svojem polju dnevnika.
Na stroju Linux z dig in curl trije ukazi pokrijejo razrešitev, pot in storitev samo. Zaženite jih z dvignjenim tunelom in znova s spuščenim:
dig +short intranet.example.test
ip route get 198.51.100.20
curl -sS -o /dev/null -w "%{http_code}" --max-time 8 https://intranet.example.test/health
Štiri ločena polja premagajo eno logično vrednost, ker stanje, DNS, pot in politika odpovedo neodvisno in pristanejo pri različnih ekipah. Ping v terminalu ostaja dobro ročno preverjanje. Slaba je definicija povezljivosti za avtomatizacijo, kjer API platforme in preskus poti odgovorita na resnično vprašanje.