Instalar y proteger Webmin en Ubuntu 24.04
Instala Webmin en Ubuntu 24.04 y protege el puerto 10000 con tunel SSH o lista IP, certificado Let's Encrypt, 2FA y Fail2ban.
Qué va a instalar
Webmin es un panel de control web que proporciona una interfaz de navegador para administrar un servidor Linux completo: usuarios, paquetes, tareas de cron, el firewall, Apache, BIND, discos y cientos de módulos más. Está disponible mediante HTTPS en el puerto 10000. La instalación consta de tres comandos y tarda aproximadamente un minuto. Esta guía dedica la mayor parte de su extensión a la segunda mitad porque Webmin inicia sesión como root y puede hacer todo lo que puede hacer root. Un Webmin expuesto sin restricciones o sin autenticación no es simplemente «un riesgo que gestionar»: implica el compromiso completo del servidor, con una página de inicio de sesión delante. Instálelo en diez minutos y dedique el resto de la hora a asegurarse de que sólo usted pueda acceder a él.
Requisitos y una advertencia importante
Necesita un VPS KVM nuevo con Ubuntu 24.04 y acceso como root o mediante un usuario con sudo. Webmin está escrito en Perl y consume pocos recursos: 1 GB de RAM es suficiente y, en reposo, utiliza bastante menos de un cuarto de gigabyte. Escucha en el puerto TCP 10000 mediante su propio servidor web incluido (miniserv.pl), no mediante Apache ni nginx. Por tanto, no es necesario instalar nada más antes.
Debe decidir dos aspectos antes de empezar. Primero, la cuenta con la que iniciará sesión: Webmin autentica las cuentas de Unix mediante PAM. Puede iniciar sesión como root o como un usuario del grupo sudo usando la contraseña de Unix de esa cuenta. Las imágenes de la nube suelen configurarse para usar sólo claves y no tienen una contraseña establecida para el usuario predeterminado. Webmin no puede iniciar sesión con una cuenta sin contraseña. Establezca primero una contraseña con sudo passwd youruser. De lo contrario, el inicio de sesión fallará independientemente de lo que escriba.
Segundo, esta es la advertencia: no abra simplemente el puerto 10000 a Internet y lo deje así. Decida ahora si accederá a Webmin mediante un túnel SSH (recomendado, sin exponer ningún puerto) o si restringirá el acceso a su propia IP. Esta decisión determina todos los pasos siguientes. Lea ambas opciones antes de modificar 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 para que las ejecuciones futuras de apt upgrade descarguen Webmin como cualquier otro paquete, obteniendo actualizaciones autenticadas en lugar de un .deb descargado que nunca se parchea a sí mismo.
curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.shEl script muestra lo que va a realizar y solicita Setup Webmin stable repository? (y/N), responda y. Cuando finalice, instale el paquete. El flag --install-recommends descarga las dependencias comunes de Perl y los módulos SSL para que los módulos individuales no fallen más tarde por errores de librerías faltantes.
sudo apt-get install --install-recommends webminWebmin ha renombrado este script anteriormente, las guías antiguas hacen referencia a setup-repos.sh, por lo que si la URL directa devuelve un 404, obtenga el comando de una línea actual directamente desde webmin.com/download en lugar de fijar un nombre. 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 reside en /etc/webmin, las peticiones se registran en /var/webmin/miniserv.log y los inicios de sesión fallidos van a syslog; en Ubuntu 24.04, al journal de systemd.
Confirme que realmente está activo y escuchando antes de abrir un navegador:
sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000Debe obtener un estado active (running) y una línea que muestre miniserv.pl vinculado a 0.0.0.0:10000; esa dirección cambia a 127.0.0.1:10000 una vez que utilice la ruta del túnel descrita a continuación. Si ss no muestra nada en el puerto 10000, Webmin no se inició; lea journalctl -u webmin -n 50 antes de continuar.
Primer inicio de sesión y advertencia del certificado
Abra https://YOUR_SERVER_IP:10000 en el navegador. En una instalación nueva ocurren dos cosas.
Si ufw está activo, la imagen de servidor propia de Ubuntu lo incluye inactivo, pero muchos proveedores lo habilitan de antemano, la página no se cargará en absoluto. Esto se explica en las situaciones de error siguientes. Si el puerto está abierto, el navegador muestra un bloqueo a pantalla completa: "Tu conexión no es privada", con el código NET::ERR_CERT_AUTHORITY_INVALID en Chrome, o SEC_ERROR_UNKNOWN_ISSUER / "Advertencia: posible riesgo de seguridad" en Firefox. Esto es normal y no indica una intrusión. Webmin generó un certificado autofirmado durante la instalación (/etc/webmin/miniserv.pem). Como ninguna autoridad de certificación lo respalda, el navegador se niega a confiar en él automáticamente. La conexión sigue cifrada; simplemente no está respaldada por una autoridad de certificación. Haga clic en las opciones para continuar (Avanzado y después Continuar). Más adelante reemplazaremos correctamente este certificado.
Inicie sesión con root o con su usuario de sudo y su contraseña de Unix para acceder al panel de información del sistema. Un error habitual es escribir http:// en lugar de https://. miniserv responde con HTTP sin cifrado en ese puerto y muestra exactamente el texto "Este servidor web se está ejecutando en modo SSL. Pruebe la URL https://...". La solución consiste literalmente en cambiar http por https en la barra de direcciones.
La decisión de seguridad: ¿cómo accederá a Webmin?
Ahora viene la parte importante. Un panel con privilegios equivalentes a root no debe quedar expuesto en Internet y aceptar intentos de inicio de sesión de cualquier scanner. Tiene dos opciones justificables, en este orden de preferencia. Toda interfaz de administración autohospedada plantea la misma cuestión. Por eso, si Vaultwarden es seguro depende de su endpoint de administración y de su archivo de backup, no de su cifrado.
El túnel SSH de la opción B es mejor porque no expone nada. La lista de permitidos por IP de la opción A es aceptable si su dirección es estática. No hacer ninguna de las dos cosas es exactamente el error que esta guía pretende evitar. Si prefiere acceder a Webmin a través de una red privada, configure el servidor detrás de una VPN WireGuard autohospedada y vincule Webmin a la dirección del túnel en lugar de a la dirección pública.
Opción A: restringir Webmin a tu IP
En el panel, abre Webmin, luego Webmin Configuration y después IP Access Control. Selecciona "Only allow from listed addresses" e introduce tu IP pública, que puedes consultar ejecutando curl ifconfig.me en tu portátil. Guarda los cambios. Webmin escribe este valor en la línea allow= de /etc/webmin/miniserv.conf y se reinicia.
El riesgo es el siguiente: si tu IP doméstica es dinámica y cambia, o introduces una dirección incorrecta, perderás el acceso. El navegador mostrará "Access denied for <your IP>", sin formulario de inicio de sesión, y no habrá ninguna vía de acceso web. Debes corregirlo desde la consola del servidor mediante SSH o mediante la consola VNC de tu 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 webminEliminar la línea allow= restaura el acceso completamente abierto. Hazlo sólo para recuperar el acceso y establece inmediatamente un valor correcto.
Opción B: enlazar con localhost y crear un túnel SSH (recomendado)
Es mejor que cualquier lista de permitidos no escuchar en la interfaz pública. Configure miniserv para que se enlace sólo con loopback y acceda a él mediante un túnel SSH cifrado en el que ya confía.
Edite /etc/webmin/miniserv.conf y añada o cambie una línea:
bind=127.0.0.1Reinicie con sudo systemctl restart webmin. Webmin ya no será accesible desde Internet, un escaneo de puertos del puerto 10000 no encontrará nada y la comprobación de ss anterior mostrará que está enlazado con 127.0.0.1:10000. Desde su portátil, abra un túnel:
ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IPMantenga abierta esa sesión y vaya a https://localhost:10000. El tráfico circula dentro de SSH, que ya está autenticado mediante su clave y cifrado, por lo que aquí puede aceptar de forma segura el certificado autofirmado: la capa SSH proporciona la protección real. Cierre la sesión SSH y Webmin dejará de estar disponible. No hay nada que añadir a una lista de permitidos, nada expuesto ni ningún servicio adicional que proteger.
Si configura bind=127.0.0.1 y olvida el túnel, el acceso remoto simplemente se detendrá. Esa es la función esperada, no un fallo. Recupérelo 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 reinicie. Este es el mismo procedimiento de túnel que usaría para acceder a un equipo de desarrollo remoto que ejecuta Claude Code en tmux: una sesión SSH, todo privado y nada adicional escuchando en la interfaz pública.
Reemplazar el certificado autofirmado por uno real
Si expone Webmin bajo la Opción A, elimine la advertencia del navegador con un certificado real de Let's Encrypt. Necesita un nombre para el certificado y una forma de que Let's Encrypt acceda al puerto 80 durante la validación. El nombre suele ser un nombre DNS, por ejemplo panel.example.com, con un registro A que apunte al servidor. Desde Webmin 2.650 (lanzado el 25 de junio de 2026) también puede ser la dirección IP pública del servidor, siempre que Certbot 5.3 o posterior esté instalado. Let's Encrypt emite certificados para IP solo en su perfil de corta duración, válido por unos seis días, así que configure el intervalo de renovación automática de Webmin en días; Webmin no aceptará un intervalo mayor para un certificado de IP.
Webmin tiene esto integrado: Webmin, luego Webmin Configuration, después SSL Encryption y finalmente la pestaña Let's Encrypt. Introduzca el nombre de host o la dirección IP, elija un método de validación y solicítelo. Webmin obtiene el certificado, actualiza las líneas certfile= y keyfile= en miniserv.conf por usted y lo renueva automáticamente antes de que caduque. Recargue la página y el candado aparecerá como seguro.
El único inconveniente real: el servidor de Webmin se ejecuta en el puerto 10000, no en el 80, por lo que algo debe responder al desafío http-01 en el puerto 80. Tiene tres formas de hacerlo. Si Apache o nginx ya sirven el nombre en el puerto 80, apunte la validación al directorio de documentos de ese sitio (para una dirección IP esto requiere Certbot 5.4 o posterior). Si no hay nada en el puerto 80, elija el servidor web integrado de Certbot, el modo standalone que Webmin añadió en la versión 2.110: Certbot ejecuta brevemente su propio servidor web en el puerto 80, por lo que Certbot debe estar instalado y el puerto 80 debe estar libre y abierto en su firewall. O bien, utilice la validación DNS, que funciona para nombres de host pero no para direcciones IP. El paquete certbot de Ubuntu 24.04 es la versión 2.9, que es adecuada para la validación standalone de un nombre de host pero demasiado antigua para certificados de IP; para estos, instale un Certbot actual como el snap, que estaba en la versión 5.8 en octubre de 2026. Sin ninguna de estas opciones, la solicitud fallará con un error de validación. La mecánica, los registros DNS, el desafío del puerto 80 y la renovación son iguales a los de la emisión de un certificado para cualquier sitio web. Si desea conocer esos fundamentos, la guía de certificados TLS de Let's Encrypt con Certbot y nginx detalla el flujo de validación y la configuración DNS. Si optó por la ruta del túnel SSH, puede omitir esta sección por completo: el certificado autofirmado es aceptable detrás de SSH, y un certificado real emitido para panel.example.com solo produciría una advertencia de discrepancia de nombre al visitar https://localhost:10000 de todos modos.
Activar la autenticación de dos factores
Una contraseña por sí sola ofrece poca protección para un panel de root, así que añada un segundo factor. Abra Webmin, después Webmin Configuration y después Two-Factor Authentication. Seleccione el proveedor Google Authenticator, que usa TOTP estándar y funciona con Authy, 1Password o cualquier aplicación de autenticación, y guarde los cambios. Webmin instala el pequeño módulo de Perl que necesita (Authen::OATH y un generador de códigos QR) y activa la función. Este paso por sí solo todavía no protege ninguna cuenta.
Después, cada cuenta debe registrar su propio dispositivo. Con 2FA activado, abra Webmin, después 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 uno de los códigos generados 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. Registre el dispositivo antes de cerrar la sesión. Si 2FA es obligatorio pero su cuenta nunca ha escaneado un código, todavía puede eliminar el requisito desde la consola, pero es mucho más sencillo registrarlo primero.
Añadir Fail2ban para bloquear los inicios de sesión por fuerza bruta
Incluso un endpoint de inicio de sesión restringido debe penalizar los fallos repetidos. Webmin registra 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 ... cuando el nombre de usuario ni siquiera corresponde a una cuenta de Unix. En Ubuntu 24.04, esas líneas llegan al journal de systemd, porque una imagen estándar no tiene /var/log/auth.log. Fail2ban incluye un filtro estándar webmin-auth que coincide exactamente con esas dos líneas. La jaula siguiente establece backend = systemd por sí misma, por lo que no necesita una expresión regular ni una ruta de registro personalizadas.
Cree /etc/fail2ban/jail.d/webmin.local:
[webmin-auth]
enabled = true
port = 10000
filter = webmin-auth
backend = systemd
maxretry = 4
bantime = 1hRecargue con sudo systemctl restart fail2ban y confirme que la jaula está activa:
sudo fail2ban-client status webmin-authDebería ver la jaula en la lista, con un contador de bloqueos inicial de cero. En el backend del journal no aparece ninguna línea File list:. Para comprobar todo el flujo, provoque varios fallos de inicio de sesión desde otra red y vuelva a ejecutar el comando de estado. Compruebe que Currently banned aumente. Si nunca aumenta, asegúrese de no estar probando desde una dirección incluida en ignoreip de Fail2ban. Ejecute journalctl SYSLOG_IDENTIFIER=webmin en el servidor para confirmar que las líneas Invalid login se están escribiendo realmente. Si Fail2ban todavía no está instalado en este servidor, la guía de Fail2ban en Ubuntu 24.04 para SSH explica cómo instalarlo y qué jaula de SSH debe ejecutar junto con esta.
Limite lo que puede modificar cada usuario de Webmin
No todas las personas que necesitan el panel necesitan acceso root a todo. En Webmin, luego Webmin Users, cree cuentas de Webmin adicionales y conceda a cada una sólo los módulos que necesita. Por ejemplo, un operador de copias de seguridad puede ver únicamente los módulos de cron y del sistema de archivos. Al editar un usuario se muestra una lista de comprobación con todos los módulos. Al desmarcar uno, se elimina del menú de ese usuario y se bloquean las URL correspondientes. Esto añade una capa de defensa: incluso si roban una sesión de Webmin con pocos privilegios, no podrán reescribir /etc/shadow cuando el módulo Users no esté incluido en su lista.
Mantener Webmin actualizado
Como lo instaló desde el repositorio de apt, sudo apt update && sudo apt upgrade obtiene las nuevas versiones de Webmin junto con el resto del sistema. Instale los parches sin demora: un panel de control es un objetivo frecuente. Webmin también puede actualizarse desde Webmin, luego Webmin Configuration y después Upgrade Webmin, pero la vía de apt es más sencilla en Ubuntu porque mantiene las versiones coherentes con el resto de la gestión de paquetes. No lo considere opcional: varias vulnerabilidades CVE anteriores de Webmin permitían la ejecución remota de código, y la única diferencia entre un sistema con parches y un servidor vulnerado era la rapidez con la que el administrador ejecutaba la actualización.
Modos de fallo y mensajes asociados
"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 una entidad emisora de confianza. No es un ataque; el canal está cifrado, pero no verificado. Solución: continúe a través de la advertencia por ahora y luego emita un certificado real de Let's Encrypt, o acéptelo permanentemente si accede a Webmin a través de un túnel SSH.
"This web server is running in SSL mode. Try the URL https://..." Usted escribió 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.
La página agota el tiempo de espera, ERR_CONNECTION_TIMED_OUT / "This site can't be reached". La petición nunca llega a Webmin. En Ubuntu, esto suele deberse a que ufw descarta el tráfico del puerto 10000, pero verifíquelo antes de asumir que es la causa. Ejecute sudo ufw status. Si informa Status: inactive, ufw no está bloqueando nada (Ubuntu lo incluye deshabilitado y añadir una regla de permiso no lo activa), así que busque más arriba en la red, como en un firewall del panel de control de su proveedor. Si informa Status: active, ejecute sudo ufw status verbose para ver la política de entrada predeterminada y cualquier regla general; si el tráfico entrante está denegado y el 10000 no aparece, ábralo con sudo ufw allow 10000/tcp o, mejor aún, déjelo cerrado y utilice el túnel SSH de la Opción B. Tenga en cuenta la distinción: un timeout significa que un firewall está descartando paquetes silenciosamente, mientras que ERR_CONNECTION_REFUSED significa que el puerto es accesible pero Webmin no se está ejecutando; compruebe 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, es una IP dinámica que ha cambiado o hay un error tipográfico. No hay forma de volver atrás desde 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 Unix, lo cual es estándar en imágenes de nube que solo usan claves. Webmin se autentica mediante PAM contra la contraseña 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 Unix.
Para 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 la internet pública?
Trate a un Webmin expuesto a internet como una shell de root con una página de inicio de sesión, porque eso es exactamente lo que es. Solo es suficientemente seguro mediante capas: un certificado real, autenticación de dos factores, Fail2ban y, o bien una lista blanca de IPs estricta o, mejor aún, ninguna exposición pública. La configuración de menor riesgo vincula Webmin a 127.0.0.1 y se accede a él mediante un túnel SSH, de modo que el puerto 10000 no responde a nadie en la internet abierta.
¿Cómo elimino la advertencia de certificado de Webmin?
La advertencia (NET::ERR_CERT_AUTHORITY_INVALID) aparece porque Webmin se distribuye con un certificado autofirmado. Emita uno real desde Webmin, Webmin Configuration, SSL Encryption, Let's Encrypt. Utilice un nombre DNS que apunte al servidor, o la dirección IP pública del servidor si tiene instalado Certbot 5.3 o posterior. El puerto 80 debe estar accesible para el desafío, el cual puede ser respondido por un servidor web existente o por el servidor independiente de Certbot. Si solo accede a Webmin a través de un túnel SSH a localhost, la advertencia es inofensiva; SSH ya cifra y autentica la conexión, y puede aceptar el certificado autofirmado sin riesgos.
¿Cómo restringir 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 desde curl ifconfig.me. Webmin almacena esto en la línea allow= de /etc/webmin/miniserv.conf. Tenga cuidado con una IP doméstica dinámica: si cambia, quedará bloqueado y deberá reparar la línea allow= desde la consola del servidor, por lo que una dirección estática o el método del 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, y las imágenes en la nube suelen configurarse solo con claves sin contraseña establecida en la cuenta predeterminada, por lo que no hay nada que PAM pueda verificar y el inicio de sesión es rechazado. Ejecute sudo passwd youruser en el servidor para establecer una y luego inicie sesión. Una línea Non-existent login as ... en /var/webmin/miniserv.log significa, en cambio, que el nombre de usuario no es una cuenta de Unix real.
¿Para qué sirve Webmin en comparación con SSH puro?
Webmin es una capa de descubrimiento y conveniencia. Es realmente útil para explorar archivos de registro, gestionar usuarios y cron, editar reglas de firewall y ver el estado del disco y los servicios sin memorizar cada comando, lo cual es práctico para administradores ocasionales o equipos con habilidades mixtas. SSH puro es más rápido, automatizable y expone mucha menos superficie de ataque para el trabajo rutinario. Muchos administradores ejecutan ambos: SSH para el uso diario y Webmin vinculado a localhost detrás de un túnel para tareas puntuales de interfaz gráfica. Si su pregunta real es qué panel elegir en lugar de panel frente a shell, vale la pena evaluar primero Cockpit frente a Webmin, ya que ambos difieren en cuánto del sistema puede cambiar cada uno y en cómo le autentican.