«Ці ўключаны VPN?» — насамрэч тры пытанні ў адным сказе. Якое з іх патрэбна вашаму коду — гэта першае рашэнне, і менавіта яго большасць рэалізацый прапускае. Ці ёсць тунэль на гэтай прыладзе, ці выходзіць трафік да гэтага пункта прызначэння праз яго, ці адказвае далёкі бок тым ідэнтыфікатарам, які вы чакаеце. Выберыце ўласцівасць, затым выберыце сігнал, які яе вымярае, а затым напішыце ў журнале, які з іх вы насамрэч вымералі.

Тры ўласцівасці, тры сігналы

Сціснутыя да аднаго радка кожнае, тры пытанні маюць тры розныя адказы. Табліца ніжэй — гэта само рашэнне, а не яго пераказ.

PropertySignal that answers itWhat it still leaves open
ExistenceThe platform's own connection state: RAS on Windows, NetworkManager on D-Bus on Linux, scutil on macOSTunnels of a type the platform does not manage, which includes most third-party clients
PathA route lookup for the one destination, or a scoped proxy or interface key that names the tunnelWhether the far end is the peer you trust
IdentityAn authenticated response from the far end, or a source-address policy applied on the serverWhich local interface carried the packets

Чытайце апошні радок павольна. Прыватны хост, які адказвае, даказвае, што нешта адказала, а не тое, што адказ прыйшоў праз тунэль, і ён нічога не кажа пра тое, хто на іншым баку. Калі патрэбная ўласцівасць — гэта шлях, вымярайце шлях.

Існаванне: уласны стан платформы

Windows адказвае на гэта для родных профіляў праз Remote Access Service API. RasEnumConnections пералічвае, што падключана, RasGetConnectStatus паведамляе стан аднаго запісу, а RasGetLinkStatistics дадае хуткасць, лічыльнікі байтаў і ўзрост злучэння. Абмежаванні — гэта і ёсць сутнасць: OpenVPN, WireGuard і кліенты вытворцаў ніколі не рэгіструюць злучэнне RAS, таму здаровы тунэль такога тыпу паказвае пусты спіс, і наіўны код паведамляе, што ён выключаны.

Працоўныя сталы Linux прадстаўляюць тую ж уласцівасць праз NetworkManager на D-Bus, дзе PropertiesChanged на аб’екце VPN-злучэння ператварае праверку ў падзею, а ўласцівасць State паведамляе, калі звяно дасягае стану падключэння. З абалонкі nmcli connection show --active чытае тую ж інфармацыю, і менавіта гэта патрэбна пры адладцы. macOS трымае гэты спіс у фрэймворку System Configuration, а scutil — яго прадстаўленне ў камандным радку. Усе тры апісваюць злучэнне, якім кіруе платформа, і ўсе тры маўчаць пра тунэль, якім яна не кіруе.

Шлях: куды насамрэч ідзе пакет

Супастаўленне імёнаў — гэта самы хуткі шлях, да якога ўсе бяруцца першым: пералічыце інтэрфейсы, праверце радок супраць tun, tap, ppp ці ipsec і лічыце супадзенне доказам. Гэта эўрыстыка, і набор інтэрфейсаў можа выглядаць аднолькава незалежна ад таго, ці нешта праз яго рухаецца. Старыя зборкі iOS адказвалі так, а познія перасталі, бо бачныя інтэрфейсы больш не адрознівалі два станы.

Тое, што замяніла гэта там, — сістэмны слоўнік проксі. Пакуль VPN падключаны, выклік налад проксі вяртае ключы, прывязаныя да інтэрфейсаў, звязаных з тунэлем, а калі нічога не падключана, слоўнік вяртаецца пустым. Гэта слабейшае сцвярджэнне, чым гучыць, бо яно фіксуе сістэмнае перакананне, што тунэль існуе, а не тое, які пункт прызначэння ім карыстаецца.

У Android свая версія пасткі: шырокавяшчальнае паведамленне vpn.connectivity даходзіць да прыёмнікаў, абвешчаных у маніфесце, у адных зборках, і да прыёмнікаў, зарэгістраваных падчас выканання, у іншых. Стаўцеся да яго як да найлепшага намагання і трымайце за ім прамы запыт.

Калі важны менавіта пункт прызначэння, пытайцеся ў табліцы маршрутызацыі, а не ў спісу адаптараў. Эўрыстыкі шлюза па змаўчанні ламаюцца на машынах з некалькімі сеткамі і на тунэлях, якія ўсталёўваюць уласны шлюз.

Ідэнтычнасць: праверце далёкі бок

Цыкл, які кожныя некалькі секунд пасылае ICMP-водгук на далёкі бок, — самая танны праверка такога роду, і яна адмаўляе ў карысным кірунку. Нацэльце яго на адрас, які існуе толькі ўнутры прыватнай сеткі, бо публічны адказвае праз любы працоўны канал уверх і не даказвае нічога. Там, дзе ICMP фільтруецца, кароткае TCP-злучэнне да порта службы робіць тое ж самае.

Праверка на баку сервера мае роўна адзін сігнал: адрас крыніцы ў злучэнні. Падтрыманне інвентара дыяпазонаў — гэта праца па абслугоўванні, і яна не можа аддзяліць тунэль ад любой іншай сеткі, якая выпадкова выкарыстоўвае той жа блок.

Грубая палітыка можа з гэтым жыць. Ідэнтычнасць не можа, таму аўтэнтыфікуйце кліента, а не давярайце таму, адкуль нібыта прыходзяць яго пакеты.

Запісвайце катэгорыю, а не вердыкт

Трымайце катэгорыі збояў асобна ў журнале: няма інтэрфейса зусім, інтэрфейс ёсць, але пункт прызначэння недасяжны, пункт прызначэння дасяжны, але аўтэнтыфікацыя адхілена. Гэта тры розныя ўладальнікі, і кожны адкрывае іншае расследаванне.

Зліццё іх у адно «VPN выключаны» адпраўляе справаздачу камандзе, якая не можа гэтага выправіць. Катэгорыя — гэта карысны вынік; вердыкт — гэта тое, што робіць яго няправільным.

Падобныя артыкулы