OpenVPN Docker konteineryje negali atidaryti /dev/net/tun: ko trūksta
TUN mazgas ir tinklo galimybė yra du atskiri leidimai. Atidarykite abu ir tada skaitykite kitą klaidą pagal jos pačios sąlygas, o ne kartodami tą pačią pataisą.
Konteineriai gali turėti visus reikiamus OpenVPN dvejetainius ir konfigūracijos failus ir vis tiek nepavykti per pirmąjį tinklo kvietimą. Klaida nurodo /dev/net/tun, nes programa paprašė branduolio TUN sąsajos, o konteineris neturėjo nei įrenginio mazgo, nei galimybės jį sukurti. Tai du atskiri leidimai, ir pataisius vieną kitas lieka lygiai ten, kur buvo.
Jų atskyrimui reikia po vieną komandą kiekvienam. Tolesnis klaidos pranešimas pasako, prie kurios ribos iš tikrųjų stovėjote.
Įrenginio mazgas ir galimybė yra dvejos durys
Įrenginio mazgas yra failų sistemos objektas, todėl konteineris turi jį matyti savo prijungimo vardų erdvėje. Galimybė yra leidimas, todėl procesui reikia CAP_NET_ADMIN vardų erdvėje, kurioje bus sukurta sąsaja. Perduodant įrenginį be galimybės gaunamas mazgas, kuris atsidaro, ir ioctl, kuris nepavyksta. Suteikus galimybę be įrenginio, programa negali atidaryti nieko, todėl pavyzdžiuose abu paprastai pasirodo kartu.
Docker devices nustatymas atvaizduoja pagrindinio kompiuterio įrenginį konteineryje, o cap_add koreguoja galimybių rinkinį. To paties kelio bind mount parodo failą netaikant įrenginio prieigos semantikos.
Atkurkite tai už Compose failo ribų
Prieš redaguodami paslaugą patikrinkite, ar pagrindiniame kompiuteryje yra įrenginys ir ar plikas konteineris gali sukurti sąsają. Toliau pateikta komanda tyčia minimali, o vienintelis jos tikslas – atskirti pagrindinio kompiuterio problemą nuo compose problemos. Jei ji nepavyksta, jokia compose pataisa nepadės.
ls -l /dev/net/tun
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun:/dev/net/tun alpine sh -c 'apk add -q iproute2 && ip tuntap add dev tun9 mode tun && ip link show tun9'
Nėra mazgo pagrindiniame kompiuteryje – tun modulis neprieinamas, tai pagrindinio kompiuterio, o ne konteinerio pusės pataisa. Egzistuojantis, bet konteineryje neatidaromas mazgas rodo į įrenginio prieigą, ir pranešimas sakys permission denied, o ne no such file. Šių dviejų nesėkmių tvarka yra visa diagnozė. Užsirašykite, kurią matėte, prieš keisdami bet kokią vėliavėlę.
Klaidos po TUN yra kitos problemos
Kai tik pasirodo sąsaja, kita nesėkmė turi kitą savininką. Autentifikavimo klaidos reiškia, kad tunelis pasiekė serverį ir kredencialai buvo atmesti, todėl galimybių pakeitimai nepadės. Tunelis, kuris užmezgamas, o programos vis dar nepavyksta, rodo maršrutus, persiuntimą, DNS sprendimą konteinerio viduje arba paties konteinerio tinklo išdėstymą. Kiekvienas iš jų yra įprastas tinklo klausimas, į kurį TUN leidimas negali atsakyti. Pradinio testo kartojimas po kiekvieno pakeitimo neleidžia nesėkmėms susilieti į vieną įspūdį.
Kiekvieno nustatymo kopijavimas iš veikiančio pavyzdžio yra kelias, kuriuo minimali pataisa tampa neįskaitoma paslaugos apibrėžtimi. Perkelkite tik tuos, kurių reikia šiam diegimui, ir užrašykite, kodėl kiekvienas yra.
Patikrinkite sąsają konteinerio viduje
Patikrinkite sąsają ir galimybių rinkinį iš veikiančio konteinerio vidaus, o ne iš pagrindinio kompiuterio. Toliau pateiktos komandos rodo įrenginio mazgą, galimybių sąrašą ir ar apskritai galima sukurti sąsają. Vykdykite jas tame pačiame konteineryje, kuriame veikia klientas, ir įdiekite įrankius, jei atvaizdas minimalus.
ls -l /dev/net/tun
capsh --print | grep -i net_admin
ip link add dev tun9 type tun && ip link show tun9
Galimybė, esanti bounding set, bet nesanti effective set, elgiasi kitaip nei ta, kuri niekada nebuvo suteikta, ir capsh rodo abi. Jei mazgas egzistuoja ir galimybė yra, o kūrimas vis tiek nepavyksta, vykdymo aplinka primeta ką nors kita, pavyzdžiui, seccomp profilį arba AppArmor taisyklę, kuri riboja operaciją. Tai trečia riba, kurią dokumentuoja vykdymo aplinka, o ne programa.
Užrašykite konteinerio vėliavėles, atvaizdą ir tikslią kiekvieno bandymo klaidą. Kitas žmogus, perskaitęs tą užrašą, galės pasakyti, kurios durys buvo uždarytos, nekartodamas viso tyrimo.