Како открити активан 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 радне површине излажу исто својство кроз 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 је пао“ шаље извештај тиму који то не може да поправи. Категорија је користан излаз; пресуда је оно што га чини погрешним.