OpenVPN a Docker no pot obrir /dev/net/tun: què falta
Un node TUN i la capacitat de xarxa són dos permisos separats. Obriu-los tots dos i després llegiu l’error següent segons les seves pròpies condicions en lloc de repetir la mateixa solució.
Les imatges de contenidor poden portar tots els binaris i fitxers de configuració d’OpenVPN que necessiten i tot i així fallar a la primera crida de xarxa. L’error anomena /dev/net/tun perquè l’aplicació va demanar al nucli una interfície TUN i el contenidor no tenia ni el node de dispositiu ni la capacitat de crear-ne un. Són dos permisos separats, i arreglar-ne un deixa l’altre exactament on era.
Separar-los costa una ordre per a cadascun. El missatge d’error posterior us diu a quina frontera estàveu realment.
El node de dispositiu i la capacitat són dues portes
El node de dispositiu és un objecte del sistema de fitxers, així que un contenidor l’ha de veure dins del seu propi espai de noms de muntatge. La capacitat és un permís, així que el procés necessita CAP_NET_ADMIN a l’espai de noms on es crearà la interfície. Passar el dispositiu sense la capacitat us dona un node que s’obre i un ioctl que falla. Atorgar la capacitat sense el dispositiu deixa l’aplicació incapaç d’obrir res, i per això els dos solen aparèixer junts als exemples.
La configuració devices de Docker mapa el dispositiu de l’amfitrió dins del contenidor, mentre que cap_add ajusta el conjunt de capacitats. Un bind mount del mateix camí posa el fitxer a la vista sense aplicar la semàntica d’accés al dispositiu.
Reproduïu-ho fora del fitxer Compose
Abans d’editar el servei, comproveu que l’amfitrió té el dispositiu i que un contenidor nu pot crear una interfície. L’ordre de sota és deliberadament mínima, i la seva única finalitat és separar un problema de l’amfitrió d’un problema de compose. Si falla, cap canvi de compose ajudarà.
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'
Un node absent a l’amfitrió significa que el mòdul tun no està disponible, cosa que és una correcció del costat de l’amfitrió i no del contenidor. Un node que existeix però no es pot obrir dins del contenidor apunta a l’accés al dispositiu, i el missatge dirà permission denied en lloc de no such file. L’ordre d’aquests dos errors és tot el diagnòstic. Anoteu quin heu vist abans de canviar una opció.
Els errors posteriors a TUN són problemes diferents
Quan la interfície apareix, la següent fallada té un altre propietari. Els errors d’autenticació volen dir que el túnel va arribar al servidor i les credencials van ser rebutjades, així que els canvis de capacitat no ajudaran. Un túnel que s’estableix mentre les aplicacions encara fallen apunta a rutes, reenviament, resolució DNS dins del contenidor o la pròpia disposició de xarxa del contenidor. Cadascuna és una pregunta de xarxa ordinària que el permís TUN no pot respondre. Repetir la prova original després de cada canvi evita que les fallades es fusionin en una sola impressió.
Copiar cada paràmetre d’un exemple que funciona és com una correcció mínima es converteix en una definició de servei il·legible. Porteu només els que aquest desplegament necessita i anoteu per què és cadascun.
Verifiqueu la interfície dins del contenidor
Comproveu la interfície i el conjunt de capacitats des de dins del contenidor en execució i no des de l’amfitrió. Les ordres de sota mostren el node de dispositiu, la llista de capacitats i si es pot crear una interfície. Executeu-les al mateix contenidor que executa el client, i instal·leu les eines si la imatge és mínima.
ls -l /dev/net/tun
capsh --print | grep -i net_admin
ip link add dev tun9 type tun && ip link show tun9
Una capacitat present al bounding set però absent de l’effective set es comporta de manera diferent d’una que mai no s’ha atorgat, i capsh mostra les dues. Si el node existeix i la capacitat hi és mentre la creació encara falla, l’entorn d’execució aplica una altra cosa, com un perfil seccomp o una política AppArmor que restringeix l’operació. Aquesta és una tercera frontera, documentada per l’entorn d’execució i no per l’aplicació.
Anoteu els indicadors del contenidor, la imatge i l’error exacte de cada intent. La propera persona que llegeixi aquesta nota podrà dir quina porta estava tancada sense repetir tota la investigació.