Кез келген платформада кодтан белсенді VPN туннелін қалай анықтауға болады
Туннель бар ма, бұл меже одан өте ме, әлде алыс жақ жауап бере ме? Бұл үш түрлі тексеру және үш түрлі сигнал.
«VPN қосулы ма?» деген сұрақ шын мәнінде бір сөйлемдегі үш сұрақ. Кодыңызға олардың қайсысы керек екені — бірінші шешім, және көптеген іске асырулар дәл осыны өткізіп жібереді. Осы құрылғыда туннель бар ма, осы межеге трафик одан шыға ма, әлде алыс жақ сіз күткен бірегейлікпен жауап бере ме. Қасиетті таңдаңыз, содан кейін оны өлшейтін сигналды таңдаңыз, соңында журналда қайсысын шын мәнінде өлшегеніңізді жазыңыз.
Үш қасиет, үш сигнал
Әрқайсысы бір жолға сығылғанда, үш сұрақтың үш түрлі жауабы бар. Төмендегі кесте — шешімнің өзі, оның қорытындысы емес.
| Property | Signal that answers it | What it still leaves open |
|---|---|---|
| Existence | The platform's own connection state: RAS on Windows, NetworkManager on D-Bus on Linux, scutil on macOS | Tunnels of a type the platform does not manage, which includes most third-party clients |
| Path | A route lookup for the one destination, or a scoped proxy or interface key that names the tunnel | Whether the far end is the peer you trust |
| Identity | An authenticated response from the far end, or a source-address policy applied on the server | Which local interface carried the packets |
Соңғы жолды баяу оқыңыз. Жауап беретін жеке хост бірдеңенің жауап бергенін дәлелдейді, жауаптың туннель арқылы келгенін емес, және арғы жақта кім бар екені туралы ештеңе айтпайды. Егер қажет қасиет жол болса, жолды өлшеңіз.
Болмыс: платформаның өз күйі
Windows мұны жергілікті профильдер үшін Remote Access Service API арқылы жауаптайды. RasEnumConnections не қосылғанын тізімдейді, RasGetConnectStatus бір жазбаның күйін хабарлайды, ал RasGetLinkStatistics жылдамдықты, байт санағыштарын және қосылым жасын қосады. Шектеулер — басты мәселе: OpenVPN, WireGuard және өндіруші клиенттері RAS қосылымын ешқашан тіркемейді, сондықтан осы типтегі сау туннель бос тізім көрсетеді және қарапайым код оны өшірулі деп хабарлайды.
Linux жұмыс үстелдері сол қасиетті D-Bus-тағы NetworkManager арқылы көрсетеді, мұнда VPN қосылымы нысанындағы PropertiesChanged тексеруді оқиғаға айналдырады және State қасиеті байланыс қосылған күйге жеткенде хабарлайды. Қабықтан nmcli connection show --active сол ақпаратты оқиды, және жөндеу кезінде сізге дәл осы керек. macOS бұл тізімді System Configuration қаңқасында ұстайды, ал scutil оның пәрмен жолындағы көрінісі. Үшеуі де платформа басқаратын қосылымды сипаттайды және үшеуі де ол басқармайтын туннель туралы үнсіз қалады.
Жол: пакет шын мәнінде қайда барады
Атауларды сәйкестендіру — бәрі бірінші ұстасатын қысқа жол: интерфейстерді тізімдеңіз, жолды tun, tap, ppp немесе ipsec-мен салыстырыңыз және сәйкестікті дәлел деп есептеңіз. Бұл эвристика, және интерфейстер жиыны одан бірдеңе өтсе де, өтпесе де бірдей көрінуі мүмкін. Ескі iOS құрастырылымдары осылай жауап берді, ал кейінгілері тоқтады, өйткені көрінетін интерфейстер екі күйді ажыратпайтын болды.
Ол жерде оны жүйелік прокси сөздігі алмастырды. VPN қосулы тұрғанда прокси параметрлерін шақыру туннельге қатысты интерфейстермен шектелген кілттерді қайтарады, ал ештеңе қосылмағанда сөздік бос қайтады. Бұл естілгеннен әлсіз тұжырым, өйткені ол туннельдің бар екеніне жүйенің сенімін жазады, қай меженің оны қолданатынын емес.
Android-те бұл тұзақтың өз нұсқасы бар: vpn.connectivity хабарламасы кейбір құрастырылымдарда манифестте жарияланған қабылдағыштарға, басқаларында орындалу кезінде тіркелген қабылдағыштарға жетеді. Оны барынша жақсы әрекет деп қараңыз және оның артында тікелей зонд ұстаңыз.
Меже маңызды болғанда, адаптерлер тізімінен емес, маршруттау кестесінен сұраңыз. Әдепкі шлюз эвристикалары көп желілі машиналарда және өз шлюзін орнататын туннельдерде бұзылады.
Бірегейлік: алыс жақты тексеріңіз
Әр бірнеше секунд сайын алыс жаққа ICMP жаңғырығын жіберетін цикл — осы түрдегі ең арзан тексеру, және ол пайдалы бағытта сәтсіздікке ұшырайды. Оны тек жеке желінің ішінде ғана бар мекенжайға бағыттаңыз, өйткені ашық мекенжай кез келген жұмыс істеп тұрған жоғары арна арқылы жауап береді және ештеңені дәлелдемейді. ICMP сүзілетін жерде қызмет портына қысқа TCP қосылымы сол жұмысты атқарады.
Сервер жағындағы тексерудің дәл бір сигналы бар: қосылымдағы бастау мекенжайы. Ауқымдар тізілімін ұстау — қызмет көрсету жұмысы, және ол туннельді сол блокты кездейсоқ қолданатын кез келген басқа желіден ажырата алмайды.
Дөрекі саясат бұнымен өмір сүре алады. Бірегейлік сүре алмайды, сондықтан пакеттері қайдан келе жатқандай көрінсе соған сенудің орнына клиентті аутентификациялаңыз.
Санатты жазыңыз, үкімді емес
Сәтсіздік санаттарын журналда бөлек ұстаңыз: интерфейс мүлде жоқ, интерфейс бар бірақ меже қолжетімсіз, меже қолжетімді бірақ аутентификация қабылданбады. Бұл үш түрлі иелер, және әрқайсысы басқа тергеу ашады.
Оларды бір «VPN өшті» күйіне біріктіру есепті оны түзете алмайтын топқа жібереді. Санат — пайдалы шығыс; үкім — оны қате ететін нәрсе.