Linuxin verkkonimiavaruudet VPN:ää varten: mitä ne eivät eristä
Nimiavaruus siirtää rajapintoja, reittejä ja socket:eja, ei tiedostoja tai tilejä. Tässä näkyy, mitä VPN omassa netns:ssä kattaa ja mistä liikenne yhä karkaa.
Käynnistä VPN oman nimiavaruutensa sisällä, aja siellä yksi sovellus, ja liikenne lähtee silti isäntäkoneen reittiä. Mikään ei ole rikki: nimiavaruus hallitsee vain prosesseja, jotka astuvat siihen, ja vuoto tuli prosessista, joka ei koskaan astunut. Rajapinnat, osoitteet, reitit, palomuurisäännöt ja socket:it ovat se, mitä nimiavaruus omistaa. Tiedostot, tilit ja jo käynnissä olevat palvelut eivät ole, ja siitä useimmat yllätykset tulevat.
Mitä nimiavaruus omistaa ja missä socket syntyy
Siirrä rajapinta nimiavaruuteen ja isäntäkone menettää sen; rakenna sinne tunneli ja isäntäkone ei näe sitä. Se on nimiavaruuteen rajautuvan VPN:n mekanismi: laite ja siihen osoittavat reitit elävät kontekstissa, johon vain valitut prosessit pääsevät. Isäntäkone pitää oletusreittinsä, joten kaikki ulkopuolella pysyy koskemattomana.
WireGuardille luontikonteksti on yhtä tärkeä kuin nykyinen sijainti: UDP-socket sidotaan siihen nimiavaruuteen, jossa rajapinta luotiin, vaikka laite siirtyisi muualle. Mihin reititystauluun salatut paketit seuraavat, riippuu tästä syntymäpaikasta. Kun socket jää kontekstiin, jossa ei ole reittiä vertaiselle, rajapinta hakee eikä kättely lähde koskaan. Tarkista sen syntymäpaikka ja sitten nykyinen sijainti.
Mitä nimiavaruus ei eristä
Mikään tässä ei erottele tiedostojärjestelmiä, tilejä tai salaisuuksia, eikä yksikään näistä rajoista synny siksi, että loit nimiavaruuden. Resolverin asetukset ovat tiedosto, joten sisällä oleva prosessi voi yhä lukea asetuksen, joka osoittaa isäntäkoneen resolveriin, ja lähettää kyselynsä ulos reittiä, jonka se edellyttää. Sovellus, joka antaa pyynnön jo käynnissä olevalle välittäjälle tai järjestelmäpalvelulle, kytkee mukaan prosessin täysin toisessa kontekstissa. Molemmat ovat pyyntöjä, joihin rajan ei ollut tarkoitus koskaan vastata.
Ratkaisu on nimiavaruuskohtainen tiedosto polussa /etc/netns/<name>/resolv.conf tai valmistellun tiedoston bind mount, joka osoittaa sisältä saavutettavaan resolveriin. Isäntäkoneen /etc/resolv.conf muokkaaminen ei muuta mitään, mitä nimiavaruus näkee.
Prosessien sijoittelu on se ohjaus
Saamasi eristys on täsmälleen niiden prosessien eristys, jotka käynnistät sisällä. Nimiavaruuden exec-apurin kautta käynnistetty shell ja kaikki, mitä se synnyttää, jäävät sisään; isäntäkoneen istunnosta käynnistetty työpöytäsovellus ei. Luo konteksti, siirrä laite ja todista sitten molemmat puolet:
ip netns add vpn1
ip link set wg0 netns vpn1
ip netns exec vpn1 wg show
wg show
Lue ensimmäinen wg show nimiavaruuden sisältä ja toinen isäntäkoneelta, ja odota, että vain toinen niistä luettelee vertaisen. Jos molemmat tekevät niin, laite ei koskaan siirtynyt; jos ei kumpikaan, se meni muualle. Kun käynnistäjä on palvelunhallinta, muokattava on unit-tiedosto, ei työpöydän pikakuvake. Unit ilman nimiavaruusasetusta käynnistää daemonin isäntäkoneen kontekstissa ja kumoaa suunnittelun hiljaa.
Testaa sovelluksen kontekstista
Suorita tarkistus samalla binäärillä ja samalla käyttäjällä, jota sovellus käyttää, nimiavaruuden sisällä. Sisällytä DNS ja molemmat osoiteperheet, sillä IPv6-reitti, jota et koskaan harkinnut, on tavallinen ulospääsy. Testi omasta shellistäsi todistaa vain, että oma shellisi on eristetty.
Suorita sitten sama tarkistus isäntäkoneella ja varmista, että vastaukset eroavat: tunnelin osoite ja aiottu poistumistie sisällä, isäntäkoneen reitti ja toimiston poistumistie ulkona, ja resolver nimeltä. Nimeä nimiavaruudet käyttöönoton mukaan, ei protokollan, jotta siivousskripti ei sekoita kahta niistä.
Edelleenlähetys, vikakäytäntö ja siivous
Yhdyskäytävälle kytke edelleenlähetys tarkoituksella päälle ja päätä, mitä pitäisi tapahtua, kun tunneli putoaa. Nimiavaruus ei estä reittejä, jotka asennat sen sisään, joten varareitti isäntäkoneelle otetaan käyttöön, jos sellaisen luot. Se on linjapäätös, ja se pitäisi kirjoittaa muistiin ennen kuin katkos testaa sitä.
Kirjaa nimiavaruuksien nimet, rajapinnat ja se, kenelle asetukset kuuluvat, jotta siivous poistaa vain sen, minkä käyttöönotto loi. Isäntäkoneen verkon palauttaminen takaisinperinnän aikana muuttaa siivouksen katkokseksi. Sivu network_namespaces(7) on lyhyt ja kannattaa lukea ennen kuin suunnittelet sen polun.