Linux mrežni imenski prostori za VPN: što ne izoliraju
Imenski prostor premješta interfejse, rute i sockete, ne datoteke ili račune. Evo što VPN u vlastitom netns-u pokriva i gdje promet ipak izlazi.
Pokrenite VPN unutar vlastitog imenskog prostora, pokrenite tamo jednu aplikaciju, a promet ipak izlazi preko rute domaćina. Ništa nije pokvareno: imenski prostor upravlja samo procesima koji u njega uđu, a curenje je došlo od procesa koji nikada nije ušao. Interfejsi, adrese, rute, pravila vatrozida i sockete su ono što imenski prostor posjeduje. Datoteke, računi i već pokrenute usluge nisu, i odatle dolazi većina iznenađenja.
Što imenski prostor posjeduje i gdje se socket rađa
Premjestite interfejs u imenski prostor i domaćin ga gubi; izgradite tunel unutra i domaćin ga ne može vidjeti. To je mehanizam iza VPN-a ograničenog na imenski prostor: uređaj i rute prema njemu žive u kontekstu do kojeg mogu doći samo odabrani procesi. Domaćin zadržava svoju zadanu rutu, pa sve izvan ostaje netaknuto.
Za WireGuard je kontekst stvaranja jednako važan kao trenutna lokacija: UDP socket se veže u imenskom prostoru u kojem je interfejs stvoren, čak i nakon što se uređaj premjesti drugdje. Koja tablica usmjeravanja prati šifrirane pakete ovisi o tom mjestu rođenja. Kada socket ostane u kontekstu bez rute do partnera, interfejs traži i rukovanje nikada ne izlazi. Provjerite mjesto njegovog rođenja, zatim trenutnu lokaciju.
Što imenski prostor ne izolira
Ništa ovdje ne razdvaja datotečne sustave, račune ili tajne, i nijedna od tih granica ne nastaje zato što ste stvorili imenski prostor. Konfiguracija razrješivača je datoteka, pa proces unutra ipak može pročitati postavku koja pokazuje na razrješivač domaćina i poslati svoj upit preko rute koju to podrazumijeva. Aplikacija koja zahtjev predaje već pokrenutom posredniku ili sistemskoj usluzi uključuje proces u posve drugom kontekstu. Oba su zahtjevi na koje granica nikada nije bila namijenjena odgovoriti.
Rješenje je datoteka po imenskom prostoru na /etc/netns/<name>/resolv.conf, ili bind mount pripremljene datoteke, usmjerena na razrješivač dostupan iznutra. Uređivanje /etc/resolv.conf na domaćinu ne mijenja ništa što imenski prostor vidi.
Smještanje procesa je kontrola
Izolacija koju dobivate točno je izolacija procesa koje pokrenete unutra. Školjka pokrenuta kroz exec pomoćnik imenskog prostora, i sve što ona stvori, ostaje unutra; stolna aplikacija pokrenuta iz sesije domaćina ne. Stvorite kontekst, premjestite uređaj, pa dokažite obje strane:
ip netns add vpn1
ip link set wg0 netns vpn1
ip netns exec vpn1 wg show
wg show
Pročitajte prvi wg show iznutra iz imenskog prostora, a drugi s domaćina, i očekujte da samo jedan od njih navede partnera. Ako oba to čine, uređaj se nikada nije premjestio; ako nijedan, otišao je negdje drugdje. Kada je pokretač upravitelj usluga, datoteka jedinice je ono što treba urediti, a ne prečac na radnoj površini. Jedinica bez postavke imenskog prostora pokreće demon u kontekstu domaćina i tiho poništava dizajn.
Testirajte iz konteksta aplikacije
Pokrenite provjeru s istom binarnom datotekom i istim korisnikom koje aplikacija koristi, unutar imenskog prostora. Uključite DNS i obje obitelji adresa, jer ruta IPv6 na koju niste pomislili čest je izlaz. Provjera iz vaše vlastite školjke dokazuje samo da je vaša školjka izolirana.
Zatim pokrenite identičnu provjeru na domaćinu i potvrdite da se odgovori razlikuju: adresa tunela i namjeravani izlaz unutra, ruta domaćina i uredski izlaz izvana, i razrješivač po imenu. Imenujte imenske prostore po implementaciji, a ne po protokolu, kako skripta za čišćenje ne bi zamijenila dva od njih.
Prosljeđivanje, politika kvara i čišćenje
Za pristupnik svjesno uključite prosljeđivanje i odlučite što se treba dogoditi kada tunel padne. Imenski prostor ne blokira rute koje unutra instalirate, pa će se rezervna ruta prema domaćinu koristiti ako je stvorite. To je politička odluka i treba je zapisati prije nego što je ispad testira.
Zabilježite nazive imenskih prostora, interfejse i to kome pripada konfiguracija, kako bi čišćenje uklonilo samo ono što je implementacija stvorila. Vraćanje mreže domaćina na zadano tijekom poništavanja pretvara čišćenje u ispad. network_namespaces(7) je kratka stranica i vrijedi je pročitati prije nego što osmislite taj put.