LXD izpostavi znakovno napravo gostitelja vsebniku z dodajanjem vozlišča naprave, ne z učenjem gosta, naj jo ustvari. Če vsebnik nima /dev/net/tun, ima lahko gostitelj napravo, gost pa je vseeno ne more odpreti. Vnos unix-char je polovica te poti na strani upravljavca in je namenoma ožji od privilegiranega vsebnika. Zato si vozlišče gostitelja in vozlišče vsebnika zaslužita ločena preverjanja.

Mehanizem je dovolj kratek, da ostane na vidiku: LXD razreši pot gostitelja, ustvari ustrezno vozlišče znotraj instance in doda napravo v cgroup naprav vsebnika. Nato proces gosta potrebuje lastno dovoljenje in zmožnost, da vozlišče za kar koli uporabi.

Kaj vnos unix-char v resnici spremeni

Naprava unix-char pove LXD, naj izpostavi eno znakovno napravo gostitelja na izbrani poti v vsebniku. Vnos ima tri pomembne dele: oznako naprave, ki jo uporablja upravljavec, pot source na gostitelju in path, ki ga vidi gost. Samo zadnja dva opisujeta samo napravo. Tipkarska napaka v katerem koli od njiju ustvari vozlišče na mestu, ki ga odjemalec nikoli ne odpre.

Na gostitelju je naprava običajno /dev/net/tun. V vsebniku lahko obdržite isto pot ali izberete drugo, vendar se mora pot ujemati s tem, kar pričakuje odjemalec VPN. Ohranjanje /dev/net/tun se izogne drugi težavi s konfiguracijo, ker večina odjemalcev to pot odpre brez vprašanja.

Upravljavec vnos uporabi ob zagonu instance ali ob vroči priključitvi naprave. Ne kopira gonilnika v gosta in ne ustvari vmesnika tunela. Vozlišče naredi vidno in dovoli dostop prek nadzorne skupine naprav vsebnika.

Napravo deklarirajte na instanci, ne v gostu

Dodajte vnos iz skrbniškega konteksta LXD, z imenom instance in oznako, ki jo boste pozneje prepoznali. Za vsebnik z imenom vpnbox je ukaz:

lxc config device add vpnbox tun unix-char source=/dev/net/tun path=/dev/net/tun
lxc config device show vpnbox

Oznaka tun je lokalna za konfiguracijo instance. Ni ime vmesnika in se ji ni treba ujemati z ničemer v gostu. Če profil že zagotavlja isto napravo, dodajanje drugega vnosa ustvari spor in ne odvečnost, zato najprej preglejte dejansko konfiguracijo.

Urejanje datotek v vsebniku je napačna plast. mknod v zagonski skripti je lahko videti, da deluje na privilegiranem vsebniku, nato pa ob ponovnem ustvarjanju izgine ali spodleti na manj privilegiranem. Upravljavec ima v lasti nabor naprav instance; naj ima tudi vozlišče.

Uskladite lastništvo in način z procesom gosta

Vnos unix-char lahko nastavi uid, gid in mode za vozlišče v vsebniku. Uporabite jih za ujemanje z računom, ki izvaja odjemalca VPN, namesto da bi napravo odprli vsem uporabnikom ali vsebnik preklopili v privilegirani način.

Vidnost ni isto kot dovoljenje. Vozlišče v lasti roota z načinom 600 je vidno storitvi, ki teče kot neprivilegiran uporabnik, in je vseeno ne more odpreti. Najprej preverite račun gosta, nato nastavite lastništvo na ta račun in držite način ne širši, kot ga odjemalec potrebuje.

Proces potrebuje tudi zmožnost konfiguriranja vmesnika tunela, običajno CAP_NET_ADMIN v imenskem prostoru omrežja vsebnika. Posredovanje naprave te zmožnosti ne da, dodelitev zmožnosti pa ne zagotovi naprave; to so neodvisne zahteve.

Vedite, česa vnos ne da

Vidno vozlišče ni delujoč VPN. Paket odjemalca je treba še namestiti, profil mora biti še vedno veljaven in storitev se mora še zagnati. Preverjanje pristnosti, poti in DNS ostajajo delo odjemalca, napaka tam pa ni dokaz, da je vnos naprave napačen.

systemd lahko doda še eno omejitev. Enota z DeviceAllow ali utrjeno politiko naprav lahko zavrne dostop do vozlišča, ki ga je zagotovil upravljavec vsebnikov. Preverite politiko naprav enote, ko vozlišče obstaja, a storitev poroča o napaki dovoljenja, in spremenite to politiko, namesto da razširite vsebnik.

Vroča priključitev je neobvezna in izrecna. Vnos z required=false potrebuje izvorno pot in se lahko pojavi ali izgine, ko se naprava gostitelja spreminja. Tak življenjski cikel ustreza strojni opremi, ki prihaja in odhaja; za napravo TUN, ki jo VPN potrebuje ob zagonu, lahko neobvezen vnos pusti storitev, da se zažene, preden pogoj obstaja.

Preverite vidnost, odpiranje in vmesnik v tem vrstnem redu

Najprej potrdite vozlišče v predvidenem vsebniku. Pot, glavna in stranska številka ter lastništvo se morajo ujemati z napravo gostitelja in z vnosom, ki ste ga dodali. Manjkajoče vozlišče pomeni, da upravljavec vnosa ni uporabil ali pa ga je uporabil na drugi instanci.

lxc exec vpnbox -- ls -l /dev/net/tun
lxc exec vpnbox -- sh -c 'test -c /dev/net/tun && echo char-device-ok'

Nato potrdite, da ga račun storitve lahko odpre. Kratek preizkus kot ta račun loči težavo z lastništvom od težave s storitvijo. Na koncu zaženite odjemalca in potrdite, da se pojavi vmesnik tunela; samo ta tretji korak dokaže celotno pot, ker prva dva lahko uspeta, medtem ko sta profil ali zmožnost odjemalca še vedno napačna.

Zabeležite instanco, oznako naprave, vir na gostitelju, pot v gostu in račun lastnika, ko je sprememba odobrena. Teh pet vrednosti mora poznejše ponovno ustvarjanje, migracija ali sprememba profila ohraniti, in veliko lažje jih je primerjati kot napako dovoljenja brez konteksta.

Sorodni članki