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.

Povezani članci