OpenVPN u Dockeru ne može otvoriti /dev/net/tun: šta nedostaje
TUN čvor i mrežna sposobnost dva su odvojena dopuštenja. Otvorite oba, a zatim čitajte sljedeću grešku pod njenim vlastitim uslovima umjesto da ponavljate isto rješenje.
Kontejnerske slike mogu nositi svaki OpenVPN binarni i konfiguracijski fajl koji im treba i ipak pasti na prvom mrežnom pozivu. Greška imenuje /dev/net/tun jer je aplikacija tražila TUN interfejs od kernela, a kontejner nije imao ni čvor uređaja ni sposobnost da ga stvori. To su dva odvojena dopuštenja, a popravka jednog ostavlja drugo tačno tamo gdje je bilo.
Razdvajanje zahtijeva po jednu komandu za svako. Poruka o grešci nakon toga vam kaže na kojoj ste granici zapravo stajali.
Čvor uređaja i sposobnost su dvoja vrata
Čvor uređaja je objekat datotečnog sistema, pa ga kontejner mora vidjeti u svom vlastitom mount namespace-u. Sposobnost je dopuštenje, pa proces treba CAP_NET_ADMIN u namespace-u u kojem će interfejs biti stvoren. Prosljeđivanje uređaja bez sposobnosti daje vam čvor koji se otvara i ioctl koji ne uspijeva. Davanje sposobnosti bez uređaja ostavlja aplikaciju nesposobnom otvoriti bilo šta, zbog čega se oboje obično pojavljuje zajedno u primjerima.
Dockerova postavka devices mapira host uređaj u kontejner, dok cap_add prilagođava skup sposobnosti. Bind mount iste putanje stavlja fajl u vidno polje bez primjene semantike pristupa uređaju.
Reproducirajte to izvan Compose fajla
Prije uređivanja servisa provjerite da host ima uređaj i da goli kontejner može stvoriti interfejs. Komanda ispod je namjerno minimalna i njena jedina svrha je odvojiti problem hosta od problema compose. Ako ne uspije, nikakva izmjena compose-a neće pomoći.
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'
Nedostatak čvora na hostu znači da modul tun nije dostupan, što je popravka na strani hosta, a ne kontejnera. Čvor koji postoji ali se ne može otvoriti unutar kontejnera upućuje na pristup uređaju, a poruka će reći permission denied umjesto no such file. Redoslijed te dvije greške je cijela dijagnoza. Zapišite koju ste vidjeli prije nego promijenite zastavicu.
Greške nakon TUN-a su različiti problemi
Kad se interfejs pojavi, sljedeći neuspjeh ima drugog vlasnika. Greške autentifikacije znače da je tunel stigao do servera i da su vjerovanja odbijena, pa promjene sposobnosti neće pomoći. Tunel koji se uspostavi dok aplikacije i dalje padaju upućuje na rute, prosljeđivanje, DNS razrješavanje unutar kontejnera ili vlastiti mrežni raspored kontejnera. Svako od toga je obično mrežno pitanje na koje TUN dopuštenje ne može odgovoriti. Ponavljanje izvornog testa nakon svake promjene sprječava da se neuspjesi stope u jedan dojam.
Kopiranje svake postavke iz radnog primjera je način na koji minimalna popravka postaje nečitljiva definicija servisa. Prenesite samo one koje ovo postavljanje treba i zabilježite zašto je svaka tu.
Provjerite interfejs unutar kontejnera
Provjerite interfejs i skup sposobnosti iz unutrašnjosti pokrenutog kontejnera, a ne sa hosta. Komande ispod prikazuju čvor uređaja, listu sposobnosti i to može li se interfejs uopće stvoriti. Pokrenite ih u istom kontejneru koji pokreće klijent i instalirajte alate ako je slika minimalna.
ls -l /dev/net/tun
capsh --print | grep -i net_admin
ip link add dev tun9 type tun && ip link show tun9
Sposobnost prisutna u bounding set-u ali odsutna iz effective set-a ponaša se drugačije od one koja nikada nije dodijeljena, a capsh prikazuje obje. Ako čvor postoji i sposobnost je tu, a stvaranje i dalje ne uspijeva, runtime nameće nešto drugo, poput seccomp profila ili AppArmor politike koja ograničava operaciju. To je treća granica koju dokumentira runtime, a ne aplikacija.
Zabilježite zastavice kontejnera, sliku i tačnu grešku svakog pokušaja. Sljedeća osoba koja pročita tu bilješku može reći koja su vrata bila zatvorena bez ponavljanja cijele istrage.