Kaip patikrinti VPN būseną be ping „Android“, „iOS“ ir „Windows“ sistemose
Ping įrodo tik tai, kad vienas mazgas atsakė, o ne tai, kad tunelis veikia. Užklauskite „Android“, „iOS“ ir „Windows“ būsenos API, tada patikrinkite maršrutą, kurio jūsų programai iš tikrųjų reikia.
Ping į 192.0.2.10 pasako tik tiek, kad vienas adresas atsakė į ICMP aidą, ir nieko daugiau. Tinkle be tunelio jis gali vis tiek pavykti, nes adresas gali būti vietiniame potinkyje; su sveiku tuneliu jis gali nepavykti, nes serveris numeta ICMP, kol aptarnauja HTTPS. Patikra, kurios reikia jūsų scenarijui, yra platformos būsenos užklausa ir maršruto testas į paskirties vietą, kurią naudoja programa. Traktuokite juos kaip du atskirus laukus, niekada kaip vieną loginį dydį.
Ką iš tikrųjų įrodo aido atsakymas
ICMP yra pasiekiamumo protokolas, kuris neturi sąsajų ar tunelių sąvokos. Kai atsakymas ateina, branduolys praneša, kad mazgas atsakė; jis nepraneša, kuris maršrutas nunešė užklausą, o kuris atnešė atsakymą. Filtravimas dar labiau triukšmina signalą, nes ugniasienė, blokuojanti aido užklausas, nieko nesako apie už jos esančius prievadus. O padalinto tunelio profilis gali tyčia išskirti testuojamą adresą, nors visos kitos paskirties vietos veikia.
Iš tikrųjų norite sužinoti, ar konkreti paslauga naudojama keliu, kuriuo eina programa. Pasirinkite mazgą ir prievadą, kuriuos kviečia programa, tada reikalaukite atsakymo programų lygmenyje.
Pasiekiamumas ir tunelio būsena yra skirtingi faktai, ir vienas gali būti teisingas, kol kitas neteisingas. Laikant juos atskirai, aišku, kam priklauso gedimas. Sujungus juos į vieną patikrą gaunamas bilietas, kurio niekas negali nukreipti.
Klauskite „Android“ apie transportą, o ne apie ping
„Android“ tiesiogiai atsako į būsenos klausimą per ConnectivityManager. Aktyvaus tinklo galimybės turi VPN transporto požymį, kuris nustatomas, kai srautas nukreipiamas per VPN sąsają. Kvietimas vietinis, pigus ir nepriklauso nuo to, ar kuris nors nuotolinis mazgas atsako.
Ši Java versija grąžina false, o ne meta išimtį, kai nėra aktyvaus tinklo. Kadangi ji skaito aktyvų tinklą, ji atspindi profilį, kurį naudotojas pasirinko nustatymuose.
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkCapabilities caps = cm.getNetworkCapabilities(cm.getActiveNetwork());
boolean tunnel = caps != null && caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
Pakeitimų pranešimams registruokite NetworkCallback, o ne apklauskite laikmačiu. Nepainiokite to su VpnService.prepare, kuris praneša tik ar naudotojas suteikė VPN leidimą, o ne ar paketai teka. Atšaukimas ateina per VpnService.onRevoke, tačiau pamiršus profilį nustatymuose joks transliacijos pranešimas nesiunčiamas.
iOS: sąsajų pavadinimai yra euristika, o ne sutartis
Daugelis iOS fragmentų tikrina tarpinio serverio nustatymus, randa __SCOPED__ žodyną ir ieško sąsajų raktų, tokių kaip tap, tun, utun2, ppp ar ipsec. Šis metodas yra pavadinimų konvencija, o ne dokumentuota garantija, todėl OS atnaujinimas, pervadinantis sąsają, gali jį sugriauti. Jis taip pat linkęs pranešti true apie pasenusius įrašus, kurie išgyvena tunelį.
Kai konfigūracija priklauso jūsų programai, NEVPNManager duoda tikrą būseną. Jis aprašo tunelį, kurį paleido jūsų programa; su VPN kiekvienai programai kitos programos gali būti visiškai už to tunelio ribų.
Iš naujo įkelkite nuostatas prieš skaitydami būseną, nes reikšmė keičiasi tuneliui kylant ir krentant:
let manager = NEVPNManager.shared()
manager.loadFromPreferences { error in
let up = manager.connection.status == .connected
print(up)
}
Platformos būsenos požymis vis tiek neįrodo, kad srautas pasiekia partnerį. Būtent tą spragą uždengia maršruto testas, ir todėl vieno loginio dydžio palaikymui nepakanka.
„Windows“ profiliai atskleidžia tikrą būsenos lauką
„Windows“ stebi VPN profilius atskirai nuo adapterių, o Get-VpnConnection atskleidžia ConnectionStatus kiekvienam žinomam profiliui. Čia matomi profiliai, sukurti per „Windows“ klientą arba paruošimo paketą. Šis cmdlet nėra universalus tunelio detektorius.
Skaitykite lauką pavadintam profiliui, pridėdami -AllUserConnection, kai profilis priklauso visiems naudotojams:
Get-VpnConnection -Name "Fabrikam" | Select-Object Name, ConnectionStatus, ServerAddress
Trečiųjų šalių klientai dažnai lieka nematomi šiam cmdlet, net kai jų tunelis veikia, todėl tuščias rezultatas reiškia nežinoma, o ne atjungta. Adapterių sąrašai klaidina taip pat: gamintojo adapteris gali išlikti neveiklus, o kai kurie adapteriai egzistuoja tik sesijos metu. Profiliui, kurį valdo „Windows“, rasdial praneša išėjimo kodą, pagal kurį galite šakotis. Visa tai aprašo vietinį įsitikinimą, o ne partnerio pasiekiamumą.
Būsena plius maršrutas: dviejų dalių patikra
Prisijungtas profilis nieko nesako apie tai, kur eina paketai. Padalintas tunelis gali išlaikyti tunelį veikiantį ir išskirti jums svarbią paskirties vietą. Always-on profiliai lieka prisijungę prie negyvo serverio, o kill switch tyčia blokuoja srautą, kai tunelis krenta.
Testuokite abu sluoksnius: patvirtinkite, kad VPN transportas arba profilis aktyvus, tada patvirtinkite, kad paskirties vieta išsprendžiama ir atsako tuo keliu. Linux sistemoje paklauskite branduolio, kurią sąsają jis naudotų:
ip route get 192.0.2.10
resolvectl query intranet.example.test
Kai klientas ne jūsų kontrolėje, registruokite abu rezultatus ir leiskite modeliui parodyti sluoksnį. Prisijungta ir nepavykęs maršruto testas rodo padalintą tunelį, DNS arba politiką. Atjungta ir veikiantis maršruto testas reiškia, kad srautą neša kitas kelias.
Testas, kurį galite atlikti iš eilės
Pirmiausia užfiksuokite platformos būseną, prieš keisdami bet kokią tinklo būseną. Išspręskite mazgo vardą ir užsirašykite adresų šeimą, nes AAAA įrašas gali eiti kitu keliu nei A įrašas. Atidarykite paslaugos prievadą ir reikalaukite programos atsakymo, o ne vien rankos paspaudimo. Kiekvieną stebėjimą laikykite atskirame žurnalo lauke.
Linux kompiuteryje su dig ir curl trys komandos apima išsprendimą, maršrutą ir pačią paslaugą. Vykdykite jas su pakeltu tuneliu ir vėl su nuleistu:
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
Keturi atskiri laukai nugali vieną loginį dydį, nes būsena, DNS, maršrutas ir politika nepavyksta nepriklausomai ir patenka skirtingoms komandoms. Ping terminale išlieka gera rankinė patikra. Tai prasta ryšio apibrėžtis automatizavimui, kur platformos API ir maršruto testas atsako į tikrą klausimą.