OpenVPN en Docker non pode abrir /dev/net/tun: que falta
Un nodo TUN e a capacidade de rede son dous permisos separados. Abra ambos e despois lea o seguinte erro nos seus propios termos en lugar de repetir a mesma solución.
As imaxes de contedor poden levar todos os binarios e ficheiros de configuración de OpenVPN que necesitan e aínda así fallar na primeira chamada de rede. O erro nomea /dev/net/tun porque a aplicación pediu ao núcleo unha interface TUN e o contedor non tiña nin o nodo de dispositivo nin a capacidade de crear un. Son dous permisos separados, e arranxar un deixa o outro exactamente onde estaba.
Separaos custa un comando a cada un. A mensaxe de erro posterior dille en que fronteira estaba realmente.
O nodo de dispositivo e a capacidade son dúas portas
O nodo de dispositivo é un obxecto do sistema de ficheiros, así que un contedor necesita velo no seu propio espazo de nomes de montaxe. A capacidade é un permiso, así que o proceso necesita CAP_NET_ADMIN no espazo de nomes onde se creará a interface. Pasar o dispositivo sen a capacidade dálle un nodo que se abre e un ioctl que falla. Conceder a capacidade sen o dispositivo deixa a aplicación incapaz de abrir nada de nada, e por iso os dous adoitan aparecer xuntos nos exemplos.
A configuración devices de Docker mapea o dispositivo do host dentro do contedor, mentres que cap_add axusta o conxunto de capacidades. Un bind mount da mesma ruta pon o ficheiro á vista sen aplicar a semántica de acceso ao dispositivo.
Reproduzao fóra do ficheiro Compose
Antes de editar o servizo, comprobe que o host ten o dispositivo e que un contedor espido pode crear unha interface. O comando de abaixo é deliberadamente mínimo, e o seu único propósito é separar un problema do host dun problema de compose. Se falla, ningún cambio de compose axudará.
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 nodo ausente no host significa que o módulo tun non está dispoñible, o que é unha corrección do lado do host e non do contedor. Un nodo que existe pero non se pode abrir dentro do contedor apunta ao acceso ao dispositivo, e a mensaxe dirá permission denied en lugar de no such file. A orde deses dous fallos é todo o diagnóstico. Anote cal viu antes de cambiar unha opción.
Os erros posteriores a TUN son problemas distintos
En canto aparece a interface, o seguinte fallo ten outro dono. Os erros de autenticación significan que o túnel chegou ao servidor e as credenciais foron rexeitadas, así que os cambios de capacidade non axudarán. Un túnel que se establece mentres as aplicacións seguen fallando apunta a rutas, reenvío, resolución DNS dentro do contedor ou a propia disposición de rede do contedor. Cada unha desas é unha pregunta de rede ordinaria que o permiso TUN non pode responder. Repetir a proba orixinal despois de cada cambio evita que os fallos se fusionen nunha soa impresión.
Copiar cada axuste dun exemplo que funciona é como unha corrección mínima se converte nunha definición de servizo ilexible. Traia só os que este despregamento necesita e anote por que está cada un.
Verifique a interface dentro do contedor
Comprobe a interface e o conxunto de capacidades desde dentro do contedor en execución e non desde o host. Os comandos de abaixo mostran o nodo de dispositivo, a lista de capacidades e se se pode crear unha interface. Execúteos no mesmo contedor que executa o cliente, e instale as ferramentas se a imaxe é mínima.
ls -l /dev/net/tun
capsh --print | grep -i net_admin
ip link add dev tun9 type tun && ip link show tun9
Unha capacidade presente no bounding set pero ausente do effective set compórtase de forma distinta a unha que nunca se concedeu, e capsh mostra ambas. Se o nodo existe e a capacidade está aí mentres a creación segue fallando, a contorna de execución impón outra cousa, como un perfil seccomp ou unha política AppArmor que restrinxe a operación. Esa é unha terceira fronteira, documentada pola contorna de execución e non pola aplicación.
Anote os indicadores do contedor, a imaxe e o erro exacto de cada intento. A próxima persoa que lea esa nota poderá saber que porta estaba pechada sen repetir toda a investigación.