Ping na 192.0.2.10 vam kaže da je jedna adresa odgovorila na ICMP echo i to je sve. Na mreži bez tunela može i uspjeti, jer adresa može biti na lokalnoj podmreži; uz zdrav tunel može i pasti, jer server odbacuje ICMP dok poslužuje HTTPS. Provjera koja je potrebna vašoj skripti je upit o statusu platforme plus test rute do odredišta koje aplikacija koristi. Tretirajte ih kao dva odvojena polja, nikada kao jedan boolean.

Šta echo odgovor zaista dokazuje

ICMP je protokol dosegljivosti koji ne poznaje interfejse ni tunele. Kad odgovor stigne, jezgro javlja da je host odgovorio; ne javlja koja je ruta nosila zahtjev ni koja je nosila odgovor. Filtriranje signal čini još šumnijim, jer firewall koji blokira echo zahtjeve ne govori ništa o portovima iza sebe. A profil s podijeljenim tunelom može namjerno izuzeti testiranu adresu dok sva druga odredišta rade.

Ono što zapravo želite znati jeste da li je određena usluga upotrebljiva preko puta kojim aplikacija ide. Odaberite host i port koje aplikacija poziva, pa zahtijevajte odgovor na aplikacijskom sloju.

Dosegljivost i stanje tunela su različite činjenice, i bilo koja može biti istinita dok je druga lažna. Držanje njih odvojeno kaže vam čija je greška. Spajanje u jednu provjeru daje tiket koji niko ne može usmjeriti.

Pitajte Android za transport, ne za ping

Android odgovara na pitanje statusa direktno kroz ConnectivityManager. Sposobnosti aktivne mreže nose zastavicu VPN transporta, koja se postavlja kada se promet usmjerava kroz VPN interfejs. Poziv je lokalni, jeftin i neovisan o tome odgovara li bilo koji udaljeni host.

Ova Java verzija vraća false umjesto da baci izuzetak kada nema aktivne mreže. Pošto čita aktivnu mrežu, odražava profil koji je korisnik odabrao u Postavkama.

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

Za obavještenja o promjenama registrujte NetworkCallback umjesto anketiranja po timeru. Ne miješajte to s VpnService.prepare, koji samo javlja da li je korisnik dao dozvolu za VPN, a ne da li paketi teku. Ukidanje stiže kroz VpnService.onRevoke, ali zaboravljanje profila u Postavkama ne proizvodi nikakvo emitovanje.

iOS: imena interfejsa su heuristika, ne ugovor

Mnogi iOS isječci pregledaju proxy postavke, nađu rječnik __SCOPED__ i traže ključeve interfejsa kao što su tap, tun, utun2, ppp ili ipsec. Taj pristup je konvencija imenovanja, a ne dokumentovana garancija, pa ga ažuriranje OS-a koje preimenuje interfejs može pokvariti. Takođe ima tendenciju da prijavi istinu za zastarjele unose koji nadžive tunel.

Kada vaša aplikacija posjeduje konfiguraciju, NEVPNManager vam daje stvarni status. On opisuje tunel koji je vaša aplikacija pokrenula; uz VPN po aplikaciji druge aplikacije mogu ostati potpuno izvan tog tunela.

Ponovo učitajte postavke prije čitanja statusa, jer se vrijednost mijenja kako tunel dolazi i odlazi:

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

Zastavica statusa platforme ipak ne dokazuje da promet stiže do partnera. Taj jaz pokriva test rute i zato jedan boolean nije dovoljan za podršku.

Windows profili izlažu stvarno polje statusa

Windows prati VPN profile odvojeno od adaptera, a Get-VpnConnection izlaže ConnectionStatus za svaki profil koji poznaje. Profili napravljeni kroz Windows klijent ili provisioning paket pojavljuju se ovdje. Ova cmdlet nije opći detektor tunela.

Čitajte polje za imenovani profil, dodajući -AllUserConnection kada profil pripada svim korisnicima:

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

Klijenti trećih strana često ostaju nevidljivi ovoj cmdlet čak i dok im tunel radi, pa prazan rezultat znači nepoznato, a ne isključeno. Liste adaptera jednako zavode: adapter proizvođača može opstati dok je besposlen, a neki adapteri postoje samo tokom sesije. Za profil koji Windows posjeduje, rasdial javlja izlazni kod na koji se možete granati. Sve to opisuje lokalno uvjerenje, ne dosegljivost partnera.

Status plus ruta: provjera u dva dijela

Povezan profil ne govori ništa o tome kuda paketi idu. Podijeljeni tunel može držati tunel aktivnim dok izuzima odredište do kojeg vam je stalo. Always-on profili ostaju povezani s mrtvim serverom, a kill switch namjerno blokira promet kada tunel padne.

Testirajte oba sloja: potvrdite da je VPN transport ili profil aktivan, pa da se odredište razrješava i odgovara tim putem. Na Linuxu pitajte jezgro koji bi interfejs koristilo:

ip route get 192.0.2.10
resolvectl query intranet.example.test

Kada je klijent izvan vaše kontrole, zabilježite oba rezultata i pustite da obrazac ukaže na sloj. Povezano plus neuspješan test rute upućuje na podijeljeni tunel, DNS ili politiku. Isključeno plus uspješan test rute znači da promet nosi drugi put.

Test koji možete izvesti po redu

Prvo zabilježite status platforme, prije nego promijenite bilo koje mrežno stanje. Razriješite ime hosta i zabilježite porodicu adresa, jer AAAA zapis može krenuti drugim putem od A zapisa. Otvorite port usluge i zahtijevajte odgovor aplikacije, a ne goli handshake. Držite svako opažanje u vlastitom polju dnevnika.

Na Linux mašini s dig i curl tri komande pokrivaju razrješavanje, rutu i samu uslugu. Izvedite ih s podignutim tunelom i ponovo sa spuštenim:

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

Četiri odvojena polja bolja su od jednog booleana, jer status, DNS, ruta i politika padaju nezavisno i završavaju u različitim timovima. Ping u terminalu ostaje dobra ručna provjera zdravlja. Loša je definicija povezanosti za automatizaciju, gdje API platforme i test rute odgovaraju na stvarno pitanje.

Povezani članci