SSD Nodes Learn
Guías Matt ConnorPor Matt Connor · Actualizado 2026-07-24

instalar y asegurar Webmin en Ubuntu 24.04

Guía para instalar Webmin en Ubuntu 24.04 y proteger el puerto 10000 usando SSH tunnels, certificados Let's Encrypt, 2FA y Fail2ban para evitar intrusiones.

Qué vas a construir

Webmin es un panel de control web que proporciona una interfaz de navegador para un servidor Linux completo: usuarios, paquetes, cron jobs, el firewall, Apache, BIND, discos y otros cien módulos, accesibles mediante HTTPS en el puerto 10000. La instalación consiste en tres comandos y tarda aproximadamente un minuto. La razón por la que esta guía se centra principalmente en la segunda mitad es que Webmin inicia sesión como root y puede realizar cualquier acción que root pueda hacer. Un Webmin sin autenticación o con acceso abierto no es "un riesgo que gestionar"; es un compromiso total del servidor con una página de inicio de sesión delante. Por tanto, instálalo en diez minutos y dedica el resto de la hora a asegurar que solo tú puedas acceder a él.

Requisitos previos y una advertencia importante

Un VPS KVM con Ubuntu 24.04 recién instalado y acceso como root o un usuario con sudo. Webmin utiliza Perl y es ligero; 1 GB de RAM es suficiente y consume menos de un cuarto de GB en reposo. Escucha en el puerto TCP 10000 mediante su propio servidor web integrado (miniserv.pl), no utiliza Apache ni nginx, por lo que no es necesario instalar nada adicional previamente.

Debe decidir dos cosas antes de comenzar. Primero, la cuenta con la que iniciará sesión: Webmin se autentica mediante cuentas Unix a través de PAM, por lo que iniciará sesión como root o un usuario en el grupo sudo utilizando la contraseña de Unix de dicha cuenta. Las imágenes de nube suelen usar únicamente llaves SSH y no tienen contraseña configurada para el usuario por defecto; Webmin no puede iniciar sesión en una cuenta sin contraseña. Configure una contraseña con sudo passwd youruser primero, de lo contrario el inicio de sesión fallará sin importar lo que escriba.

Segundo, y esta es la advertencia: no se limite a abrir el puerto 10000 al internet y abandone el proceso. Decida ahora si accederá a Webmin mediante un túnel SSH (recomendado, sin exposición) o si lo restringirá a su propia IP. Esta decisión determina cada paso siguiente, así que lea ambas opciones antes de configurar el firewall.

Instalar Webmin desde el repositorio oficial

Webmin publica un repositorio apt firmado. El script de configuración añade el repositorio y su clave de firma GPG. Esto permite que las futuras ejecuciones de apt upgrade descarguen Webmin como cualquier otro paquete. Así se obtienen actualizaciones autenticadas en lugar de un .deb descargado que no se parchea automáticamente.

curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.sh

El script muestra las acciones que va a realizar y pregunta Setup repository? (y/N) — responda y. Cuando termine, instale el paquete. El flag --install-recommends descarga las dependencias comunes de Perl y SSL para evitar errores de librerías faltantes en módulos individuales.

sudo apt-get install --install-recommends webmin

Webmin ha cambiado el nombre de este script anteriormente — las guías antiguas mencionan setup-repos.sh — por lo que si la URL devuelve un error 404, obtenga el comando de una sola línea directamente desde webmin.com/download en lugar de usar un nombre fijo. Una instalación correcta termina con una línea como Webmin install complete. You can now login to https://your-host:10000/ as root. El servicio está habilitado y en ejecución, la configuración se encuentra en /etc/webmin, los logs de peticiones están en /var/webmin/miniserv.log y los intentos de inicio de sesión fallidos se envían a syslog — en Ubuntu 24.04, al journal de systemd.

Confirme que el servicio esté activo y escuchando antes de abrir un navegador:

sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000

