El servicio arranca, un cliente se asocia y nunca aparece una ruta en el lado del servidor. O el daemon se niega a arrancar y nombra un comando que no pudo ejecutar. Ambos desenlaces siguen las mismas tres líneas, que suelen copiarse juntas de una guía de endurecimiento: pasar a una cuenta sin privilegios, quitar el grupo y cambiar la raíz del sistema de archivos. Solo una de las tres oculta archivos, y solo una de ellas elimina el privilegio de cambiar la tabla de rutas. Separarlas es cómo aprendes qué línea quieres en realidad.

Qué quita la jaula que el daemon todavía necesita

El cambio de raíz ocurre después del arranque, así que el daemon conserva todo lo que ya abrió y pierde todo lo que abriría después. Cualquier ayudante que la conexión ejecute a partir de ese punto tiene que existir dentro de la nueva raíz, junto con las bibliotecas compartidas que carga. Una jaula construida con un archivo de configuración y un certificado no tiene ninguna de las dos cosas.

Pasar a una cuenta sin privilegios es una restricción aparte. Un proceso que ha renunciado a root puede ser incapaz de alterar rutas o de levantar una interfaz incluso cuando el binario está justo ahí, así que los dos fallos deben diagnosticarse por separado.

Tres condiciones deciden qué arreglo necesitas

La primera condición es cómo instala rutas tu compilación. Las versiones recientes de OpenVPN configuran la interfaz y la tabla de rutas en el proceso, mientras que los paquetes antiguos y las configuraciones propias dependen de herramientas externas o de scripts up y down. Si el registro nombra un comando, hay una herramienta externa implicada y la jaula la oculta. Si el registro muestra en cambio un error de permisos, el problema es la cuenta.

La segunda es el mantenimiento. Una jaula con binarios copiados hay que refrescarla cada vez que se actualiza el paquete que los proporciona, o la primera actualización deja un túnel roto detrás. La tercera es si un control concreto exige de verdad un chroot; si el requisito va en realidad sobre la separación de privilegios, el cambio de cuenta puede bastar por sí solo.

Signal in the logOther side of the boundaryRepair direction
Command not found after startupBinary and its libraries absent inside the new rootPopulate the jail, or drop the chroot line
Operation not permittedAccount lost the privilege to edit routesKeep the account privileged, or pre-create routes elsewhere
No such deviceJail lacks the tun device nodeCreate the node inside, or open it before the root change

Qué debe contener una jaula que funcione

Una jaula que ejecuta comandos necesita el binario, cada biblioteca contra la que enlaza y cualquier nodo de dispositivo que el daemon abra tarde. Copia las piezas y pruébalas sin la VPN en la imagen:

ldd /usr/sbin/ip
chroot /etc/openvpn/jail /sbin/ip route show
chroot /etc/openvpn/jail /sbin/ip link set tun0 up

El primer comando enumera las dependencias, y es el que la gente se salta. Un binario copiado que no encuentra una biblioteca falla con un mensaje distinto al de un binario ausente, y ambos parecen un fallo de OpenVPN cuando se leen desde el lado del cliente. Ejecutar el comando a mano dentro de la jaula reproduce el fallo sin reiniciar el servicio.

Copia también la configuración, los certificados y cualquier CRL dentro de la jaula, porque un archivo que el daemon espera releer después del arranque no se encontrará una vez cambiada la raíz. Anota lo que copiaste, ya que la siguiente actualización del paquete de red sustituye los originales y deja la jaula en la copia antigua.

Encoger el endurecimiento en su lugar

Si la jaula existe solo porque lo decía una guía, quitar esa única línea y conservar las restricciones de cuenta es un desenlace defendible. El daemon conserva su vista del sistema de archivos y pierde el problema, y la bajada de privilegios sigue quitando root del proceso de larga vida.

Apunta lo que queda, y por qué. Una configuración que perdió un control en silencio sin una nota es cómo deriva el endurecimiento, y la próxima auditoría preguntará por qué desapareció la línea.

Biseca las tres líneas antes de elegir

Copia la configuración, desactiva las tres directivas y confirma que un cliente se conecta y que aparecen las rutas esperadas. Reactiva después solo las líneas de cuenta, luego el chroot solo. El paso donde el túnel se rompe identifica la frontera, y evitas reconstruir una jaula que nunca fue la causa.

Cuando vuelva a enrutar, ejecuta una sesión de cliente con mayor verbosidad y lee la línea que nombra el comando o el permiso que falló. Esa línea vale más que el tiempo de espera que el cliente acaba informando.

Artículos relacionados