Ping uz 192.0.2.10 pasaka tikai to, ka viena adrese atbildēja uz ICMP atbalsi, un neko vairāk. Tīklā bez tuneļa tas var tomēr izdoties, jo adrese var būt vietējā apakštīklā; ar veselu tuneli tas var neizdoties, jo serveris izmet ICMP, kamēr apkalpo HTTPS. Pārbaude, kas nepieciešama jūsu skriptam, ir platformas statusa vaicājums un maršruta tests uz galamērķi, ko izmanto lietotne. Uztveriet tos kā divus atsevišķus laukus, nekad kā vienu Būla vērtību.

Ko atbalss atbilde patiešām pierāda

ICMP ir sasniedzamības protokols, kam nav priekšstata par saskarnēm vai tuneļiem. Kad atbilde pienāk, kodols ziņo, ka saimniekdators atbildēja; tas neziņo, kurš maršruts aiznesa pieprasījumu un kurš atnesa atbildi. Filtrēšana signālu padara vēl trokšņaināku, jo ugunsmūris, kas bloķē atbalss pieprasījumus, neko nepasaka par ostām aiz tā. Un sadalītā tuneļa profils var apzināti izslēgt pārbaudīto adresi, kamēr visi pārējie galamērķi darbojas.

Jūs patiešām gribat zināt, vai konkrēts pakalpojums ir lietojams ceļā, ko iet lietotne. Izvēlieties saimniekdatoru un ostu, ko izsauc lietotne, pēc tam pieprasiet atbildi lietojumprogrammas slānī.

Sasniedzamība un tuneļa stāvoklis ir dažādi fakti, un viens var būt patiess, kamēr otrs ir nepatiess. Turot tos atsevišķi, jūs zināt, kam pieder kļūme. Sapludinot tos vienā pārbaudē, rodas biļete, ko neviens nevar novirzīt.

Uzjautājiet Android par transportu, nevis par ping

Android tieši atbild uz statusa jautājumu, izmantojot ConnectivityManager. Aktīvā tīkla iespējas satur VPN transporta karodziņu, kas tiek iestatīts, kad trafiks tiek maršrutēts caur VPN saskarni. Izsaukums ir vietējs, lēts un nav atkarīgs no tā, vai kāds attāls saimniekdators atbild.

Šī Java versija atgriež false, nevis met izņēmumu, ja nav aktīva tīkla. Tā kā tā nolasa aktīvo tīklu, tā atspoguļo profilu, ko lietotājs izvēlējies iestatījumos.

ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkCapabilities caps = cm.getNetworkCapabilities(cm.getActiveNetwork());
boolean tunnel = caps != null && caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);

Lai saņemtu paziņojumus par izmaiņām, reģistrējiet NetworkCallback, nevis aptaujājiet ar taimeri. Nejauciet to ar VpnService.prepare, kas ziņo tikai par to, vai lietotājs piešķīris atļauju VPN, nevis par to, vai paketes plūst. Atsaukums nāk caur VpnService.onRevoke, taču profila aizmiršana iestatījumos neizraisa nekādu apraidi.

iOS: saskarņu nosaukumi ir heiristika, nevis līgums

Daudzi iOS fragmenti pārbauda starpniekservera iestatījumus, atrod __SCOPED__ vārdnīcu un meklē saskarnes atslēgas, piemēram, tap, tun, utun2, ppp vai ipsec. Šī pieeja ir nosaukumu konvencija, nevis dokumentēta garantija, tāpēc OS atjauninājums, kas pārdēvē saskarni, var to salauzt. Tam arī ir tendence ziņot true par novecojušiem ierakstiem, kas pārdzīvo tuneli.

Kad konfigurācija pieder jūsu lietotnei, NEVPNManager dod īstu statusu. Tas apraksta tuneli, ko sāka jūsu lietotne; ar VPN katrai lietotnei citas lietotnes var atrasties pilnīgi ārpus šī tuneļa.

Pirms statusa lasīšanas pārlādējiet preferences, jo vērtība mainās, tunelim ceļoties un krītot:

let manager = NEVPNManager.shared()
manager.loadFromPreferences { error in
    let up = manager.connection.status == .connected
    print(up)
}

Platformas statusa karodziņš joprojām nepierāda, ka trafiks sasniedz partneri. Tieši šo plaisu sedz maršruta tests, un tāpēc atbalstam nepietiek ar vienu Būla vērtību.

Windows profili atklāj īstu statusa lauku

Windows izseko VPN profilus atsevišķi no adapteriem, un Get-VpnConnection atklāj ConnectionStatus katram zināmajam profilam. Šeit parādās profili, kas izveidoti ar Windows klientu vai nodrošināšanas pakotni. Šis cmdlet nav universāls tuneļa detektors.

Nolasiet lauku nosauktam profilam, pievienojot -AllUserConnection, ja profils pieder visiem lietotājiem:

Get-VpnConnection -Name "Fabrikam" | Select-Object Name, ConnectionStatus, ServerAddress

Trešo pušu klienti bieži paliek neredzami šim cmdlet arī tad, kad to tunelis darbojas, tāpēc tukšs rezultāts nozīmē nezināmu, nevis atvienotu. Arī adapteru saraksti maldina: piegādātāja adapters var palikt dīkstāvē, un daži adapteri pastāv tikai sesijas laikā. Profilam, kas pieder Windows, rasdial ziņo iziešanas kodu, pēc kura varat sazarot. Tas viss apraksta vietēju pārliecību, nevis partnera sasniedzamību.

Statuss plus maršruts: divdaļīgā pārbaude

Pievienots profils neko nepasaka par to, kur paketes iet. Sadalītais tunelis var uzturēt tuneli aktīvu, izslēdzot galamērķi, kas jums svarīgs. Always-on profili paliek pievienoti mirušam serverim, un kill switch apzināti bloķē trafiku, kad tunelis krīt.

Pārbaudiet abus slāņus: apstipriniet, ka VPN transports vai profils ir aktīvs, pēc tam apstipriniet, ka galamērķis tiek atrisināts un atbild šajā ceļā. Linux sistēmā pajautājiet kodolam, kuru saskarni tas izmantotu:

ip route get 192.0.2.10
resolvectl query intranet.example.test

Kad klients ir ārpus jūsu kontroles, reģistrējiet abus rezultātus un ļaujiet modelim norādīt uz slāni. Pievienots un neizdevies maršruta tests norāda uz sadalītu tuneli, DNS vai politiku. Atvienots un strādājošs maršruta tests nozīmē, ka trafiku nes cits ceļš.

Tests, ko varat izpildīt secībā

Vispirms reģistrējiet platformas statusu, pirms maināt jebkuru tīkla stāvokli. Atrisiniet saimniekdatora nosaukumu un pierakstiet adrešu saimi, jo AAAA ieraksts var iet citu ceļu nekā A ieraksts. Atveriet pakalpojuma ostu un pieprasiet lietojumprogrammas atbildi, nevis tikai rokas paspiešanu. Saglabājiet katru novērojumu savā žurnāla laukā.

Linux mašīnā ar dig un curl trīs komandas aptver atrisināšanu, maršrutu un pašu pakalpojumu. Palaidiet tās ar paceltu tuneli un atkal ar nolaistu:

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

Četri atsevišķi lauki pārspēj vienu Būla vērtību, jo statuss, DNS, maršruts un politika neizdodas neatkarīgi un nonāk pie dažādām komandām. Ping terminālī joprojām ir labs manuāls tests. Tā ir slikta savienojamības definīcija automātikai, kur platformas API un maršruta tests atbild uz īsto jautājumu.

Saistītie raksti