LXD konteineris negali atidaryti /dev/net/tun? Patikrinkite unix-char įrašą
LXD turi perduoti prieglobos TUN įrenginį konteineriui, kol VPN klientas gali jį naudoti. Pažiūrėkite, ką unix-char prideda, ko ne, ir kaip tai patikrinti.
LXD parodo prieglobos simbolinį įrenginį konteineriui pridėdamas įrenginio mazgą, o ne mokydamas svečią jį susikurti. Jei konteineryje nėra /dev/net/tun, įrenginys gali būti priegloboje, o svečias vis tiek negalės jo atidaryti. unix-char įrašas yra šio kelio valdytojo pusės pusė, ir jis sąmoningai siauresnis nei privilegijuotas konteineris. Todėl prieglobos mazgas ir konteinerio mazgas nusipelno atskirų patikrinimų.
Mechanizmas pakankamai trumpas, kad liktų akyse: LXD išsprendžia prieglobos kelią, sukuria atitinkamą mazgą egzemplioriaus viduje ir prideda įrenginį prie konteinerio įrenginių cgroup. Tada svečio procesui reikia savo leidimo ir gebėjimo naudoti mazgą bet kam.
Ką unix-char įrašas iš tikrųjų keičia
unix-char įrenginys liepia LXD parodyti vieną prieglobos simbolinį įrenginį pasirinktame kelyje konteinerio viduje. Įrašas turi tris svarbias dalis: valdytojo naudojamą įrenginio žymą, kelią source priegloboje ir path, kurį mato svečias. Tik paskutinės dvi apibūdina patį įrenginį. Rašybos klaida bet kurioje jų sukuria mazgą vietoje, kurios klientas niekada neatidaro.
Priegloboje įrenginys paprastai yra /dev/net/tun. Konteinerio viduje galite išlaikyti tą patį kelią arba pasirinkti kitą, bet kelias turi atitikti tai, ko tikisi VPN klientas. Išlaikius /dev/net/tun išvengiama antros konfigūracijos problemos, nes dauguma klientų tą kelią atidaro neprašydami.
Valdytojas įrašą taiko egzemplioriui startuojant arba įrenginį prijungiant karštai. Jis nenukopijuoja tvarkyklės į svečią ir nesukuria tunelio sąsajos. Jis padaro mazgą matomą ir leidžia prieigą per konteinerio įrenginių valdymo grupę.
Deklaruokite įrenginį egzemplioriuje, o ne svečio viduje
Pridėkite įrašą iš LXD administravimo konteksto, nurodydami egzempliorių ir žymą, kurią vėliau atpažinsite. Konteineriui pavadinimu vpnbox komanda yra:
lxc config device add vpnbox tun unix-char source=/dev/net/tun path=/dev/net/tun
lxc config device show vpnbox
Žyma tun yra vietinė egzemplioriaus konfigūracijai. Tai ne sąsajos pavadinimas ir ji neturi nieko atitikti svečio viduje. Jei profilis jau teikia tą patį įrenginį, antras įrašas sukuria konfliktą, o ne perteklių, todėl pirmiausia peržiūrėkite veiksmingą konfigūraciją.
Failų redagavimas konteinerio viduje yra netinkamas sluoksnis. mknod paleidimo scenarijuje gali atrodyti veikiantis privilegijuotame konteineryje, o paskui dingti kuriant iš naujo arba nepavykti mažiau privilegijuotame. Egzemplioriaus įrenginių rinkinys priklauso valdytojui; leiskite jam priklausyti ir mazgą.
Suderinkite nuosavybę ir režimą su svečio procesu
unix-char įrašas gali nustatyti uid, gid ir mode mazgui konteinerio viduje. Naudokite juos, kad atitiktų paskyrą, kuri paleidžia VPN klientą, o ne atidarytų įrenginį visiems naudotojams arba perjungtų konteinerį į privilegijuotą režimą.
Matomumas nėra tas pats, kas leidimas. root priklausantis mazgas su 600 režimu yra matomas tarnybai, veikiančiai kaip neprivilegijuotas naudotojas, ir vis tiek jos negali būti atidarytas. Pirmiausia patikrinkite svečio paskyrą, tada priskirkite nuosavybę tai paskyrai ir laikykite režimą ne platesnį, nei klientui reikia.
Procesui taip pat reikia gebėjimo konfigūruoti tunelio sąsają, paprastai CAP_NET_ADMIN konteinerio tinklo vardų erdvėje. Įrenginio perdavimas nesuteikia to gebėjimo, o gebėjimo suteikimas neaprūpina įrenginio; tai nepriklausomi reikalavimai.
Žinokite, ko įrašas nesuteikia
Matomas mazgas nėra veikiantis VPN. Kliento paketą dar reikia įdiegti, profilis dar turi būti galiojantis, o tarnyba dar turi startuoti. Autentifikavimas, maršrutai ir DNS lieka kliento darbas, o nesėkmė ten nėra įrodymas, kad įrenginio įrašas neteisingas.
systemd gali pridėti dar vieną apribojimą. Įrenginys su DeviceAllow arba sugriežtinta įrenginių politika gali uždrausti prieigą prie mazgo, kurį tiekė konteinerių valdytojas. Patikrinkite vieneto įrenginių politiką, kai mazgas egzistuoja, bet tarnyba praneša leidimo klaidą, ir pakeiskite tą politiką, o ne plėskite konteinerį.
Karštas prijungimas yra pasirenkamas ir aiškus. Įrašui su required=false reikia šaltinio kelio, ir jis gali atsirasti arba išnykti keičiantis prieglobos įrenginiui. Toks gyvavimo ciklas tinka kintančiai aparatūrai; TUN įrenginiui, kurio VPN reikia paleidžiant, pasirenkamas įrašas gali leisti tarnybai startuoti anksčiau, nei atsiras jos prielaida.
Patikrinkite matomumą, atidarymą ir sąsają tokia tvarka
Pirmiausia patvirtinkite mazgą numatytame konteineryje. Kelias, pagrindinis ir šalutinis numeriai bei nuosavybė turi atitikti prieglobos įrenginį ir įrašą, kurį pridėjote. Trūkstamas mazgas reiškia, kad valdytojas įrašo nepritaikė arba pritaikė kitam egzemplioriui.
lxc exec vpnbox -- ls -l /dev/net/tun
lxc exec vpnbox -- sh -c 'test -c /dev/net/tun && echo char-device-ok'
Tada patvirtinkite, kad tarnybos paskyra gali jį atidaryti. Trumpas bandymas ta paskyra atskiria nuosavybės problemą nuo tarnybos problemos. Galiausiai paleiskite klientą ir patvirtinkite, kad atsiranda tunelio sąsaja; tik šis trečias žingsnis įrodo visą kelią, nes pirmieji du gali praeiti, kol kliento profilis ar gebėjimas dar neteisingi.
Užrašykite egzempliorių, įrenginio žymą, prieglobos šaltinį, svečio kelią ir savininko paskyrą, kai pakeitimas patvirtinamas. Tie penki dydžiai yra tai, ką vėlesnis kūrimas iš naujo, migracija ar profilio keitimas turi išsaugoti, ir juos daug lengviau palyginti nei leidimo klaidą be konteksto.