OpenVPN errno 2 kexarekin gelditzen da, /dev/net/tun buruz, bitartean lsmod tun modulua lasai zerrendatzen duela. Bi gertaerak aldi berean dira egiazkoak. Moduluak kontrolatzailea ematen du, eta bezeroak irekitzen duen bidea beste zerbait sortu behar duen gailu-nodo bat da. Biak objektu bakar gisa tratatzea da modulua berriz kargatzeko konponbide begi-bistakoak ezer aldatzen ez duen arrazoia.

Bi objektu, bi jabe desberdin

Kernel-modulu bat eta gailu-nodo bat objektu independenteak dira, bizi-ziklo independenteekin. Modulua kargatzean kontrolatzaile bat erregistratzen da, eta devtmpfs duen sistema batean kernelak dagokion nodoa sortzeko eskatzen du. devtmpfs ez duen sistema batean ezerk ez du ezer sortzen, eta kontrolatzailea han geratzen da hara seinalatzen duen biderik gabe. Modulua kargatuta, osasuntsu eta fitxategi-sistemaren bidez erabat iristezina egon daiteke aldi berean.

Horregatik errore-testuak eta modulu-zerrendak ez diote elkarri kontraesaten. Bezeroak bide bat irekitzen du, bidea ez da existitzen, eta kernelak ENOENT itzultzen du tun kontrolatzaileari inoiz galdetu aurretik. Modulua berriz kargatzeak ezin du falta den bide bat konpondu, eta bidea sortzeak ezin du falta den kontrolatzaile bat konpondu.

lsmod | grep -w tun
stat -c "%F %t:%T" /dev/net/tun
grep " /dev " /proc/mounts

devtmpfs mknod esplizituaren aurka

Normalean bi mekanismok sortzen dute nodo hori, eta zein den erantzulea jakiteak zer konpondu esaten dizu. devtmpfs-ek kernelak muntatutako instantzia batean gailu-nodoak sor ditzan egiten du, eta udev-ek jabetza eta baimenak jartzen dizkie gainean. mknod esplizitua irudi eta izen-espazioetarako eskuzko bidea da, non bietako bat ere ez den abioan exekutatzen.

Konparatu emaitzak, ez asmoak. devtmpfs /dev -n muntatuta badago eta nodoa oraindik falta bada, kontrolatzailea ez da zu suposatzen ari zarena, edo zerbait-ek nodoa kendu zuen abioaren ondoren. /dev rootfs deskonprimitu baten barruko direktorio arrunta bada, ez dago mekanismo automatikorik eta irudia eraikitzen duenak nodoa sortu behar du.

stat -c "%F major=%t minor=%T" /dev/net/tun
# expect: character special file major=a minor=c8

Bi mekanismoetako bat ere exekutatzen ez den lekuan, nodoa eskuz egin behar da, eta ordena garrantzitsua da. Sortu lehenengo guraso-direktorioa, mknod ezin baitu asmatu, gero karaktere-gailua, gero root-ek bakarrik idazteko moduko modu bat. Kargatu modulua berriro nodoa sortu aurretik, eta kendu existitzen den bide bat ls direktorioa dela eta ez gailua erakutsi ondoren soilik.

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

Modurik azkarrena stat -k ematen duen mota da; bide horretan direktorio bat egotea da irudi minimaletan ohikoena den ezustekoa. Asmo oneko mkdir batek horixe uzten du Dockerfile batean, eta moduluak kargatzeak ez du direktorio bat karaktere-gailu batekin ordezkatzen. Major 10 eta minor 200 tun-aren bikote erregistratua dira, hexadezimalean a eta c8 bezala adierazita.

Lau arrasto, lau arrazoi

