Linux-netværksnavnerum til en VPN: hvad de ikke isolerer
Et navnerum flytter grænseflader, ruter og sockets, ikke filer eller konti. Her er, hvad en VPN i sit eget netns dækker, og hvor trafikken stadig slipper ud.
Start VPN’en inde i sit eget navnerum, kør én applikation der, og trafikken forlader stadig via værtens rute. Intet er i stykker: navnerummet styrer kun processer, der går ind i det, og lækagen kom fra en, der aldrig gjorde det. Grænseflader, adresser, ruter, firewallregler og sockets er det, navnerummet ejer. Filer, konti og allerede kørende tjenester gør ikke, og det er der, de fleste overraskelser kommer fra.
Hvad navnerummet ejer, og hvor socket’en fødes
Flyt en grænseflade ind i et navnerum, og værten mister den; byg en tunnel indeni, og værten kan ikke se den. Det er mekanismen bag en navnerumsafgrænset VPN: enheden og ruterne, der peger på den, lever i en kontekst, som kun de valgte processer kan nå. Værten beholder sin standardrute, så alt udenfor forbliver urørt.
Oprettelseskonteksten betyder lige så meget som den aktuelle placering for WireGuard: UDP-socket’en bindes i det navnerum, hvor grænsefladen blev oprettet, selv efter at enheden flytter et andet sted hen. Hvilken rutetabel de krypterede pakker følger, afhænger af det fødested. Når socket’en bliver i en kontekst uden rute til peeren, slår grænsefladen op, og håndtrykket forlader aldrig. Kontroller fødestedet, derefter dens aktuelle placering.
Hvad et navnerum ikke isolerer
Intet her adskiller filsystemer, konti eller hemmeligheder, og ingen af de grænser opstår, fordi du oprettede et navnerum. Resolverkonfiguration er en fil, så en proces indeni kan stadig læse en indstilling, der peger på værtens resolver, og sende sin forespørgsel ud gennem den rute, det medfører. En applikation, der giver anmodningen videre til en allerede kørende broker eller systemtjeneste, involverer en proces i en helt anden kontekst. Begge er anmodninger, som grænsen aldrig var beregnet til at besvare.
Løsningen er en fil pr. navnerum på /etc/netns/<name>/resolv.conf, eller en bind mount af en forberedt fil, der peger på en resolver, som kan nås indefra. At redigere /etc/resolv.conf på værten ændrer intet af det, navnerummet ser.
Placeringen af processer er styringen
Den isolering, du får, er præcis isoleringen af de processer, du starter indeni. Et shell startet gennem navnerummets exec-hjælper, og alt hvad det afføder, bliver inde; en skrivebordsapplikation startet fra værtens session gør ikke. Opret konteksten, flyt enheden, og bevis så begge sider:
ip netns add vpn1
ip link set wg0 netns vpn1
ip netns exec vpn1 wg show
wg show
Læs det første wg show inde fra navnerummet og det andet fra værten, og forvent at kun én af dem viser peeren. Hvis begge gør, flyttede enheden sig aldrig; hvis ingen gør, gik den et andet sted hen. Når starteren er en tjenestestyring, er det unit-filen, der skal redigeres, ikke skrivebordsgenvejen. En unit uden navnerumsindstillingen starter daemonen i værtens kontekst og ophæver stille designet.
Test fra applikationens kontekst
Kør kontrollen med den samme binære fil og den samme bruger, som applikationen bruger, inde i navnerummet. Medtag DNS og begge adressefamilier, fordi en IPv6-rute, du aldrig overvejede, er en almindelig vej ud. En test fra dit eget shell beviser kun, at dit shell er isoleret.
Kør derefter den identiske kontrol på værten, og bekræft at svarene er forskellige: tunneladresse og tilsigtet udgang indeni, værtens rute og kontorets udgang udenfor, og resolveren ved navn. Navngiv navnerum efter udrulningen frem for protokollen, så et oprydningsscript ikke kan forveksle to af dem.
Videresendelse, fejlpolitik og oprydning
Til en gateway skal du bevidst slå videresendelse til og beslutte, hvad der skal ske, når tunnelen falder. Et navnerum blokerer ikke ruter, du installerer indeni, så en reservevej til værten bliver brugt, hvis du opretter en. Det er en politisk beslutning, og den bør skrives ned, før et udfald tester den.
Notér navnerumsnavnene, grænsefladerne og hvem der ejer konfigurationen, så oprydning kun fjerner det, udrulningen oprettede. Nulstilling af værtens netværk under en tilbagerulning gør oprydning til et udfald. Siden network_namespaces(7) er kort og værd at læse, før du designer den vej.