Versleuteling begint bij een grens, en die grens is een routeringsbeslissing die het eindpunt neemt voordat er ooit een pakket wordt ingekapseld. Een netwerk dat je sleutels nooit ziet, kan je machine toch een route geven die het prettiger vindt dan die van de tunnel zelf. Twee storingen worden hier verward: een pakket lezen dat al in de tunnel zit, en een pakket sturen dat er nooit in is geplaatst.

Het onderscheid is belangrijk omdat de tweede storing goedkoper te regelen is en veel makkelijker te missen. Ze uit zich als een verzoek dat via de verkeerde interface naar buiten ging terwijl de client nog een gezonde verbinding meldde.

Twee manieren waarop een netwerk je kan beïnvloeden

Een pakket dat de tunnel bereikt, heeft zijn payload verborgen voor elke hop die het passeert, en die bescherming houdt stand ook als het pad je verrast. Een pakket dat de tunnel nooit bereikt, is een gewoon verzoek vanaf jouw adres, verzonden waar de routetabel naar wees. De eerste storing vereist een gebroken cijfer of een gecompromitteerde peer, terwijl de tweede alleen een configuratiebericht nodig heeft dat je machine besloot te vertrouwen. Die asymmetrie is de reden dat de routeringshelft een eigen controle verdient.

Apparatuur op het pad heeft je sleutels niet nodig om het tweede geval te beïnvloeden. Ze heeft genoeg aan een eindpunt dat een route, een resolver of een beleidsregel accepteert die er een oplevert.

expected:  app -> tunnel device -> encapsulation -> internet
observed:  app -> wlan0        -> plaintext     -> internet

Waar een route vandaan kan komen voordat de tunnel bestaat

DHCP deelt meer uit dan een adreslease. De optie voor klasseloze statische routes kan bestemmingsprefixen en volgende hops dragen, en RFC 3442 bespreekt de veiligheidsgevolgen van een verkeerd routeradres: verkeer dat de verkeerde kant op gaat, een denial of service, of een waarnemer die op het pad zit. Een client die die routes accepteert voordat de tunnel actief is, kan uitkomen op een voorkeurspad dat niets met je provider te maken heeft.

Niets daarvan maakt route-injectie universeel. De client moet de optie accepteren, het prefix moet het verkeer dekken dat je belangrijk vindt, de gekozen volgende hop moet bereikbaar zijn, en het handhavingsbeleid moet het pakket die kant op laten. Haal een van die voorwaarden weg en dezelfde reactie is onschadelijk. Dat is ook waarom twee machines op één netwerk zich anders kunnen gedragen, omdat ze niet dezelfde client, hetzelfde beleid of zelfs dezelfde adresfamilie draaien.

IPv6 verdient een eigen ronde, omdat routeradvertenties een standaardroute via andere code dragen dan de DHCPv4-optie doet. Een test die alleen de v4-tabel bekijkt, heeft dat niet gedekt.

Controleer het pad dat de kernel werkelijk kiest

Routeopzoekingen zijn te beantwoorden, dus vraag het ze in plaats van af te leiden uit een statuslampje. De opdrachten hieronder tonen de gekozen route en bron voor één bestemming, plus de regels die de hoofdtabel kunnen overrulen. Voer ze uit terwijl je verbonden bent en opnieuw na een herverbinding, omdat het vernieuwen van een lease het antwoord kan veranderen.

ip route get 203.0.113.10
ip route show table all | grep -E '^(default|203\.0\.113)'
ip rule show
resolvectl query example.com

Lees de uitvoer op twee dingen: de interface die in de route wordt genoemd en het gekozen bronadres. Een tunnelroute noemt het tunnelapparaat, een gelekte route noemt het fysieke, en het verschil is zichtbaar zonder iets te ontsleutelen. Verandert het antwoord tussen runs, bewaar dan beide uitvoeren en vergelijk de regels die ze hebben opgeleverd.

Stop niet bij de standaardroute. Een uitzondering voor een app, een prefix voor split-tunneling of een tweede beleidsregel kan een specifieke bestemming om de tunnel heen dragen terwijl de standaard nog steeds naar binnen wijst.

Bepaal waar de handhaving moet zitten

Drie voorwaarden bepalen of handhaving aan de clientkant genoeg is of dat je iets buiten de client nodig hebt. Als de client routes installeert en verdedigt voor elke adresfamilie die je gebruikt, is een tunnel die de standaardroute bezit meestal voldoende. Als de machine lokale bronnen moet bereiken terwijl al het andere in de tunnel blijft, moeten die uitzonderingen worden opgesomd en beheerd in plaats van overgelaten aan wat het toegangsnetwerk adverteerde. En als het platform verkeer per app aan een interface kan binden, is die binding een sterkere garantie dan een route die alles kan overrulen.

Wat je ook kiest, schrijf de beslissing op waar de configuratie woont. Een regel die bestaat omdat iemand hem tijdens een incident heeft getypt, overleeft de volgende herstart niet, dus houd lokale uitzonderingen en bootstrap-uitzonderingen smal en leg vast waarom elk ervan bestaat.

Voer de opzoekopdrachten opnieuw uit na elke clientupgrade en elke netwerkwijziging, en vergelijk met de laatst vastgelegde uitvoer. De routetabel is de handhavingsgrens, dus behandel hem als zodanig.

Gerelateerde artikelen