Lau arrazolek ia kasu guztiak azaltzen dituzte, eta bakoitzak arrasto desberdina uzten du erregistroetan. Hasi abio-ingurunetik. Diskorik gabeko irudiek, txertatutako plakek eta initramfs faseek sarritan ez dute ez devtmpfs ez udev-k kudeatutako /devmuntatzen, beraz prozesu batek ere ez du inoiz nodoa idazten. Gero irakurri /devostatatzen duenaren muntatze-aukerak, nodev -k bidea existitzea baimendu baina irekitzea ukatzen baitu, eta host gogortu batetik hartutako bind muntatzeak bandera darama bere burua iragarri gabe. Irakurtzeko soilik den muntatzeak lehenago eta ozenago egiten du huts: mknod -k EROFS itzultzen du han, eta EPERM-ek prozesuak gaitasuna falta duela esan nahi du, ez fitxategi-sistemak bere burua babesten duenik. Azkenik, bere /dev tmpfs duen edukiontzi-runtime batek nodoa bere izen-espazioan txertatzea behar du, eta bere gailu-cgroup-ak major eta minor bikotea baimendu behar du.

Egiaztatu politika-geruza baimenak berriro aldatu aurretik. SELinux-ek eta AppArmor-ek fitxategi-atributu guztiek baimentzen duten irekiera bat uka dezakete, eta ukapen hori auditoretza-erregistroan agertzen da, ez bezeroaren irteeran. Ukapen batean inoiz agertzen ez den baimen-aldaketa erabat geruza okerrean emandako denbora da.

sudo journalctl -k -n 20 --no-pager
sudo ausearch -m AVC -ts recent | tail -5

Froga ezazu interfaze batekin, ez zerrenda batekin

Zerrenda arrakastatsu batek bide bat existitzen dela frogatzen du eta ez gehiago. Ireki tun nodo osasuntsu bat irakurtzeko eta deia errore batekin itzultzen da, gailuak irakurketa-semantikarik ez duelako eta ez delako fitxategi arrunta. Errore hori arrakasta-seinalea da hemen, eta hura ezagutzeak akats gisa atzetik ez ibiltzea eragozten dizu.

head -c 1 /dev/net/tun
head: error reading '/dev/net/tun': File descriptor in bad state

Proba erabakigarriak interfaze bat sortzen du, kontrolatzailea, nodoa eta zure pribilegioak urrats bakarrean probatzen dituelako. Gehiketa lortzen bada eta esteka agertzen bada, hirurak funtzionatzen dute. Huts egiten duenean, errno-k arrazoiak bereizten ditu: ENOENT-ek erabilgarri den nodorik ez dagoela esan nahi du, EPERM-ek gaitasuna, muntatze-bandera edo politika seinalatzen ditu, eta EBUSY-k beste prozesu batek interfazea jadanik daukala.

sudo ip tuntap add dev tun7 mode tun
ip -brief link show tun7
sudo ip tuntap del dev tun7 mode tun

Exekutatu proba hori benetan huts egiten duen testuinguruan, zerbitzu-unitate batek, edukiontzi batek edo programatutako lan batek zure saio-shellak baino gaitasun-multzo desberdina eraman baitezake. Testuinguru okerrean pasatzen den probak ez du ezer frogatzen huts egiten duenaz.

Gailua arazoa ez denean

Interfaze-proba lortzen bada eta bezeroak oraindik huts egiten badu, gainerako arazoa profila, zerbitzu-testuingurua edo ibilbidea da, eta gailua ondo dago. Hori da gailu-nodoak editatzeari uzteko unea, aldaketa gehiagok sistema funtzionatzen duenetik urruntzea besterik ez baitute gehitzen.

Exekutatu bost egiaztapen berak aldi bakoitzean, berri bat asmatu beharrean: modulua kargatuta dago alderik gabeko modulurik gabe, bidea karaktere-gailua da major eta minor zuzenekin, muntatze-aukerak garbi daude, prozesu-testuinguruak gaitasuna darama, eta politika-ukapenik ba al dago hutsegitearen denbora-zigiluan. Bostak gainditzen dituen akatsa ez da gailu-arazoa, mezuak zer aipatzen duen ere.

Erlazionatutako artikuluak