Debe obtener un estado active (running) y una línea que muestre miniserv.pl vinculado a 0.0.0.0:10000 — esa dirección cambiará a 127.0.0.1:10000 al usar la ruta de túnel descrita abajo. Si ss no muestra nada en el puerto 10000, Webmin no se inició; revise journalctl -u webmin -n 50 antes de continuar.

Primer inicio de sesión y la advertencia del certificado

Acceda desde su navegador a https://YOUR_SERVER_IP:10000. En una instalación nueva ocurren dos cosas.

Si ufw está activo —la imagen de servidor de Ubuntu viene con él desactivado, pero muchos proveedores lo preconfiguran— la página no cargará; esto se detalla en los modos de error más adelante. Si el puerto está abierto, el navegador mostrará un bloqueo de página completa: "Your connection is not private" con el código NET::ERR_CERT_AUTHORITY_INVALID en Chrome, o SEC_ERROR_UNKNOWN_ISSUER / "Warning: Potential Security Risk Ahead" en Firefox. Esto es normal y no indica un ataque. Webmin generó un certificado autofirmado durante la instalación (/etc/webmin/miniserv.pem) y, como ninguna autoridad de certificación lo respalda, el navegador no confía en él de forma automática. La conexión sigue estando cifrada; simplemente no está validada. Haga clic en continuar (Advanced, luego Proceed) por ahora; reemplazaremos este certificado correctamente más adelante.

Inicie sesión con root o con su usuario sudo y su contraseña de Unix para acceder al panel de System Information. Un error común aquí es escribir http:// en lugar de https://. miniserv responde con el texto exacto "This web server is running in SSL mode. Try the URL https://..." mediante HTTP simple en ese puerto; la solución es cambiar http por https en la barra de direcciones.

La decisión de seguridad: ¿cómo accederá a Webmin?

La parte importante. Un panel con privilegios de root no debe estar expuesto a internet respondiendo intentos de inicio de sesión de cualquier escáner. Tiene dos opciones seguras, en orden de preferencia.

El túnel SSH de la Opción B es la mejor opción, porque no expone nada. La lista blanca de IP de la Opción A es aceptable si su dirección es estática. No aplicar ninguna de las dos es el error que esta guía busca prevenir. Si prefiere acceder a Webmin a través de una red privada, coloque el servidor detrás de un VPN WireGuard self-hosted y vincule Webmin a la dirección del túnel en lugar de la pública.

Opción A: restringir Webmin a su IP

En el panel, abra Webmin, luego Webmin Configuration, y después IP Access Control. Seleccione "Only allow from listed addresses" e ingrese su IP pública, la cual puede obtener ejecutando curl ifconfig.me en su laptop. Guarde los cambios. Webmin escribe esta configuración en la línea allow= de /etc/webmin/miniserv.conf y se reinicia.

El riesgo: si su IP doméstica es dinámica y cambia, o si comete un error al escribir la dirección, perderá el acceso. El navegador mostrará el mensaje "Access denied for <your IP>" sin mostrar el formulario de inicio de sesión, y no habrá una ruta web para volver a entrar. Puede solucionarlo desde la consola del servidor mediante SSH o el VNC de su proveedor:

sudo nano /etc/webmin/miniserv.conf
# find the line that begins  allow=
# correct your IP, or delete the whole line to allow all again
sudo systemctl restart webmin

Eliminar la línea allow= restaura el acceso total; use este método solo para la recuperación y asigne un valor correcto inmediatamente después.

Opción B: vincular a localhost y tunelizar mediante SSH (recomendado)

Es más seguro que cualquier lista de permitidos no escuchar en la interfaz pública. Configure miniserv para que se vincule únicamente al loopback y acceda a través de un túnel SSH cifrado de su confianza.

Edite /etc/webmin/miniserv.conf y añada, o cambie, esta línea:

bind=127.0.0.1

Reinicie con sudo systemctl restart webmin. Webmin ya no es accesible desde internet; un escaneo de puertos en el 10000 no devuelve resultados y la comprobación ss anterior ahora muestra que está vinculado a 127.0.0.1:10000. Desde su laptop, abra un túnel:

ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IP

