LXD konteiners nevar atvērt /dev/net/tun? Pārbaudiet unix-char ierakstu
LXD ir jānodod resursdatora TUN ierīce konteineram, pirms VPN klients to var izmantot. Apskatiet, ko unix-char pievieno, ko ne, un kā to pārbaudīt.
LXD dara resursdatora rakstzīmju ierīci pieejamu konteineram, pievienojot ierīces mezglu, nevis mācot viesim to izveidot. Ja konteinerā nav /dev/net/tun, ierīce var būt resursdatorā, un viesis to tomēr nevarēs atvērt. unix-char ieraksts ir šī ceļa pārvaldītāja puses puse, un tas apzināti ir šaurāks par priviliģētu konteineru. Tāpēc resursdatora mezgls un konteinera mezgls ir pelnījuši atsevišķas pārbaudes.
Mehānisms ir pietiekami īss, lai to noturētu acu priekšā: LXD atrisina resursdatora ceļu, izveido atbilstošu mezglu instances iekšienē un pievieno ierīci konteinera ierīču cgroup. Pēc tam viesa procesam ir vajadzīga sava atļauja un spēja, lai mezglu kaut kam izmantotu.
Ko unix-char ieraksts patiešām maina
unix-char ierīce liek LXD atklāt vienu resursdatora rakstzīmju ierīci izvēlētā ceļā konteinera iekšienē. Ierakstam ir trīs svarīgas daļas: pārvaldītāja lietotā ierīces etiķete, ceļš source resursdatorā un path, ko redz viesis. Tikai pēdējās divas apraksta pašu ierīci. Ievades kļūda jebkurā no tām rada mezglu vietā, kuru klients nekad neatver.
Resursdatorā ierīce parasti ir /dev/net/tun. Konteinera iekšienē varat saglabāt to pašu ceļu vai izvēlēties citu, bet ceļam jāatbilst tam, ko gaida VPN klients. /dev/net/tun saglabāšana izvairās no otras konfigurācijas problēmas, jo lielākā daļa klientu šo ceļu atver bez jautāšanas.
Pārvaldītājs ierakstu piemēro, kad instance startē vai kad ierīce tiek karsti pievienota. Tas neiekopē draiveri viesī un neizveido tuneļa saskarni. Tas padara mezglu redzamu un atļauj piekļuvi caur konteinera ierīču vadības grupu.
Deklarējiet ierīci instancē, nevis viesa iekšienē
Pievienojiet ierakstu no LXD administrēšanas konteksta, nosaucot instanci un etiķeti, ko vēlāk atpazīsiet. Konteineram ar nosaukumu vpnbox komanda ir:
lxc config device add vpnbox tun unix-char source=/dev/net/tun path=/dev/net/tun
lxc config device show vpnbox
Etiķete tun ir lokāla instances konfigurācijai. Tā nav saskarnes nosaukums, un tai nav jāatbilst nekam viesī. Ja profils jau nodrošina to pašu ierīci, otrs ieraksts rada konfliktu, nevis dublējumu, tāpēc vispirms apskatiet efektīvo konfigurāciju.
Failu rediģēšana konteinera iekšienē ir nepareizais slānis. mknod starta skriptā var šķist strādājam priviliģētā konteinerā un pēc tam pazust atkārtotā izveidē vai neizdoties mazāk priviliģētā. Pārvaldītājam pieder instances ierīču kopa; lai tam pieder arī mezgls.
Saskaņojiet īpašumtiesības un režīmu ar viesa procesu
unix-char ieraksts var iestatīt uid, gid un mode mezglam konteinera iekšienē. Izmantojiet tos, lai atbilstu kontam, kas palaiž VPN klientu, tā vietā lai atvērtu ierīci visiem lietotājiem vai pārslēgtu konteineru priviliģētā režīmā.
Redzamība nav tas pats, kas atļauja. Mezgls, kas pieder root ar režīmu 600, ir redzams pakalpojumam, kas darbojas kā nepriviliģēts lietotājs, un to tomēr nevar atvērt. Vispirms pārbaudiet viesa kontu, pēc tam piešķiriet īpašumtiesības šim kontam un turiet režīmu ne plašāku, nekā klientam nepieciešams.
Procesam ir vajadzīga arī spēja konfigurēt tuneļa saskarni, parasti CAP_NET_ADMIN konteinera tīkla nosaukumu telpā. Ierīces nodošana nedod šo spēju, un spējas došana nenodrošina ierīci; tie ir neatkarīgi nosacījumi.
Ziniet, ko ieraksts nedod
Redzams mezgls nav strādājošs VPN. Klienta pakotne vēl jāinstalē, profilam vēl jābūt derīgam, un pakalpojumam vēl jāsāk. Autentifikācija, maršruti un DNS paliek klienta darbs, un kļūme tur nav pierādījums, ka ierīces ieraksts ir nepareizs.
systemd var pievienot vēl vienu ierobežojumu. Vienība ar DeviceAllow vai stingrāku ierīču politiku var liegt piekļuvi mezglam, ko nodrošinājis konteineru pārvaldītājs. Pārbaudiet vienības ierīču politiku, kad mezgls pastāv, bet pakalpojums ziņo atļaujas kļūdu, un mainiet šo politiku, nevis paplašiniet konteineru.
Karstā pievienošana ir neobligāta un skaidra. Ierakstam ar required=false ir vajadzīgs avota ceļš, un tas var parādīties vai pazust, mainoties resursdatora ierīcei. Šāds dzīves cikls der aparatūrai, kas nāk un iet; TUN ierīcei, kas VPN vajadzīga startēšanas laikā, neobligāts ieraksts var ļaut pakalpojumam startēt pirms tā priekšnosacījuma pastāvēšanas.
Pārbaudiet redzamību, atvēršanu un saskarni šādā secībā
Vispirms apstipriniet mezglu paredzētajā konteinerā. Ceļam, galvenajam un mazākajam numuram un īpašumtiesībām jāatbilst resursdatora ierīcei un pievienotajam ierakstam. Trūkstošs mezgls nozīmē, ka pārvaldītājs ierakstu nav piemērojis vai ir piemērojis citai instancei.
lxc exec vpnbox -- ls -l /dev/net/tun
lxc exec vpnbox -- sh -c 'test -c /dev/net/tun && echo char-device-ok'
Pēc tam apstipriniet, ka pakalpojuma konts to var atvērt. Īss tests ar šo kontu atdala īpašumtiesību problēmu no pakalpojuma problēmas. Visbeidzot startējiet klientu un apstipriniet, ka parādās tuneļa saskarne; tikai šis trešais solis pierāda visu ceļu, jo pirmie divi var izdoties, kamēr klienta profils vai spēja vēl ir nepareiza.
Kad izmaiņas tiek apstiprinātas, pierakstiet instanci, ierīces etiķeti, resursdatora avotu, viesa ceļu un īpašnieka kontu. Šīs piecas vērtības ir tas, kas vēlākai atkārtotai izveidei, migrācijai vai profila maiņai jāsaglabā, un tās ir daudz vieglāk salīdzināt nekā atļaujas kļūdu bez konteksta.