LXD konteiner ei ava /dev/net/tun? Kontrollige unix-char-kirjet
LXD peab hosti TUN-seadme konteinerisse edasi andma, enne kui VPN-klient saab seda kasutada. Vaadake, mida unix-char lisab, mida mitte, ja kuidas seda kontrollida.
LXD teeb hosti märgiseadme konteinerile kättesaadavaks seadmesõlme lisamisega, mitte külalisele selle loomise õpetamisega. Kui konteineris pole /dev/net/tun, võib seade hostis olemas olla ja külaline ei pruugi seda ikkagi avada. unix-char-kirje on selle tee haldajapoolne pool ja see on meelega kitsam kui privilegeeritud konteiner. Seetõttu väärib hosti sõlm ja konteineri sõlm eraldi kontrolle.
Mehhanism on piisavalt lühike, et seda silme ees hoida: LXD lahendab hosti tee, loob eksemplari sees vastava sõlme ja lisab seadme konteineri seadmecgroup'i. Seejärel vajab külalisprotsess oma luba ja võimet, et sõlme millekski kasutada.
Mida unix-char-kirje tegelikult muudab
unix-char-seade ütleb LXD-le, et see teeks ühe hosti märgiseadme konteineris valitud teel kättesaadavaks. Kirjel on kolm olulist osa: haldaja kasutatav seadmesilt, tee source hostis ja path, mida külaline näeb. Ainult kaks viimast kirjeldavad seadet ennast. Trükiviga kummaski neist loob sõlme kohta, mida klient kunagi ei ava.
Hostis on seade tavaliselt /dev/net/tun. Konteineri sees võite jätta sama tee või valida teise, kuid tee peab vastama sellele, mida VPN-klient ootab. /dev/net/tun hoidmine väldib teist konfiguratsiooniprobleemi, sest enamik kliente avab selle tee küsimata.
Haldaja rakendab kirjet eksemplari käivitamisel või seadme kuumpistiku korral. See ei kopeeri draiverit külalisesse ega loo tunneliliidest. See muudab sõlme nähtavaks ja lubab juurdepääsu konteineri seadmete kontrollrühma kaudu.
Deklareerige seade eksemplaril, mitte külalise sees
Lisage kirje LXD halduskontekstist, nimetades eksemplari ja sildi, mille hiljem ära tunnete. Konteineri nimega vpnbox jaoks on käsk:
lxc config device add vpnbox tun unix-char source=/dev/net/tun path=/dev/net/tun
lxc config device show vpnbox
Silt tun on kohalik eksemplari konfiguratsiooni jaoks. See ei ole liidese nimi ja see ei pea külalises millegagi sobima. Kui profiil juba pakub sama seadet, tekitab teine kirje konflikti, mitte liiasust, seega vaadake esmalt üle kehtiv konfiguratsioon.
Failide muutmine konteineri sees on vale kiht. Alguskriptis olev mknod võib privilegeeritud konteineris näidata toimivat, seejärel uuestiloomisel kaduda või vähem privilegeeritud konteineris ebaõnnestuda. Eksemplari seadmete kogum kuulub haldajale; las see kuulub ka sõlmele.
Sobitage omand ja režiim külalisprotsessiga
unix-char-kirje saab konteineri sees sõlme jaoks määrata uid, gid ja mode. Kasutage neid, et need vastaksid kontole, mis VPN-klienti käivitab, selle asemel et avada seade kõigile kasutajatele või lülitada konteiner privilegeeritud režiimi.
Nähtavus ei ole sama mis luba. rootile kuuluv sõlm režiimiga 600 on nähtav teenusele, mis töötab mitteprivilegeeritud kasutajana, ja seda ei saa see teenus ikkagi avada. Kontrollige esmalt külalise kontot, seejärel määrake omand sellele kontole ja hoidke režiim mitte laiem, kui klient vajab.
Protsess vajab ka võimet tunneliliidest konfigureerida, tavaliselt CAP_NET_ADMIN konteineri võrgu nimeruumis. Seadme edasiandmine ei anna seda võimet ja võime andmine ei anna seadet; need on sõltumatud nõuded.
Tea, mida kirje ei anna
Nähtav sõlm ei ole töötav VPN. Kliendipakett tuleb ikkagi paigaldada, profiil peab ikkagi kehtima ja teenus peab ikkagi käivituma. Autentimine, marsruudid ja DNS jäävad kliendi tööks ning sealne tõrge ei ole tõestus, et seadmekirje on vale.
systemd võib lisada veel ühe piirangu. Üksus, millel on DeviceAllow või karastatud seadmepoliitika, võib keelduda juurdepääsust sõlmele, mille konteineri haldaja on esitanud. Kontrollige üksuse seadmepoliitikat, kui sõlm on olemas, kuid teenus teatab loa veast, ja muutke seda poliitikat, mitte laiendage konteinerit.
Kuumpistik on valikuline ja selgesõnaline. Kirje required=false-ga vajab allikateed ja võib ilmuda või kaduda, kui hosti seade muutub. Selline elutsükkel sobib riistvarale, mis tuleb ja läheb; TUN-seadme jaoks, mida VPN vajab käivitamisel, võib valikuline kirje jätta teenuse käivituma enne, kui selle eeldus on olemas.
Kontrollige nähtavust, avamist ja liidest selles järjekorras
Esmalt kinnitage sõlm kavandatud konteineri sees. Tee, peamine ja kõrvalnumber ning omand peaksid vastama hosti seadmele ja teie lisatud kirjele. Puuduv sõlm tähendab, et haldaja ei rakendanud kirjet või rakendas seda teisele eksemplarile.
lxc exec vpnbox -- ls -l /dev/net/tun
lxc exec vpnbox -- sh -c 'test -c /dev/net/tun && echo char-device-ok'
Seejärel kinnitage, et teenusekonto saab selle avada. Lühike test selle kontoga eristab omandiprobleemi teenuseprobleemist. Lõpuks käivitage klient ja kinnitage, et tunneliliides ilmub; ainult see kolmas samm tõestab kogu tee, sest kaks esimest võivad õnnestuda, samal ajal kui kliendiprofiil või võime on ikkagi vale.
Kirjutage üles eksemplar, seadmesilt, hosti allikas, külalise tee ja omav konto, kui muudatus kinnitatakse. Need viis väärtust on see, mida hilisem uuestiloomine, migreerimine või profiilimuudatus peab säilitama, ja neid on palju lihtsam võrrelda kui kontekstita loa viga.