tun0 en een VPN-protocol als één ding behandelen stuurt mensen naar het verkeerde log. De interface is een lokale grens waar een programma in de gebruikersruimte IP-pakketten met de kernel uitwisselt. Het protocol is wat dat programma met de pakketten doet zodra het ze heeft: transport, authenticatie, versleuteling en een tegenpartij. Het aanmaken van het apparaat kiest daar niets van.

Twee componenten, één pakketpad

De kernel schrijft een IP-pakket in het apparaat en het programma leest het uit een bestandsdescriptor. In de andere richting schrijft het programma een pakket terug en de kernel routeert het alsof het op een echte interface binnenkwam. TUN draagt IP, terwijl TAP Ethernet-frames draagt. Een pakket op die grens lezen toont de framing, en daar is het apparaat precies voor bedoeld.

Alles voorbij die grens is de zaak van het programma. Twee programma's kunnen hetzelfde interfaceconcept gebruiken en heel verschillende dingen met de pakketten doen. Het apparaat zelf heeft geen mening over wat er daarna gebeurt. De bestandsdescriptor is het enige handvat dat het programma aan de kernelzijde heeft.

Maak het apparaat aan en kijk dan naar de grens

Maak bewust een apparaat aan wanneer je de grens test. Een persistent apparaat overleeft het proces dat het heeft aangemaakt, wat nuttig is voor experimenten en daarna een veelvoorkomende bron van verwarring. Controleer de vlaggen en de eigenaar voordat je het VPN de schuld geeft.

sudo ip tuntap add dev tun9 mode tun user alice
ip -d link show tun9

De linkdetails tonen het apparaattype en de gekoppelde eigenaar. Als geen enkel proces het open houdt, gaan pakketten die erin worden geschreven nergens heen. Een apparaat zonder gekoppeld proces kan er in een linklijst gezond uitzien terwijl het niets doorlaat.

Wat de interfacenaam niet kan beloven

De interfacenaam zegt niets over versleuteling of authenticatie. Een programma kan de pakketten in TLS, in een eigen protocol, in IPsec of in niets verpakken. TUN in plaats van TAP kiezen verandert de framing aan de grens, niet het beveiligingsontwerp. De keuze van framing is echt, en hij is veel kleiner dan de beveiligingsvraag.

Detectie werkt op dezelfde manier: een waarnemer ziet het buitenste protocol op de draad, niet een label dat zegt welk lokaal apparaat het heeft gemaakt. Een tunnel die op iets anders lijkt, doet dat vanwege zijn buitenste protocol, niet vanwege de naam van zijn interface. Een waarnemer kan niet zien welk lokaal apparaat een pakket heeft gemaakt, alleen hoe het pakket eruitziet. Houd die twee vragen gescheiden wanneer je producten vergelijkt, want het ene antwoord impliceert nooit het andere.

Stem de oplossing af op de fase die faalt

Scheid de faalfasen wanneer er iets stukgaat. Een ontbrekend apparaat, een machtigingsfout en een geweigerde login leveren verschillend bewijs en verschillende oplossingen op. Lees eerst de lokale toestand, dan het eigen log van het programma, dan de blik van de tegenpartij. Lees alle drie voordat je iets verandert.

ip -d link show tun0
journalctl -u openvpn-client@corp --since '10 min ago'

Als het apparaat bestaat en een proces houdt het vast, werkt de lokale grens en zit het probleem verder weg. Als het apparaat ontbreekt, helpt geen enkele controle van inloggegevens. Een fase die je kunt benoemen is een fase die je kunt testen. De TUN/TAP-documentatie beschrijft de grens en het apparaatmodel.

Gerelateerde artikelen