OpenVPN në Docker nuk mund të hapë /dev/net/tun: çfarë mungon
Nyja TUN dhe aftësia e rrjetit janë dy leje të ndara. Hapini të dyja dhe më pas lexoni gabimin tjetër sipas kushteve të tij, në vend që të përsërisni të njëjtin rregullim.
Imazhet e kontejnerëve mund të mbajnë çdo binar dhe skedar konfigurimi të OpenVPN që u nevojitet dhe prapë të dështojnë në thirrjen e parë të rrjetit. Gabimi përmend /dev/net/tun sepse aplikacioni i kërkoi kernelit një ndërfaqe TUN dhe kontejneri nuk kishte as nyjën e pajisjes as aftësinë për të krijuar një. Këto janë dy leje të ndara, dhe rregullimi i njërës e lë tjetrën pikërisht aty ku ishte.
Ndarja e tyre kërkon një komandë për secilën. Mesazhi i gabimit pas kësaj ju tregon se në cilin kufi qëndronit në të vërtetë.
Nyja e pajisjes dhe aftësia janë dy dyer
Nyja e pajisjes është objekt i sistemit të skedarëve, prandaj një kontejner duhet ta shohë në hapësirën e vet të emrave të montimit. Aftësia është leje, prandaj procesi ka nevojë për CAP_NET_ADMIN në hapësirën e emrave ku do të krijohet ndërfaqja. Kalimi i pajisjes pa aftësinë ju jep një nyje që hapet dhe një ioctl që dështon. Dhënia e aftësisë pa pajisjen e lë aplikacionin të pafuqishëm të hapë çfarëdo, prandaj të dyja zakonisht shfaqen bashkë në shembuj.
Cilësimi devices i Docker e harton pajisjen e hostit brenda kontejnerit, ndërsa cap_add rregullon grupin e aftësive. Një bind mount i të njëjtës rrugë e vendos skedarin në pamje pa zbatuar semantikën e aksesit të pajisjes.
Riprodhojeni jashtë skedarit Compose
Përpara se të modifikoni shërbimin, kontrolloni që hosti e ka pajisjen dhe që një kontejner i zhveshur mund të krijojë një ndërfaqe. Komanda më poshtë është qëllimisht minimale, dhe qëllimi i vetëm i saj është të ndajë një problem të hostit nga një problem i compose. Nëse dështon, asnjë ndryshim në compose nuk do të ndihmojë.
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'
Një nyje që mungon në host do të thotë që moduli tun nuk është i disponueshëm, gjë që është rregullim nga ana e hostit dhe jo e kontejnerit. Një nyje që ekziston por nuk hapet brenda kontejnerit tregon aksesin e pajisjes, dhe mesazhi do të thotë permission denied në vend të no such file. Radha e këtyre dy dështimeve është e gjithë diagnoza. Shkruani cilën patë, përpara se të ndryshoni ndonjë flamur.
Gabimet pas TUN janë probleme të tjera
Sapo shfaqet ndërfaqja, dështimi tjetër ka pronar tjetër. Gabimet e vërtetimit tregojnë se tuneli arriti te serveri dhe kredencialet u refuzuan, prandaj ndryshimet e aftësisë nuk do të ndihmojnë. Një tunel që vendoset ndërsa aplikacionet ende dështojnë tregon rrugë, përcjellje, zgjidhje DNS brenda kontejnerit ose vetë strukturën e rrjetit të kontejnerit. Secila prej tyre është një pyetje e zakonshme rrjeti të cilës leja TUN nuk mund t'i përgjigjet. Përsëritja e provës origjinale pas çdo ndryshimi i pengon dështimet të shkrihen në një përshtypje të vetme.
Kopjimi i çdo cilësimi nga një shembull që funksionon është mënyra se si një rregullim minimal bëhet një përkufizim shërbimi i palexueshëm. Sillni vetëm ato që i nevojiten këtij vendosjeje dhe shkruani pse është secili aty.
Verifikoni ndërfaqen brenda kontejnerit
Kontrolloni ndërfaqen dhe grupin e aftësive nga brenda kontejnerit që po ekzekutohet dhe jo nga hosti. Komandat më poshtë tregojnë nyjën e pajisjes, listën e aftësive dhe nëse mund të krijohet fare një ndërfaqe. Ekzekutojini në të njëjtin kontejner që ekzekuton klientin, dhe instaloni mjetet nëse imazhi është minimal.
ls -l /dev/net/tun
capsh --print | grep -i net_admin
ip link add dev tun9 type tun && ip link show tun9
Një aftësi e pranishme në bounding set por që mungon në effective set sillet ndryshe nga një që nuk është dhënë kurrë, dhe capsh i tregon të dyja. Nëse nyja ekziston dhe aftësia është aty ndërsa krijimi ende dështon, mjedisi i ekzekutimit po imponon diçka tjetër, si një profil seccomp ose një politikë AppArmor që kufizon operacionin. Ky është një kufi i tretë, i dokumentuar nga mjedisi i ekzekutimit dhe jo nga aplikacioni.
Shkruani flamujt e kontejnerit, imazhin dhe gabimin e saktë të çdo përpjekjeje. Personi tjetër që lexon atë shënim mund të thotë cila derë ishte e mbyllur pa përsëritur të gjithë hetimin.