”Onko VPN päällä?” on oikeastaan kolme kysymystä yhdessä lauseessa. Minkä niistä koodisi tarvitsee, on ensimmäinen päätös, ja juuri sen useimmat toteutukset ohittavat. Onko tässä laitteessa tunneli, lähteekö liikenne tähän kohteeseen sen kautta vai vastaako etäpää odottamallasi identiteetillä. Valitse ominaisuus, valitse sitten signaali joka mittaa sitä, ja kerro lopuksi lokissa minkä niistä todella mittasit.

Kolme ominaisuutta, kolme signaalia

Yhdelle riville kutistettuna kolmella kysymyksellä on kolme eri vastausta. Alla oleva taulukko on itse päätös, ei sen yhteenveto.

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

Lue viimeinen rivi hitaasti. Vastaava yksityinen isäntä todistaa, että jokin vastasi, ei että vastaus tuli tunnelin kautta, eikä se kerro mitään siitä, kuka on toisessa päässä. Jos tarvitsemasi ominaisuus on polku, mittaa polkua.

Olemassaolo: alustan oma tila

Windows vastaa tähän natiiveille profiileille Remote Access Service API:n kautta. RasEnumConnections luettelee, mikä on yhdistetty, RasGetConnectStatus raportoi yhden merkinnän tilan ja RasGetLinkStatistics lisää nopeuden, tavulaskurit ja yhteyden iän. Rajat ovat koko pointti: OpenVPN, WireGuard ja toimittajien asiakasohjelmat eivät koskaan rekisteröi RAS-yhteyttä, joten terve tunneli tuota tyyppiä näyttää tyhjää listaa ja naiivi koodi raportoi sen sammuneeksi.

Linux-työpöydät tarjoavat saman ominaisuuden NetworkManagerin kautta D-Busilla, missä PropertiesChanged VPN-yhteysoliossa muuttaa tarkistuksen tapahtumaksi ja ominaisuus State raportoi, milloin linkki saavuttaa yhdistetty-tilan. Kuoresta nmcli connection show --active lukee samat tiedot, ja juuri sitä haluat virheenkorjauksen aikana. macOS pitää tätä luetteloa System Configuration -kehyksessä, ja scutil on sen komentorivikäkymä. Kaikki kolme kuvaavat yhteyttä, jota alusta hallinnoi, ja kaikki kolme vaikenevat tunnelista, jota se ei hallinnoi.

Polku: mihin paketti todella menee

Nimien täsmäytys on oikotie, johon kaikki tarttuvat ensin: luettele rajapinnat, testaa merkkijono tun, tap, ppp tai ipsec vasten ja pidä osumaa todisteena. Se on heuristiikka, ja rajapintajoukko voi näyttää samalta riippumatta siitä, liikkuuko sen läpi mitään. Vanhemmat iOS-versiot vastasivat näin ja uudemmat lopettivat, koska näkyvät rajapinnat eivät enää erottaneet kahta tilaa.

Sen korvasi siellä järjestelmän välityspalvelinsanakirja. Kun VPN on yhdistettynä, välityspalvelinasetusten kutsu palauttaa avaimia, jotka on rajattu tunneliin liittyviin rajapintoihin, ja kun mitään ei ole yhdistettynä, sanakirja palaa tyhjänä. Se on heikompi väite kuin miltä se kuulostaa, koska se tallentaa järjestelmän uskomuksen tunnelin olemassaolosta, ei sitä, mikä kohde sitä käyttää.

Androidilla on oma versionsa ansasta: vpn.connectivity-lähetys saavuttaa manifestiin ilmoitetut vastaanottajat joissakin koontiversioissa ja ajonaikaisesti rekisteröidyt vastaanottajat toisissa. Käsittele sitä parhaana yrityksenä ja pidä suoraa koetinta sen takana.

Kun kohde on se, mikä ratkaisee, kysy reititystaulukolta sen sijaan että kysyisit sovitinkuettelosta. Oletusyhdyskäytävän heuristiikat murtuvat koneilla, joissa on useita verkkoja, ja tunneleilla, jotka asentavat oman yhdyskäytävänsä.

Identiteetti: koettele etäpäätä

Silmukka, joka lähettää ICMP-kaikua etäpäähän muutaman sekunnin välein, on halvin tämän tyyppinen tarkistus, ja se epäonnistuu hyödylliseen suuntaan. Kohdista se osoitteeseen, joka on olemassa vain yksityisverkon sisällä, sillä julkinen osoite vastaa minkä tahansa toimivan ylälinkin kautta eikä todista mitään. Missä ICMP suodatetaan, lyhyt TCP-yhteys palvelun porttiin tekee saman työn.

Palvelinpuolen tarkistuksella on täsmälleen yksi signaali käytettävissään: yhteyden lähdeosoite. Alueiden luettelon ylläpitäminen on ylläpitotyötä, eikä se voi erottaa tunnelia mistään muusta verkosta, joka sattuu käyttämään samaa lohkoa.

Karkea käytäntö voi elää sen kanssa. Identiteetti ei voi, joten autentikoi asiakas sen sijaan, että luottaisit siihen, mistä sen paketit näyttävät tulevan.

Kirjaa luokka, älä tuomiota

Pidä epäonnistumisluokat erillään lokissa: ei rajapintaa lainkaan, rajapinta on mutta kohde ei ole tavoitettavissa, kohde on tavoitettavissa mutta autentikointi hylättiin. Ne ovat kolme eri omistajaa, ja jokainen avaa erilaisen tutkinnan.

Niiden latistaminen yhdeksi ”VPN alas” -tilaksi lähettää raportin tiimille, joka ei voi korjata sitä. Luokka on hyödyllinen tulos; tuomio on se, mikä tekee siitä väärän.

Aiheeseen liittyvät artikkelit