Hoe u een actieve VPN-tunnel vanuit code op elk platform detecteert
Bestaat de tunnel, loopt dit doel erdoorheen, of antwoordt het verre uiteinde? Dat zijn drie verschillende controles en drie verschillende signalen.
‘Is de VPN actief?’ zijn eigenlijk drie vragen in één zin. Welke daarvan uw code nodig heeft, is de eerste beslissing, en juist die slaan de meeste implementaties over. Bestaat er op dit apparaat een tunnel, verlaat het verkeer naar dit doel hem, of antwoordt het verre uiteinde met de identiteit die u verwacht. Kies de eigenschap, kies dan het signaal dat hem meet, en schrijf ten slotte in het log welke u werkelijk hebt gemeten.
Drie eigenschappen, drie signalen
Samengeperst tot één regel elk hebben de drie vragen drie verschillende antwoorden. De tabel hieronder is de beslissing zelf, niet de samenvatting ervan.
| 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 |
Lees de laatste rij langzaam. Een private host die antwoordt bewijst dat er iets antwoordde, niet dat het antwoord door de tunnel kwam, en hij zegt niets over wie er aan de andere kant zit. Als de eigenschap die u nodig hebt het pad is, meet dan het pad.
Bestaan: de eigen toestand van het platform
Windows beantwoordt dit voor native profielen via de Remote Access Service API. RasEnumConnections somt op wat verbonden is, RasGetConnectStatus meldt de toestand van één vermelding, en RasGetLinkStatistics voegt snelheid, bytetellers en de leeftijd van de verbinding toe. De grenzen zijn het punt: OpenVPN, WireGuard en leveranciersclients registreren nooit een RAS-verbinding, dus een gezonde tunnel van dat type toont een lege lijst en naïeve code meldt hem als neer.
Linux-desktops bieden dezelfde eigenschap via NetworkManager op D-Bus, waar PropertiesChanged op het VPN-verbindingsobject de controle in een gebeurtenis verandert en de eigenschap State meldt wanneer de link de verbonden toestand bereikt. Vanuit een shell leest nmcli connection show --active dezelfde informatie, en dat is wat u tijdens het debuggen wilt. macOS houdt die lijst in het System Configuration-framework, met scutil als de weergave op de opdrachtregel. Alle drie beschrijven ze een verbinding die het platform beheert, en alle drie zwijgen ze over een tunnel die het niet beheert.
Pad: waar het pakket werkelijk heen gaat
Naamovereenkomst is de sneltoets waar iedereen eerst naar grijpt: som de interfaces op, test de tekenreeks tegen tun, tap, ppp of ipsec, en beschouw een treffer als bewijs. Het is een heuristiek, en de interfaceset kan er hetzelfde uitzien of er nu iets doorheen beweegt of niet. Oudere iOS-builds antwoordden zo en latere stopten, omdat de zichtbare interfaces de twee toestanden niet meer onderscheidden.
Wat het daar verving is het proxywoordenboek van het systeem. Zolang een VPN verbonden is, geeft de aanroep van de proxy-instellingen sleutels terug die beperkt zijn tot de tunnelgerelateerde interfaces, en zonder verbinding komt het woordenboek leeg terug. Dat is een zwakkere bewering dan het klinkt, want het legt de systeemopvatting vast dat er een tunnel bestaat, niet welk doel hem gebruikt.
Android heeft zijn eigen versie van de val: de vpn.connectivity-uitzending bereikt op sommige builds in het manifest verklaarde ontvangers en op andere tijdens runtime geregistreerde ontvangers. Behandel het als beste inspanning, en houd een directe sonde erachter.
Wanneer het doel is wat telt, vraag dan de routingtabel in plaats van de adapterlijst. Heuristieken voor de standaardgateway breken op machines met meerdere netwerken en op tunnels die hun eigen gateway installeren.
Identiteit: onderzoek het verre uiteinde
Een lus die elke paar seconden een ICMP-echo naar de verre kant stuurt, is de goedkoopste controle van dit soort, en hij faalt in een nuttige richting. Richt hem op een adres dat alleen binnen het private netwerk bestaat, want een openbaar adres antwoordt via elke werkende uplink en bewijst niets. Waar ICMP wordt gefilterd, doet een korte TCP-verbinding naar de servicepoort hetzelfde werk.
Een controle aan de serverkant heeft precies één signaal beschikbaar: het bronadres op de verbinding. Het bereikinventaris bijhouden is onderhoudswerk, en het kan een tunnel niet scheiden van elk ander netwerk dat toevallig hetzelfde blok gebruikt.
Grof beleid kan daarmee leven. Identiteit niet, dus authenticeer de client in plaats van te vertrouwen op waar zijn pakketten vandaan lijken te komen.
Log de categorie, niet het vonnis
Houd de foutcategorieën gescheiden in het log: geen interface, interface aanwezig maar het doel onbereikbaar, doel bereikbaar maar authenticatie geweigerd. Dat zijn drie verschillende eigenaren, en elk opent een ander onderzoek.
Ze samenvouwen tot één ‘VPN neer’ stuurt het rapport naar een team dat het niet kan oplossen. De categorie is de nuttige uitvoer; het vonnis is wat het onjuist maakt.