Mantenga esa sesión abierta y acceda a https://localhost:10000. El tráfico viaja dentro de SSH, que ya está autenticado por su clave y cifrado, por lo que puede aceptar el certificado autofirmado de forma segura; la capa SSH proporciona la protección real. Al cerrar la sesión SSH, Webmin dejará de estar disponible. No hay listas de permitidos, no hay exposición y no hay servicios adicionales que reforzar.

Si configura bind=127.0.0.1 y olvida el túnel, el acceso remoto se interrumpirá; esto es el funcionamiento correcto de la función, no un error. Recupere el acceso de la misma forma que en la Opción A: desde la consola, elimine la línea bind o establezca bind=0.0.0.0, y luego reinicie. Este es el mismo hábito de tunelización que usaría para acceder a una caja de desarrollo remota con Claude Code en tmux — una sola sesión SSH, todo privado y sin servicios adicionales escuchando en la interfaz pública.

Reemplazar el certificado autofirmado por uno real

Si expone Webmin mediante un hostname bajo la Opción A, elimine la advertencia del navegador usando un certificado real de Let's Encrypt. Necesita un nombre DNS —por ejemplo panel.example.com— con un registro A que apunte al servidor, y un servicio que responda al desafío HTTP en el puerto 80 durante la validación.

Webmin tiene esta función integrada: Webmin, luego Webmin Configuration, luego SSL Encryption, y finalmente la pestaña Let's Encrypt. Ingrese el hostname, apunte el "website root directory" a una ruta que se sirva en el puerto 80 para ese dominio, y solicite el certificado. Webmin obtiene el certificado, actualiza las líneas certfile= y keyfile= en miniserv.conf por usted, y lo renueva automáticamente antes de que expire. Recargue la página y el icono del candado aparecerá sin errores.

El único inconveniente: el servidor propio de Webmin funciona en el puerto 10000, no en el 80. Por lo tanto, el desafío http-01 requiere un servidor web real —Apache o nginx— que responda por panel.example.com en el puerto 80, o bien una validación basada en DNS. En un servidor con solo Webmin y nada en el puerto 80, la solicitud fallará con un error de validación hasta que proporcione a Let's Encrypt una forma de acceder al archivo de desafío. El proceso —registros DNS, el desafío en el puerto 80 y la renovación— es el mismo que al emitir un certificado para cualquier sitio web. Si desea profundizar en esto, la guía de certificados TLS de Let's Encrypt con Certbot y nginx detalla el flujo de validación y la configuración de DNS. Si utilizó el método de túnel SSH, puede omitir esta sección: el certificado autofirmado es adecuado tras un túnel SSH, y un certificado real emitido para panel.example.com solo produciría una advertencia de discrepancia de nombre al visitar https://localhost:10000.

Activar la autenticación de dos factores

Una contraseña no es suficiente para proteger un panel de root; añada un segundo factor. Abra Webmin, luego Webmin Configuration, y después Two-Factor Authentication. Seleccione el proveedor Google Authenticator —es el estándar TOTP y funciona con Authy, 1Password o cualquier aplicación de autenticación— y guarde los cambios. Webmin instalará el módulo Perl necesario (Authen::OATH más un generador de QR) y activará la función; este paso por sí solo aún no protege ninguna cuenta.

Cada cuenta debe registrar su propio dispositivo. Con la 2FA activada, abra Webmin, luego Webmin Users, seleccione la cuenta, elija Enable Two-Factor For User y Webmin mostrará un código QR; escanéelo con la aplicación e introduzca un código generado para confirmar. A partir de ese momento, el inicio de sesión solicitará el token de seis dígitos después de la contraseña. Realice el registro antes de cerrar sesión; si la 2FA es obligatoria pero su cuenta nunca escaneó un código, aún puede eliminar el requisito desde la consola, pero es mucho más sencillo realizar el registro primero.

Añadir Fail2ban para bloquear ataques de fuerza bruta

