A konténerimage-ek hordozhatják az összes szükséges OpenVPN binárist és konfigurációs fájlt, és mégis elbukhatnak az első hálózati híváskor. A hiba a /dev/net/tun-t nevezi meg, mert az alkalmazás TUN-interfészt kért a kerneltől, és a konténernek sem eszközcsomópontja, sem létrehozási képessége nem volt. Ez két külön engedély, és az egyik javítása a másikat pontosan ott hagyja, ahol volt.

Kettéválasztásuk mindegyikhez egy-egy parancsot igényel. Az utána következő hibaüzenet megmondja, melyik határnál állt valójában.

Az eszközcsomópont és a képesség két ajtó

Az eszközcsomópont fájlrendszer-objektum, ezért a konténernek a saját mount-névterében kell látnia. A képesség engedély, ezért a folyamatnak CAP_NET_ADMIN-ra van szüksége abban a névtérben, ahol az interfész létrejön. Ha a képesség nélkül adja tovább az eszközt, olyan csomópontot kap, amely megnyílik, és egy ioctl-t, amely meghiúsul. Ha az eszköz nélkül adja meg a képességet, az alkalmazás semmit sem tud megnyitni, ezért a kettő a példákban általában együtt szerepel.

A Docker devices-beállítása leképezi a gazdagép eszközét a konténerbe, míg a cap_add a képességhalmazt igazítja. Ugyanazon útvonal bind mountja láthatóvá teszi a fájlt anélkül, hogy alkalmazná az eszközhozzáférés szemantikáját.

Reprodukálja a Compose-fájlon kívül

A szolgáltatás szerkesztése előtt ellenőrizze, hogy a gazdagépen megvan az eszköz, és hogy egy csupasz konténer létre tud hozni egy interfészt. Az alábbi parancs szándékosan minimális, és egyetlen célja a gazdagép-probléma elválasztása a compose-problémától. Ha meghiúsul, semmilyen compose-módosítás nem segít.

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'

A hiányzó csomópont a gazdagépen azt jelenti, hogy a tun modul nem érhető el, ami gazdagépoldali, nem konténeroldali javítás. Egy létező, de a konténerben meg nem nyitható csomópont eszközhozzáférésre utal, és az üzenet permission denied-et fog mondani a no such file helyett. A két hiba sorrendje maga a teljes diagnózis. Jegyezze fel, melyiket látta, mielőtt bármelyik kapcsolót átállítja.

A TUN utáni hibák más problémák

Amint megjelenik az interfész, a következő hiba más tulajdonosé. A hitelesítési hibák azt jelentik, hogy az alagút elérte a szervert, és a hitelesítő adatokat elutasították, ezért a képesség módosításai nem segítenek. Az az alagút, amely úgy jön létre, hogy az alkalmazások továbbra is elbuknak, útvonalakra, továbbításra, a konténeren belüli DNS-feloldásra vagy a konténer saját hálózati elrendezésére utal. Ezek mindegyike közönséges hálózati kérdés, amelyre a TUN-engedély nem tud válaszolni. Az eredeti teszt megismétlése minden változtatás után megakadályozza, hogy a hibák egyetlen benyomássá olvadjanak össze.

Ha minden beállítást egy működő példából másol át, abból lesz a minimális javításból olvashatatlan szolgáltatásdefiníció. Csak azokat vigye át, amelyekre ez az üzembe helyezés igényt tart, és jegyezze fel, miért van ott mindegyik.

Ellenőrizze az interfészt a konténeren belül

Ellenőrizze az interfészt és a képességhalmazt a futó konténer belsejéből, nem a gazdagépről. Az alábbi parancsok megmutatják az eszközcsomópontot, a képességlistát és azt, hogy egyáltalán létrehozható-e interfész. Futtassa őket ugyanabban a konténerben, amely a klienst futtatja, és telepítse az eszközöket, ha az image minimális.

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

A bounding setben jelen lévő, de az effective setből hiányzó képesség másként viselkedik, mint amelyet soha nem adtak meg, és a capsh mindkettőt mutatja. Ha a csomópont létezik és a képesség is megvan, a létrehozás mégis meghiúsul, akkor a futtatókörnyezet valami mást kényszerít, például egy seccomp-profilt vagy egy AppArmor-szabályzatot, amely korlátozza a műveletet. Ez egy harmadik határ, amelyet a futtatókörnyezet dokumentál, nem az alkalmazás.

Jegyezze fel a konténer kapcsolóit, az image-et és az egyes kísérletek pontos hibáját. A következő ember, aki elolvassa ezt a feljegyzést, meg tudja mondani, melyik ajtó volt zárva anélkül, hogy megismételné az egész vizsgálatot.

Kapcsolódó cikkek