/dev/net/tun mungon ndërsa tun është i ngarkuar: rregullo nyjen e pajisjes
Një modul tun i ngarkuar nuk vërteton se nyja e pajisjes ekziston. Ndani drejtuesin nga nyja, rindërtojeni sipas radhës dhe verifikojeni me një ndërfaqe.
OpenVPN ndalon me një ankesë errno 2 për /dev/net/tun ndërsa lsmod rendit qetësisht modulin tun. Të dyja faktet janë të vërteta në të njëjtën kohë. Moduli ofron një drejtues, dhe rruga që hap klienti është një nyje pajisjeje që diçka tjetër duhet të krijojë. Trajtimi i tyre si një objekt i vetëm është arsyeja pse rregullimi i dukshëm i ringarkimit të modulit nuk ndryshon absolutisht asgjë.
Dy objekte, dy pronarë të ndryshëm
Një modul kerneli dhe një nyje pajisjeje janë objekte të pavarura me cikle jete të pavarura. Ngarkimi i modulit regjistron një drejtues, dhe në një sistem me devtmpfs kerneli kërkon që nyja përkatëse të krijohet. Në një sistem pa devtmpfs asgjë nuk krijon asgjë, dhe drejtuesi qëndron atje pa asnjë rrugë që tregon drejt tij. Moduli mund të jetë i ngarkuar, i shëndetshëm dhe plotësisht i paarritshëm përmes sistemit të skedarëve në të njëjtin moment.
Prandaj teksti i gabimit dhe lista e moduleve nuk kundërshtojnë njëri-tjetrin. Klienti hap një rrugë, rruga nuk ekziston, dhe kerneli kthen ENOENT përpara se drejtuesi tun të pyetet fare. Ringarkimi i modulit nuk mund të rregullojë një rrugë që mungon, dhe krijimi i rrugës nuk mund të rregullojë një drejtues që mungon.
lsmod | grep -w tun
stat -c "%F %t:%T" /dev/net/tun
grep " /dev " /proc/mounts
devtmpfs kundrejt një mknod të qartë
Zakonisht dy mekanizma e krijojnë atë nyje, dhe të dish cili duhet të jetë përgjegjës të thotë çfarë të rregullosh. devtmpfs lejon kernelin të krijojë nyje pajisjesh në një instancë të montuar, dhe udev aplikon pronësinë dhe lejet mbi to. Një mknod i qartë është rruga manuale për imazhet dhe hapësirat e emrave ku asnjëri prej tyre nuk ekzekutohet në nisje.
Krahasoni rezultatet, jo qëllimet. Nëse devtmpfs është i montuar në /dev dhe nyja ende mungon, drejtuesi nuk është ai që supozoni, ose diçka e hoqi nyjen pas nisjes. Nëse /dev është një drejtori e zakonshme brenda një rootfs të shpaketuar, nuk ekziston asnjë mekanizëm automatik dhe ai që ndërton imazhin duhet të krijojë nyjen.
stat -c "%F major=%t minor=%T" /dev/net/tun
# expect: character special file major=a minor=c8
Aty ku nuk ekzekutohet asnjëri prej mekanizmave, nyja duhet bërë me dorë, dhe radha ka rëndësi. Krijo fillimisht drejtorinë prind, sepse mknod nuk mund ta shpikë, pastaj pajisjen e karaktereve, pastaj një modalitet që e lë të shkrueshme vetëm për root. Ringarko modulin përpara se të krijosh nyjen, dhe hiq një rrugë ekzistuese vetëm pasi ls të ketë treguar se është drejtori dhe jo pajisje.
sudo modprobe tun
sudo mkdir -p /dev/net
sudo mknod /dev/net/tun c 10 200
sudo chmod 600 /dev/net/tun
ls -l /dev/net/tun
Diskriminuesi më i shpejtë është lloji që raporton stat dhe një drejtori në atë rrugë është surpriza më e zakonshme në imazhet minimale. Një mkdir me qëllim të mirë në një Dockerfile lë pikërisht atë, dhe asnjë sasi e ngarkimit të moduleve nuk zëvendëson një drejtori me një pajisje karakteresh. Major 10 me minor 200 është çifti i regjistruar për tun, i shprehur në heksadecimal si a dhe c8.
Katër gjurmë, katër shkaqe
Katër shkaqe shpjegojnë pothuajse çdo rast, dhe secili lë një gjurmë të ndryshme në regjistrat. Filloni nga mjedisi i nisjes. Imazhet pa disk, bordat e integruara dhe fazat initramfs shpesh nuk montojnë as devtmpfs as një /devtë menaxhuar nga udev, kështu që asnjë proces nuk e shkruan kurrë nyjen. Më pas lexoni opsionet e montimit të asaj që strehon /dev, sepse nodev lejon që rruga të ekzistojë ndërsa refuzon ta hapë, dhe një montim bind i marrë nga një host i forcëzuar e mban flamurin pa u lajmëruar. Një montim vetëm-lexim dështon më herët dhe më fort: mknod atje kthen EROFS, ndërsa EPERM do të thotë se procesit i mungon aftësia dhe jo se sistemi i skedarëve mbron veten. Së fundi, një runtime kontejnerësh me /dev tmpfs të vetin kërkon që nyja të injektohet në hapësirën e vet të emrave, dhe cgroup-i i pajisjeve të tij duhet të lejojë çiftin major dhe minor.
Kontrolloni shtresën e politikës përpara se të ndryshoni përsëri lejet. SELinux dhe AppArmor mund të refuzojnë një hapje që çdo atribut skedari e lejon, dhe ai refuzim shfaqet në regjistrin e auditimit dhe jo në daljen e klientit. Një ndryshim lejeje që nuk shfaqet kurrë në një refuzim është kohë e shpenzuar në shtresën plotësisht të gabuar.
sudo journalctl -k -n 20 --no-pager
sudo ausearch -m AVC -ts recent | tail -5
Vërtetojeni me një ndërfaqe, jo me një listë
Një listë e suksesshme vërteton se një rrugë ekziston dhe asgjë më shumë. Hapni një nyje tun të shëndetshme për lexim dhe thirrja kthehet me gabim, sepse pajisja nuk ka semantikë leximi dhe nuk është skedar i zakonshëm. Ai gabim është këtu sinjali i suksesit, dhe njohja e tij ju pengon ta ndiqni si defekt.
head -c 1 /dev/net/tun
head: error reading '/dev/net/tun': File descriptor in bad state
Testi vendimtar krijon një ndërfaqe, sepse ushtron drejtuesin, nyjen dhe privilegjet tuaja në një hap të vetëm. Nëse shtimi ka sukses dhe lidhja shfaqet, të tre funksionojnë. Kur dështon, errno i ndan shkaqet: ENOENT do të thotë se nuk ka nyje të përdorshme, EPERM tregon aftësinë, flamujt e montimit ose politikën, dhe EBUSY do të thotë se një proces tjetër e zotëron tashmë ndërfaqen.
sudo ip tuntap add dev tun7 mode tun
ip -brief link show tun7
sudo ip tuntap del dev tun7 mode tun
Ekzekutoni atë test në kontekstin që dështon vërtet, sepse një njësi shërbimi, një kontejner ose një punë e planifikuar mund të mbajë një grup aftësish të ndryshëm nga shell-i juaj i hyrjes. Një test që kalon në kontekstin e gabuar nuk vërteton asgjë për atë që dështon.
Kur pajisja nuk është problemi
Nëse testi i ndërfaqes ka sukses dhe klienti ende dështon, problemi i mbetur është profili, konteksti i shërbimit ose rruga, dhe pajisja është në rregull. Ky është momenti për të ndaluar së redaktuarit e nyjeve të pajisjeve, sepse ndryshimet e mëtejshme shtojnë vetëm distancë nga një sistem që funksionon.
Ekzekutoni të njëjtat pesë kontrolle çdo herë në vend që të shpikni një të re: a është moduli i ngarkuar pa një modul rival, a është rruga një pajisje karakteresh me major dhe minor të saktë, a janë opsionet e montimit të pastra, a e mban konteksti i procesit aftësinë, dhe a ka një refuzim politike në vulën kohore të dështimit. Një defekt që i mbijeton të pesë nuk është problem pajisjeje, çfarëdo që përmend mesazhi.