LXD tarjoaa isännän merkkilaitteen säiliölle lisäämällä laitesolmun, ei opettamalla vierasta luomaan sellaisen. Jos säiliössä ei ole /dev/net/tun, laite voi olla isännällä ja vieras voi silti jäädä ilman kykyä avata sitä. unix-char-merkintä on tämän polun hallinnoijan puolikas, ja se on tarkoituksella kapeampi kuin etuoikeutettu säiliö. Siksi isännän solmu ja säiliön solmu ansaitsevat erilliset tarkistukset.

Mekanismi on tarpeeksi lyhyt pidettäväksi näkyvissä: LXD ratkaisee isännän polun, luo vastaavan solmun instanssin sisään ja lisää laitteen säiliön laite-cgroupiin. Sen jälkeen vierasprosessi tarvitsee oman lupansa ja kykynsä käyttää solmua mihinkään.

Mitä unix-char-merkintä todella muuttaa

unix-char-laite kertoo LXD:lle, että yksi isännän merkkilaite tarjotaan valitulla polulla säiliön sisällä. Merkinnässä on kolme olennaista osaa: hallinnoijan käyttämä laitetunniste, polku source isännällä ja path, jonka vieras näkee. Vain kaksi viimeistä kuvaavat itse laitetta. Kirjoitusvirhe kummassa tahansa tuottaa solmun paikkaan, jota asiakas ei koskaan avaa.

Isännällä laite on tavallisesti /dev/net/tun. Säiliön sisällä voit pitää saman polun tai valita toisen, mutta polun on vastattava sitä, mitä VPN-asiakas odottaa. /dev/net/tun:n pitäminen välttää toisen kokoonpano-ongelman, koska useimmat asiakkaat avaavat tuon polun kysymättä.

Hallinnoija ottaa merkinnän käyttöön, kun instanssi käynnistyy tai kun laite kytketään kuumana. Se ei kopioi ajuria vieraaseen eikä luo tunneliliitäntää. Se tekee solmusta näkyvän ja sallii pääsyn säiliön laitevalvontaryhmän kautta.

Määrittele laite instanssilla, ei vieraan sisällä

Lisää merkintä LXD-hallintaympäristöstä ja nimeä instanssi sekä tunniste, jonka tunnistat myöhemmin. Säiliölle nimeltä vpnbox komento on:

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

Tunniste tun on paikallinen instanssin kokoonpanolle. Se ei ole liitännän nimi eikä sen tarvitse vastata mitään vieraan sisällä. Jos profiili jo tarjoaa saman laitteen, toinen merkintä aiheuttaa ristiriidan eikä redundanssia, joten tarkista ensin tehokas kokoonpano.

Tiedostojen muokkaaminen säiliön sisällä on väärä kerros. Käynnistysskriptin mknod voi näyttää toimivan etuoikeutetussa säiliössä ja kadota sitten uudelleenluonnissa tai epäonnistua vähemmän etuoikeutetussa. Hallinnoija omistaa instanssin laitejoukon; antakaa sen omistaa myös solmu.

Sovita omistus ja tila vierasprosessiin

unix-char-merkintä voi asettaa uid, gid ja mode säiliön sisällä olevalle solmulle. Käytä niitä vastaamaan tiliä, joka suorittaa VPN-asiakasta, sen sijaan että avaisit laitteen kaikille käyttäjille tai vaihtaisit säiliön etuoikeutettuun tilaan.

Näkyvyys ei ole sama kuin lupa. rootin omistama solmu tilassa 600 on näkyvä palvelulle, joka toimii etuoikeudettomana käyttäjänä, eikä se silti voi avata sitä. Tarkista ensin vieraan tili, aseta sitten omistus sille tilille ja pidä tila enintään niin väljänä kuin asiakas tarvitsee.

Prosessi tarvitsee myös kyvyn määrittää tunneliliitäntä, tavallisesti CAP_NET_ADMIN säiliön verkon nimiavaruudessa. Laitteen välittäminen ei anna tuota kykyä, eikä kyvyn antaminen toimita laitetta; ne ovat toisistaan riippumattomia vaatimuksia.

Tiedä, mitä merkintä ei anna

Näkyvä solmu ei ole toimiva VPN. Asiakaspaketti on yhä asennettava, profiilin on yhä oltava kelvollinen ja palvelun on yhä käynnistyttävä. Todennus, reitit ja DNS jäävät asiakkaan työksi, eikä siellä tapahtuva virhe ole todiste siitä, että laitemerkintä on väärä.

systemd voi lisätä toisen rajoituksen. Yksikkö, jossa on DeviceAllow tai koventunut laitekäytäntö, voi evätä pääsyn solmuun, jonka säiliön hallinnoija on toimittanut. Tarkista yksikön laitekäytäntö, kun solmu on olemassa mutta palvelu ilmoittaa lupavirheestä, ja muuta tuota käytäntöä sen sijaan että laajentaisit säiliötä.

Kuuma kytkentä on valinnainen ja nimenomainen. Merkintä, jossa on required=false, tarvitsee lähdepolun ja voi ilmestyä tai kadota isännän laitteen muuttuessa. Sellainen elinkaari sopii laitteistolle, joka tulee ja menee; TUN-laitteelle, jota VPN tarvitsee käynnistyksessä, valinnainen merkintä voi jättää palvelun käynnistymään ennen kuin sen edellytys on olemassa.

Tarkista näkyvyys, avaaminen ja liitäntä tässä järjestyksessä

Varmista ensin solmu aiotun säiliön sisällä. Polun, pää- ja sivunumeron ja omistuksen on vastattava isännän laitetta ja lisäämääsi merkintää. Puuttuva solmu tarkoittaa, että hallinnoija ei ottanut merkintää käyttöön tai otti sen käyttöön toisessa instanssissa.

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

Varmista seuraavaksi, että palvelutili voi avata sen. Lyhyt testi tuolla tilillä erottaa omistusongelman palveluongelmasta. Käynnistä lopuksi asiakas ja varmista, että tunneliliitäntä ilmestyy; vain tuo kolmas vaihe todistaa koko polun, koska kaksi ensimmäistä voivat onnistua, vaikka asiakasprofiili tai kyky on yhä väärä.

Kirjaa instanssi, laitetunniste, isännän lähde, vieraan polku ja omistava tili, kun muutos hyväksytään. Ne viisi arvoa ovat se, mitä myöhemmän uudelleenluonnin, siirron tai profiilimuutoksen on säilytettävä, ja niitä on paljon helpompi verrata kuin lupavirhettä ilman asiayhteyttä.

Aiheeseen liittyvät artikkelit