192.0.2.10 дарегине ping жөнөтүү бир дарек ICMP жаңырыгына жооп бергенин гана айтат, башка эч нерсе. Туннел жок тармакта ал ошентсе да ийгиликтүү болушу мүмкүн, анткени дарек жергиликтүү кошумча тармакта болушу ыктымал; ден соолугу жакшы туннел менен да ал ийгиликсиз болушу мүмкүн, анткени сервер HTTPS кызматын көрсөтүп жатканда ICMPны таштайт. Сиздин скриптке керектүү текшерүү — платформанын статусун суроо жана колдонмо пайдаланган барар жерине маршрут сыноосу. Аларды эки өзүнчө талаа катары караңыз, эч качан бир булдук маани катары эмес.

Жаңырык жообу чындыгында эмнени далилдейт

ICMP — интерфейстер же туннелдер жөнүндө түшүнүгү жок жетүүчүлүк протоколу. Жооп келгенде ядро бир хост жооп бергенин билдирет; ал сурамды алып өткөн маршрутту да, жоопту алып келген маршрутту да билдирбейт. Чыпкалоо сигналды андан бетер чуулгандуу кылат, анткени жаңырык сурамдарын тоскон брандмауэр өзүнүн артындагы порттор жөнүндө эч нерсе айтпайды. Ал эми бөлүнгөн туннел профили сыналган даректи атайын четтетиши мүмкүн, калган бардык барар жерлер иштеп турса да.

Сиз чындыгында билгиңиз келген нерсе — белгилүү бир кызматтын колдонмо жүргөн жолдо пайдаланууга жарактуулугу. Колдонмо чакырган хост менен портту тандаңыз, анан колдонмо деңгээлинде жооп талап кылыңыз.

Жетүүчүлүк жана туннелдин абалы — башка фактылар, жана бири чын болгондо экинчиси жалган болушу мүмкүн. Аларды өзүнчө кармоо кемчиликтин кимдики экенин айтат. Аларды бир текшерүүгө бириктирүү эч ким маршруттай албаган билетти жаратат.

Androidтен ping эмес, транспорт сураңыз

Android статус суроосуна ConnectivityManager аркылуу түз жооп берет. Активдүү тармактын мүмкүнчүлүктөрү VPN транспортунун желегин алып жүрөт, ал трафик VPN интерфейси аркылуу маршрутталганда коюлат. Чакыруу жергиликтүү, арзан жана кайсы бир алыс хост жооп берерине көз каранды эмес.

Javaнын бул версиясы активдүү тармак жок болгондо өзгөчөлүк ыргытуунун ордуна false кайтарат. Ал активдүү тармакты окугандыктан, колдонуучу Жөндөөлөрдө тандаган профилди чагылдырат.

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

Өзгөрүү билдирүүлөрү үчүн таймер менен суроо ордуна NetworkCallback каттаңыз. Аны VpnService.prepare менен чаташтырбаңыз: ал колдонуучунун VPN үчүн уруксат бергенин гана билдирет, пакеттердин агып жатканын эмес. Жокко чыгаруу VpnService.onRevoke аркылуу келет, бирок Жөндөөлөрдө профилди унутуу эч кандай берүүнү пайда кылбайт.

iOS: интерфейс аттары — эвристика, келишим эмес

Көптөгөн iOS үзүндүлөрү прокси жөндөөлөрүн текшерип, __SCOPED__ сөздүгүн таап, tap, tun, utun2, ppp же ipsec сыяктуу интерфейс ачкычтарын издейт. Бул ыкма — атоо салты, документтелген кепилдик эмес, ошондуктан интерфейстин атын өзгөрткөн OS жаңыртуу аны буза алат. Ал ошондой эле туннелден узак жашаган эскирген жазуулар үчүн true билдирүүгө ыктайт.

Конфигурация сиздин колдонмодо болсо, ордуна NEVPNManager чыныгы статус берет. Ал колдонмоңуз баштаган туннелди сүрөттөйт; колдонмо боюнча VPN менен башка колдонмолор ошол туннелден толук тышкары болушу мүмкүн.

