LXD konteyneri /dev/net/tun qovşağını aça bilmir? unix-char qeydini yoxlayın
VPN klienti ondan istifadə etməzdən əvvəl LXD host TUN cihazını konteynerə ötürməlidir. unix-char nə əlavə edir, nə etmir və bunu necə yoxlamaq olar.
LXD host simvol cihazını konteynerə cihaz qovşağı əlavə etməklə təqdim edir, qonağı onu yaratmağı öyrətməklə deyil. Konteynerdə /dev/net/tun yoxdursa, cihaz hostda ola bilər və qonaq yenə də onu aça bilməz. unix-char qeydi bu yolun menecer tərəfindəki yarısıdır və bilərəkdən imtiyazlı konteynerdən daha dardır. Buna görə host qovşağı və konteyner qovşağı ayrı-ayrı yoxlamalara layiqdir.
Mexanizm gözdən itməyəcək qədər qısadır: LXD host yolunu həll edir, instansiya daxilində uyğun qovşaq yaradır və cihazı konteynerin cihaz cgroup-una əlavə edir. Sonra qonaq prosesi qovşağı hər hansı məqsədlə istifadə etmək üçün öz icazəsinə və qabiliyyətinə ehtiyac duyur.
unix-char qeydi əslində nəyi dəyişir
unix-char cihazı LXD-yə bir host simvol cihazını konteyner daxilində seçilmiş yolda təqdim etməyi tapşırır. Qeydin əhəmiyyətli üç hissəsi var: menecerin istifadə etdiyi cihaz etiketi, hostdakı source yolu və qonağın gördüyü path. Yalnız son ikisi cihazın özünü təsvir edir. Onlardan hər hansı birində yazı səhvi klientin heç vaxt açmadığı yerdə qovşaq yaradır.
Hostda cihaz adətən /dev/net/tun olur. Konteyner daxilində eyni yolu saxlaya və ya başqasını seçə bilərsiniz, amma yol VPN klientinin gözlədiyi ilə uyğun olmalıdır. /dev/net/tun saxlamaq ikinci konfiqurasiya probleminin qarşısını alır, çünki əksər klientlər o yolu soruşmadan açır.
Menecer qeydi instansiya başlayanda və ya cihaz isti qoşulanda tətbiq edir. O, qonağa sürücü köçürmür və tunel interfeysi yaratmır. Qovşağı görünən edir və konteynerin cihaz nəzarət qrupundan keçən girişə icazə verir.
Cihazı qonağın içində deyil, instansiyada elan edin
Qeydi LXD idarəetmə kontekstindən əlavə edin, instansiyanın adını və sonra tanıya biləcəyiniz etiketi göstərin. vpnbox adlı konteyner üçün əmr belədir:
lxc config device add vpnbox tun unix-char source=/dev/net/tun path=/dev/net/tun
lxc config device show vpnbox
Etiket tun yalnız instansiya konfiqurasiyasına aiddir. Bu, interfeys adı deyil və qonaqda hər hansı şeylə uyğunlaşmalı deyil. Profil artıq eyni cihazı təmin edirsə, ikinci qeyd əlavə etmək artıqlıq deyil, ziddiyyət yaradır, ona görə əvvəlcə effektiv konfiqurasiyaya baxın.
Konteyner daxilində faylları redaktə etmək yanlış qatdır. Başlanğıc skriptindəki mknod imtiyazlı konteynerdə işləyirmiş kimi görünə, sonra yenidən yaradılanda yox ola və ya daha az imtiyazlı birində uğursuz ola bilər. İnstansiyanın cihaz dəstinə menecer sahibdir; qovşağa da o sahib olsun.
Sahibliyi və rejimi qonaq prosesinə uyğunlaşdırın
unix-char qeydi konteyner daxilindəki qovşaq üçün uid, gid və mode təyin edə bilər. Onları VPN klientini işlədən hesaba uyğunlaşdırmaq üçün istifadə edin, cihazı hər istifadəçiyə açmaq və ya konteyneri imtiyazlı rejimə keçirmək əvəzinə.
Görünmə icazə ilə eyni şey deyil. root-a məxsus və rejimi 600 olan qovşaq imtiyazsız istifadəçi kimi işləyən xidmət üçün görünür, amma yenə də onun tərəfindən açıla bilmir. Əvvəlcə qonaq hesabını yoxlayın, sonra sahibliyi həmin hesaba təyin edin və rejimi klientin ehtiyacından geniş saxlamayın.
Proses həm də tunel interfeysini konfiqurasiya etmək qabiliyyətinə ehtiyac duyur, adətən konteynerin şəbəkə ad sahəsində CAP_NET_ADMIN. Cihazı ötürmək bu qabiliyyəti vermir, qabiliyyəti vermək isə cihazı təmin etmir; bunlar müstəqil tələblərdir.
Qeydin nəyi vermədiyini bilin
Görünən qovşaq işlək VPN demək deyil. Klient paketi hələ də quraşdırılmalı, profil hələ də etibarlı olmalı və xidmət hələ də başlamalıdır. Autentifikasiya, marşrutlar və DNS klientin işi olaraq qalır və oradakı uğursuzluq cihaz qeydinin səhv olduğuna dəlil deyil.
systemd başqa məhdudiyyət əlavə edə bilər. DeviceAllow olan və ya sərtləşdirilmiş cihaz siyasəti olan vahid konteyner menecerinin təmin etdiyi qovşağa girişi rədd edə bilər. Qovşaq mövcud olduqda, amma xidmət icazə xətası bildirdikdə vahidin cihaz siyasətini yoxlayın və konteyneri genişləndirmək əvəzinə o siyasəti dəyişin.
İsti qoşulma istəyə bağlı və açıqdır. required=false olan qeyd mənbə yolu tələb edir və host cihazı dəyişdikcə görünə və ya itə bilər. Bu həyat dövrü gəlib-gedən avadanlığa uyğundur; VPN-in yüklənmə zamanı ehtiyac duyduğu TUN cihazı üçün istəyə bağlı qeyd xidmətin ilkin şərti hələ yox ikən başlamasına səbəb ola bilər.
Görünməni, açılışı və interfeysi bu ardıcıllıqla yoxlayın
Əvvəlcə nəzərdə tutulan konteyner daxilində qovşağı təsdiqləyin. Yol, böyük və kiçik nömrələr və sahiblik host cihazına və əlavə etdiyiniz qeydə uyğun olmalıdır. Qovşağın olmaması menecerin qeydi tətbiq etmədiyini və ya onu başqa instansiyaya tətbiq etdiyini göstərir.
lxc exec vpnbox -- ls -l /dev/net/tun
lxc exec vpnbox -- sh -c 'test -c /dev/net/tun && echo char-device-ok'
Sonra xidmət hesabının onu aça bildiyini təsdiqləyin. Həmin hesabla qısa sınaq sahiblik problemini xidmət problemindən ayırır. Nəhayət, klienti başladın və tunel interfeysinin göründüyünü təsdiqləyin; yalnız bu üçüncü addım bütün yolu sübut edir, çünki ilk iki addım keçə bilər, halbuki klient profili və ya qabiliyyəti hələ də səhvdir.
Dəyişiklik təsdiqlənəndə instansiyanı, cihaz etiketini, host mənbəyini, qonaq yolunu və sahib hesabı qeyd edin. Bu beş dəyər sonrakı yenidən yaratma, miqrasiya və ya profil dəyişikliyinin qorumalı olduğu şeylərdir və kontekstsiz icazə xətasından qat-qat asan müqayisə olunur.