Incluso un endpoint de inicio de sesión restringido debe penalizar los intentos fallidos repetidos. Webmin reporta los inicios de sesión fallidos en syslog con el formato webmin[12345]: Invalid login as root from 10.0.0.9, o Non-existent login as ... si el nombre de usuario no es una cuenta de Unix. En Ubuntu 24.04, estas líneas se registran en el journal de systemd, ya que una instalación estándar no incluye /var/log/auth.log. Fail2ban incluye un filtro webmin-auth predeterminado que coincide exactamente con esas dos líneas. La siguiente jail configura backend = systemd automáticamente, por lo que no requiere regex ni rutas de log personalizadas.

Crear /etc/fail2ban/jail.d/webmin.local:

[webmin-auth]
enabled  = true
port     = 10000
filter   = webmin-auth
backend  = systemd
maxretry = 4
bantime  = 1h

Recargar con sudo systemctl restart fail2ban y confirmar que la jail está activa:

sudo fail2ban-client status webmin-auth

Al principio, la jail aparecerá en la lista con un contador de bloqueos en cero (en el backend de journal no existe la línea File list:). Para verificar la configuración completa, provoque fallos de inicio de sesión intencionadamente desde otra red, ejecute el comando status y observe cómo aumenta Currently banned. Si el contador no aumenta, verifique que la IP de prueba no esté en la ignoreip de Fail2ban y ejecute journalctl SYSLOG_IDENTIFIER=webmin en el servidor para confirmar que las líneas Invalid login se están escribiendo correctamente. Si aún no ha instalado Fail2ban en este equipo, la guía de Fail2ban en Ubuntu 24.04 para SSH cubre la instalación y la jail de SSH que debe ejecutar junto a esta.

Restrinja el acceso de cada usuario de Webmin

No todos los usuarios del panel requieren privilegios de root. En Webmin, luego Webmin Users, cree cuentas adicionales y asigne solo los módulos necesarios; por ejemplo, un operador de backups que solo vea los módulos cron y filesystem. Al editar un usuario, aparecerá una lista de todos los módulos; desmarcar uno lo eliminará del menú del usuario y bloqueará las URLs correspondientes. Esto es defensa en profundidad: incluso si se roba una sesión de Webmin con pocos privilegios, no podrá modificar /etc/shadow si el módulo Users no está en su lista.

Mantener Webmin actualizado

Debido a que la instalación se realizó desde el repositorio apt, sudo apt update && sudo apt upgrade descarga las nuevas versiones de Webmin junto con el resto del sistema. Instale los parches rápidamente; un panel de control es un objetivo frecuente. Webmin también puede actualizarse desde Webmin, luego Webmin Configuration, y después Upgrade Webmin, pero el método apt es más limpio en Ubuntu porque mantiene las versiones consistentes con el resto de su gestión de paquetes. No considere esto como algo opcional: varias CVE de Webmin en el pasado fueron errores de ejecución de código remoto, y la única diferencia entre estar "parcheado" y estar "comprometido" fue la rapidez con la que el administrador ejecutó la actualización.

Modos de fallo y los mensajes que verá

"Your connection is not private" / NET::ERR_CERT_AUTHORITY_INVALID. Aparece en la primera carga. Causa: el certificado autofirmado que Webmin generó durante la instalación no tiene un emisor de confianza. No es un ataque; el canal está cifrado, pero no está verificado. Solución: ignore la advertencia por ahora, luego emita un certificado real de Let's Encrypt, o acéptelo permanentemente si accede a Webmin mediante un túnel SSH.

"This web server is running in SSL mode. Try the URL https://..." Ha escrito http://server:10000. miniserv solo utiliza TLS en ese puerto y se lo indica en texto plano. Solución: cambie http por https en la barra de direcciones.

Page times out — ERR_CONNECTION_TIMED_OUT / "This site can't be reached". La solicitud nunca llega a Webmin. En Ubuntu, esto ocurre casi siempre porque ufw descarta el puerto 10000. Confirme con sudo ufw status; si el puerto 10000 no aparece en la lista, ábralo con sudo ufw allow 10000/tcp o, preferiblemente, déjelo cerrado y use el túnel SSH de la Opción B. Nota la diferencia: un timeout significa que un firewall está descartando paquetes silenciosamente, mientras que ERR_CONNECTION_REFUSED significa que el puerto es alcanzable pero Webmin no se está ejecutando; verifique sudo systemctl status webmin.

