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-ы мен маршрут сынағы нақты сұраққа жауап береді.

Қатысты мақалалар