„Je VPN zapnutá?“ jsou ve skutečnosti tři otázky v jedné větě. Kterou z nich váš kód potřebuje, je první rozhodnutí, a právě to většina implementací přeskakuje. Existuje na tomto zařízení tunel, odchází provoz k této destinaci skrze něj, nebo vzdálený konec odpovídá identitou, kterou očekáváte. Vyberte vlastnost, pak vyberte signál, který ji měří, a nakonec do logu napište, který z nich jste skutečně změřili.

Tři vlastnosti, tři signály

Stlačené na jeden řádek každá, tři otázky mají tři různé odpovědi. Tabulka níže je samo rozhodnutí, ne jeho shrnutí.

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

Přečtěte si poslední řádek pomalu. Soukromý hostitel, který odpovídá, dokazuje, že něco odpovědělo, ne že odpověď přišla tunelem, a nic neříká o tom, kdo je na druhém konci. Pokud je vlastností, kterou potřebujete, cesta, měřte cestu.

Existence: vlastní stav platformy

Windows to pro nativní profily zodpovídá přes Remote Access Service API. RasEnumConnections vypisuje, co je připojeno, RasGetConnectStatus hlásí stav jedné položky a RasGetLinkStatistics přidává rychlost, počítadla bajtů a stáří připojení. Omezení jsou podstatou: OpenVPN, WireGuard a klientské aplikace výrobců nikdy neregistrují připojení RAS, takže zdravý tunel tohoto typu ukáže prázdný seznam a naivní kód ho ohlásí jako vypnutý.

Linuxové desktopy vystavují stejnou vlastnost přes NetworkManager na D-Bus, kde PropertiesChanged na objektu VPN připojení mění kontrolu na událost a vlastnost State hlásí, kdy spojení dosáhne stavu připojeno. Z shellu čte nmcli connection show --active stejné informace, což je přesně to, co chcete při ladění. macOS drží tento seznam v rámci System Configuration, s scutil jako svým pohledem z příkazové řádky. Všechny tři popisují připojení, které platforma spravuje, a všechny tři ztichnou u tunelu, který nespravuje.

Cesta: kam paket skutečně jde

Porovnávání názvů je zkratka, po které všichni sáhnou nejdřív: vypište rozhraní, otestujte řetězec proti tun, tap, ppp nebo ipsec a shodu berte jako důkaz. Je to heuristika a sada rozhraní může vypadat stejně, ať už přes ni něco prochází, nebo ne. Starší sestavení iOS odpovídala takto a novější přestala, protože viditelná rozhraní už oba stavy nerozlišovala.

To, co to tam nahradilo, je systémový slovník proxy. Dokud je VPN připojená, volání nastavení proxy vrací klíče vázané na rozhraní související s tunelem, a když není nic připojeno, slovník se vrací prázdný. Je to slabší tvrzení, než to zní, protože zaznamenává systémové přesvědčení, že tunel existuje, a ne kterou destinaci používá.

Android má svou vlastní verzi pasti: vysílání vpn.connectivity dorazí k příjemcům deklarovaným v manifestu v některých sestaveních a k příjemcům registrovaným za běhu v jiných. Berte to jako nejlepší úsilí a mějte za tím přímou sondu.

Když jde o destinaci, ptejte se směrovací tabulky místo seznamu adaptérů. Heuristiky výchozí brány se lámou na strojích s více sítěmi a na tunelech, které instalují vlastní bránu.

Identita: otestujte vzdálený konec

Smyčka, která každých pár sekund posílá ICMP ozvěnu na vzdálený konec, je nejlevnější kontrola tohoto druhu a selhává užitečným směrem. Miřte ji na adresu, která existuje jen uvnitř soukromé sítě, protože veřejná odpovídá přes jakékoli funkční připojení nahoru a nic nedokazuje. Kde je ICMP filtrován, udělá stejnou práci krátké TCP spojení na port služby.

Kontrola na straně serveru má k dispozici přesně jeden signál: zdrojovou adresu připojení. Udržovat inventář rozsahů je práce navíc a nedokáže oddělit tunel od jakékoli jiné sítě, která náhodou používá stejný blok.

Hrubá politika s tím může žít. Identita ne, proto ověřujte klienta, místo abyste věřili tomu, odkud jeho pakety zdánlivě přicházejí.

Zaznamenávejte kategorii, ne verdikt

Držte kategorie selhání v logu oddělené: žádné rozhraní, rozhraní existuje, ale destinace je nedostupná, destinace je dostupná, ale autentizace byla odmítnuta. To jsou tři různí vlastníci a každý otevírá jiné šetření.

Sloučení do jediného „VPN je dole“ pošle hlášení týmu, který to nedokáže opravit. Kategorie je užitečný výstup; verdikt je to, co ho dělá chybným.

Související články