„Включен ли е 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 е паднал“ изпраща доклада до екип, който не може да го поправи. Категорията е полезната изходна информация; присъдата е това, което го прави грешен.

Подобни статии