Статусту окуудан мурун параметрлерди кайра жүктөңүз, анткени туннел көтөрүлүп, түшкөндө маани өзгөрөт:

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

Платформанын статус желеги баары бир трафиктин өнөктөшкө жеткенин далилдебейт. Ошол боштукту маршрут сыноосу жабат, ошондуктан колдоо үчүн бир булдук маани жетишсиз.

Windows профилдери чыныгы статус талаасын көрсөтөт

Windows VPN профилдерин адаптерлерден өзүнчө көзөмөлдөйт, ал эми Get-VpnConnection өзү билген ар бир профил үчүн ConnectionStatus көрсөтөт. Windows кардары же даярдоо пакети аркылуу түзүлгөн профилдер бул жерде көрүнөт. Бул cmdlet туннелдин универсалдуу детектору эмес.

Аталган профил үчүн талааны окуңуз, профил бардык колдонуучуларга таандык болсо -AllUserConnection кошуңуз:

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

Үчүнчү тараптын кардарлары туннели иштеп турса да бул cmdlet үчүн көрүнбөй калат, ошондуктан бош натыйжа белгисиз дегенди билдирет, ажыратылган эмес. Адаптер тизмелери да ушундай эле адаштырат: жеткирүүчүнүн адаптери бош турганда да сакталышы мүмкүн, ал эми айрым адаптерлер сессия учурунда гана болот. Windowsко таандык профил үчүн rasdial бутактаса боло турган чыгуу кодун билдирет. Мунун баары жергиликтүү ишенимди сүрөттөйт, өнөктөштүн жетүүчүлүгүн эмес.

Статус плюс маршрут: эки бөлүктүү текшерүү

Туташкан профил пакеттердин кайда барары жөнүндө эч нерсе айтпайды. Бөлүнгөн туннелдештирүү туннелди иштеп турган бойдон калтырып, сизге маанилүү барар жерди четтетиши мүмкүн. always-on профилдер өлүк сервер менен да туташып турат, ал эми kill switch туннел кулаганда трафикти атайын бөгөттөйт.

Эки катмарды тең сынаңыз: VPN транспорту же профил активдүү экенин ырастаңыз, анан барар жердин чечилишин жана ошол жол менен жооп беришин ырастаңыз. Linuxто ядродон кайсы интерфейсти колдонорун сураңыз:

ip route get 192.0.2.10
resolvectl query intranet.example.test

Кардар сиздин көзөмөлүңүздөн тышкары болсо, эки натыйжаны тең журналга жазып, үлгү катмарды көрсөтүүсүнө жол бериңиз. Туташкан жана ийгиликсиз маршрут сыноосу бөлүнгөн туннелдештирүүнү, DNSти же саясатты көрсөтөт. Ажыратылган жана иштеген маршрут сыноосу трафикти башка жол алып жүргенин билдирет.

Ирети менен аткарса боло турган сыноо

Тармактын кандайдыр бир абалын өзгөртүүдөн мурун платформанын статусун биринчи жазып алыңыз. Хосттун атын чечип, дарек үй-бүлөсүн белгилеңиз, анткени AAAA жазуусу A жазуусуна караганда башка жол менен жүрүшү мүмкүн. Кызмат портун ачып, жөн гана кол алышуунун ордуна колдонмо жообун талап кылыңыз. Ар бир байкоону өзүнүн журнал талаасында сактаңыз.

dig жана curl бар Linux машинасында үч буйрук чечүүнү, маршрутту жана кызматтын өзүн камтыйт. Аларды туннел көтөрүлгөн абалда жана кайра түшүрүлгөн абалда иштетиңиз:

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

Төрт өзүнчө талаа бир булдук мааниден артык, анткени статус, DNS, маршрут жана саясат бири-бирине көз карандысыз иштен чыгып, ар кайсы командаларга түшөт. Терминалдагы ping жакшы кол менен текшерүү бойдон калат. Ал автоматташтыруу үчүн байланыштын начар аныктамасы, анда платформа APIси жана маршрут сыноосу чыныгы суроого жооп берет.

Тектеш макалалар