Konteineru attēli var saturēt visas nepieciešamās OpenVPN binārās un konfigurācijas datnes un tomēr neizdoties pirmajā tīkla izsaukumā. Kļūda nosauc /dev/net/tun, jo lietojumprogramma lūdza kodolam TUN saskarni, un konteineram nebija ne ierīces mezgla, ne iespējas to izveidot. Tās ir divas atsevišķas atļaujas, un vienas labošana atstāj otru tieši tur, kur tā bija.

Lai tās atdalītu, vajadzīga viena komanda katrai. Turpmākais kļūdas ziņojums pasaka, pie kuras robežas jūs patiešām stāvējāt.

Ierīces mezgls un iespēja ir divas durvis

Ierīces mezgls ir failu sistēmas objekts, tāpēc konteineram tas jāredz savā montēšanas nosaukumu telpā. Iespēja ir atļauja, tāpēc procesam vajadzīgs CAP_NET_ADMIN nosaukumu telpā, kurā tiks izveidota saskarne. Nododot ierīci bez iespējas, jūs iegūstat mezglu, kas atveras, un ioctl, kas neizdodas. Dodot iespēju bez ierīces, lietojumprogramma nevar atvērt neko, tāpēc piemēros abas parasti parādās kopā.

Docker devices iestatījums kartē resursdatora ierīci konteinerī, bet cap_add pielāgo iespēju kopu. Tā paša ceļa bind mount parāda datni, nepiemērojot ierīces piekļuves semantiku.

Reproducējiet to ārpus Compose datnes

Pirms pakalpojuma rediģēšanas pārbaudiet, vai resursdatoram ir ierīce un vai kails konteiners var izveidot saskarni. Tālāk dotā komanda ir apzināti minimāla, un tās vienīgais mērķis ir atdalīt resursdatora problēmu no compose problēmas. Ja tā neizdodas, neviens compose labojums nepalīdzē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'

Mezgla trūkums resursdatorā nozīmē, ka tun modulis nav pieejams, un tas ir resursdatora, nevis konteinera puses labojums. Mezgls, kas pastāv, bet konteinerā nevar tikt atvērts, norāda uz ierīces piekļuvi, un ziņojums teiks permission denied, nevis no such file. Šo divu neveiksmju secība ir visa diagnostika. Pierakstiet, kuru redzējāt, pirms maināt jebkuru karodziņu.

Kļūdas pēc TUN ir citas problēmas

Tiklīdz saskarne parādās, nākamajai neveiksmei ir cits īpašnieks. Autentifikācijas kļūdas nozīmē, ka tunelis sasniedza serveri un akreditācijas dati tika noraidīti, tāpēc iespēju izmaiņas nepalīdzēs. Tunelis, kas tiek izveidots, kamēr lietojumprogrammas joprojām neizdodas, norāda uz maršrutiem, pārsūtīšanu, DNS atrisināšanu konteinerī vai paša konteinera tīkla izkārtojumu. Katrs no tiem ir parasts tīkla jautājums, uz kuru TUN atļauja nevar atbildēt. Sākotnējā testa atkārtošana pēc katras izmaiņas neļauj neveiksmēm saplūst vienā iespaidā.

Katra iestatījuma kopēšana no strādājoša piemēra ir ceļš, kā minimāls labojums kļūst par neizlasāmu pakalpojuma definīciju. Pārņemiet tikai tos, kas nepieciešami šai izvietošanai, un pierakstiet, kāpēc katrs ir.

Pārbaudiet saskarni konteinerī

Pārbaudiet saskarni un iespēju kopu no darbojošā konteinera iekšpuses, nevis no resursdatora. Tālāk dotās komandas parāda ierīces mezglu, iespēju sarakstu un to, vai saskarni vispār var izveidot. Izpildiet tās tajā pašā konteinerā, kurā darbojas klients, un instalējiet rīkus, ja attēls ir minimāls.

ls -l /dev/net/tun
capsh --print | grep -i net_admin
ip link add dev tun9 type tun && ip link show tun9

Iespēja, kas ir bounding set, bet nav effective set, uzvedas citādi nekā tā, kas nekad nav piešķirta, un capsh parāda abas. Ja mezgls pastāv un iespēja ir, bet izveide joprojām neizdodas, izpildlaiks uzspiež ko citu, piemēram, seccomp profilu vai AppArmor politiku, kas ierobežo darbību. Tā ir trešā robeža, ko dokumentē izpildlaiks, nevis lietojumprogramma.

Pierakstiet konteinera karodziņus, attēlu un katra mēģinājuma precīzo kļūdu. Nākamā persona, kas izlasīs šo piezīmi, varēs pateikt, kuras durvis bija aizvērtas, neatkārtojot visu izmeklēšanu.

Saistītie raksti