LXD kontejner ne može otvoriti /dev/net/tun? Provjerite unix-char unos
LXD mora prenijeti TUN uređaj s hosta u kontejner prije nego što ga VPN klijent može koristiti. Pogledajte što unix-char dodaje, što ne i kako to provjeriti.
LXD izlaže hostov znakovni uređaj kontejneru dodavanjem čvora uređaja, a ne učeći gosta da ga stvori. Ako kontejner nema /dev/net/tun, host može imati uređaj, a gost ga svejedno ne može otvoriti. unix-char unos je upraviteljska polovica tog puta i namjerno je uža od privilegiranog kontejnera. Zato hostov čvor i kontejnerov čvor zaslužuju odvojene provjere.
Mehanizam je dovoljno kratak da ostane na vidiku: LXD razrješava putanju na hostu, stvara odgovarajući čvor unutar instance i dodaje uređaj u kontejnerovu cgroup uređaja. Zatim gostov proces treba vlastito dopuštenje i sposobnost da čvor upotrijebi za bilo što.
Što unix-char unos doista mijenja
unix-char uređaj kaže LXD-u da izloži jedan hostov znakovni uređaj na odabranoj putanji unutar kontejnera. Unos ima tri važna dijela: oznaku uređaja koju rabi upravitelj, putanju source na hostu i path koji gost vidi. Samo posljednja dva opisuju sam uređaj. Tipfeler u bilo kojem od njih stvara čvor na mjestu koje klijent nikada ne otvara.
Na hostu je uređaj obično /dev/net/tun. Unutar kontejnera možete zadržati istu putanju ili odabrati drugu, ali putanja se mora poklapati s onim što VPN klijent očekuje. Zadržavanje /dev/net/tun izbjegava drugi problem s konfiguracijom, jer većina klijenata otvara tu putanju bez pitanja.
Upravitelj primjenjuje unos kad se instanca pokrene ili kad se uređaj uvruće priključi. Ne kopira upravljački program u gosta i ne stvara sučelje tunela. Čini čvor vidljivim i dopušta pristup kroz kontejnerovu upravljačku skupinu uređaja.
Deklarirajte uređaj na instanci, a ne unutar gosta
Dodajte unos iz LXD upraviteljskog konteksta, imenujući instancu i oznaku koju ćete kasnije prepoznati. Za kontejner nazvan vpnbox naredba je:
lxc config device add vpnbox tun unix-char source=/dev/net/tun path=/dev/net/tun
lxc config device show vpnbox
Oznaka tun lokalna je za konfiguraciju instance. Nije naziv sučelja i ne mora se poklapati s ničim u gostu. Ako profil već pruža isti uređaj, dodavanje drugog unosa stvara sukob, a ne zalihost, pa najprije pregledajte djelotvornu konfiguraciju.
Uređivanje datoteka unutar kontejnera je pogrešan sloj. mknod u početnoj skripti može izgledati da radi na privilegiranom kontejneru, a zatim nestati pri ponovnom stvaranju ili ne uspjeti na manje privilegiranom. Upravitelj posjeduje skup uređaja instance; neka posjeduje i čvor.
Uskladite vlasništvo i način rada s gostovim procesom
unix-char unos može postaviti uid, gid i mode za čvor unutar kontejnera. Upotrijebite ih da odgovaraju računu koji pokreće VPN klijent, umjesto da uređaj otvorite svim korisnicima ili prebacite kontejner u privilegirani način rada.
Vidljivost nije isto što i dopuštenje. Čvor u vlasništvu roota s načinom rada 600 vidljiv je usluzi koja radi kao neprivilegirani korisnik i ipak ga ona ne može otvoriti. Provjerite najprije gostov račun, zatim postavite vlasništvo na taj račun i držite način rada ne širim nego što klijent treba.
Proces također treba sposobnost konfiguriranja sučelja tunela, obično CAP_NET_ADMIN u mrežnom imenskom prostoru kontejnera. Prijenos uređaja ne daje tu sposobnost, a davanje sposobnosti ne osigurava uređaj; to su neovisni zahtjevi.
Znajte što unos ne daje
Vidljiv čvor nije VPN koji radi. Klijentski paket još se mora instalirati, profil još mora biti valjan i usluga još mora pokrenuti. Autentifikacija, rute i DNS ostaju klijentov posao, a neuspjeh ondje nije dokaz da je unos uređaja pogrešan.
systemd može dodati još jedno ograničenje. Jedinica s DeviceAllow ili očvrsnutom politikom uređaja može odbiti pristup čvoru koji je osigurao upravitelj kontejnera. Provjerite politiku uređaja jedinice kad čvor postoji, ali usluga prijavljuje pogrešku dopuštenja, i promijenite tu politiku umjesto da proširite kontejner.
Vruće priključivanje nije obavezno i izričito je. Unos s required=false treba izvornu putanju i može se pojaviti ili nestati kako se hostov uređaj mijenja. Takav životni ciklus odgovara hardveru koji dolazi i odlazi; za TUN uređaj koji VPN treba pri podizanju, neobavezan unos može pustiti uslugu da se pokrene prije nego što njezin preduvjet postoji.
Provjerite vidljivost, otvaranje i sučelje tim redom
Najprije potvrdite čvor unutar predviđenog kontejnera. Putanja, glavni i sporedni broj te vlasništvo trebaju se poklapati s hostovim uređajem i unosom koji ste dodali. Čvor koji nedostaje znači da upravitelj nije primijenio unos ili ga je primijenio na drugu instancu.
lxc exec vpnbox -- ls -l /dev/net/tun
lxc exec vpnbox -- sh -c 'test -c /dev/net/tun && echo char-device-ok'
Zatim potvrdite da ga račun usluge može otvoriti. Kratak test pod tim računom odvaja problem vlasništva od problema usluge. Naposljetku pokrenite klijent i potvrdite da se pojavi sučelje tunela; samo taj treći korak dokazuje cijeli put, jer prva dva mogu proći dok su profil ili sposobnost klijenta još pogrešni.
Zabilježite instancu, oznaku uređaja, izvor na hostu, putanju u gostu i račun vlasnika kad se promjena odobri. Tih pet vrijednosti su ono što kasnije ponovno stvaranje, migracija ili promjena profila mora sačuvati, i mnogo ih je lakše usporediti od pogreške dopuštenja bez konteksta.