"Access denied for <your IP>." Configuró el Control de Acceso por IP en la Opción A y su dirección actual no está en la lista de permitidos (una IP dinámica que ha cambiado o un error tipográfico). No hay forma de volver a entrar mediante el navegador. Solución desde la consola: edite la línea allow= en /etc/webmin/miniserv.conf, corríjala o elimínela, y ejecute sudo systemctl restart webmin.

"Login failed. Please try again." con credenciales que sabe que son correctas. La cuenta no tiene contraseña de Unix, lo cual es estándar en imágenes de nube que solo usan llaves. Webmin se autentica mediante PAM contra la contraseña de Unix, y esa contraseña no existe para el usuario. Solución: ejecute sudo passwd youruser en el servidor y luego inicie sesión. Si /var/webmin/miniserv.log muestra Non-existent login as ..., está escribiendo un nombre de usuario que no es una cuenta de Unix.

Para gestionar más de un par de servidores, la automatización escala mejor que un panel de control en cada máquina: su primer playbook de Ansible es donde comienza ese proceso.

FAQ

¿Es seguro exponer Webmin a internet?

Considere un Webmin expuesto a internet como una shell de root con una página de inicio de sesión. Solo es lo suficientemente seguro si se implementa por capas: un certificado real, autenticación de dos factores, Fail2ban y una lista de permitidos de IP restrictiva o, preferiblemente, sin exposición pública. La configuración de menor riesgo vincula Webmin a 127.0.0.1 y se accede mediante un túnel SSH, de modo que el puerto 10000 no responde a nadie en internet.

¿Cómo elimino la advertencia del certificado de Webmin?

La advertencia (NET::ERR_CERT_AUTHORITY_INVALID) aparece porque Webmin incluye un certificado autofirmado. Genere uno real desde Webmin, Webmin Configuration, SSL Encryption, Let's Encrypt, utilizando un nombre DNS que apunte al servidor con un servicio que responda al desafío port-80 para la validación. Si solo accede a Webmin mediante un túnel SSH a localhost, la advertencia es inofensiva —SSH ya cifra y autentica la conexión— y puede aceptar el certificado autofirmado con seguridad.

¿Cómo restrijo Webmin solo a mi dirección IP?

Vaya a Webmin, Webmin Configuration, IP Access Control, elija "Only allow from listed addresses" e introduzca su IP pública de curl ifconfig.me. Webmin almacena esto en la línea allow= de /etc/webmin/miniserv.conf. Tenga cuidado con las IP dinámicas de hogar: si cambia, perderá el acceso y deberá reparar la línea allow= desde la consola del servidor. Una dirección estática o el método de túnel SSH es más fiable en la práctica.

¿Por qué falla mi inicio de sesión incluso con la contraseña correcta?

Webmin se autentica mediante PAM contra su contraseña de Unix. Las imágenes de la nube suelen usar solo llaves sin contraseña configurada en la cuenta por defecto; por tanto, PAM no tiene nada con qué comparar y el inicio de sesión es rechazado. Ejecute sudo passwd youruser en el servidor para establecer una contraseña y luego inicie sesión. Una línea Non-existent login as ... en /var/webmin/miniserv.log significa que el nombre de usuario no es una cuenta Unix real.

¿Para qué sirve Webmin en comparación con SSH simple?

Webmin es una capa de conveniencia y descubrimiento. Es útil para revisar archivos de log, gestionar usuarios y cron, editar reglas de firewall y ver el estado del disco y de los servicios sin memorizar cada comando; es práctico para administradores ocasionales o equipos con habilidades mixtas. SSH simple es más rápido, permite la automatización mediante scripts y expone mucha menos superficie de ataque para el trabajo rutinario. Muchos administradores usan ambos: SSH para el trabajo diario, y Webmin vinculado a localhost mediante un túnel para tareas ocasionales de interfaz gráfica.