VPS Educaluxe

Usuario o contraseña incorrectos.
🔴
4
Problemas críticos
🟡
9
Mejoras recomendadas
🌐
6
Sitios activos
💾
9%
Disco usado (16/193 GB)
🐳
19
Containers Docker
⚙️
10
Versiones PHP-FPM activas

📊 Estado General del Servidor

Sistema Base
Sistema OperativoUbuntu 24.04.4 LTS (Noble Numbat)
CPU6 cores — AMD EPYC Processor (with IBPB)
RAM total12 GB (11 GiB disponibles al sistema)
Swap2 GB
Disco193 GB (16 GB usados — 9%)
Uptime8 días 21 horas (estable)
Acceso SSH⚠ Password auth activo — hardening pendiente
Panel webCloudPanel v6.0.8 → https://panel.educaluxe.net

💻 Recursos del Sistema

RAM5.1 GB / 11 GB (46%)

Swap0 / 2 GB (0%)

Disco /16 GB / 193 GB (9%)

Uso de disco por directorio

DirectorioTamañoContenido
/home/clp/1.4 GBPanel CloudPanel + assets
/home/educaluxe/1.1 GBMoodle principal (educaluxe.net)
/home/mysql/1.3 GBDatos MariaDB
/home/educaluxe-divinonet/565 MBMoodle divinonet
/home/educaluxe-web/216 MBSitio web (web.educaluxe.net)
/home/educaluxe-mail/192 KBProxy mailcow (solo config)
/home/educaluxe-docker/148 KBConfig Portainer (solo config)

🌐 Sitios Web Activos

Todos los sitios son gestionados por CloudPanel via Nginx. PHP usa versión 8.3 para todos los sitios reales.

DominioTipoDocumentRootBackendEstado
educaluxe.net
www.educaluxe.net
Moodle /home/educaluxe/htdocs/moodle/public PHP-FPM 8.3 :18002 ⚠ server_name duplicado
divinonet.educaluxe.net Moodle /home/educaluxe-divinonet/htdocs/moodle/public PHP-FPM 8.3 :18001 ✓ OK
web.educaluxe.net Web/CMS /home/educaluxe-web/htdocs/web.educaluxe.net Nginx :8080 → PHP-FPM 8.3 :18003 ⚠ Config dual (revisar)
mail.educaluxe.net Webmail /home/educaluxe-mail/… proxy → mailcow :7080 ✓ OK
docker.educaluxe.net Portainer /home/educaluxe-docker/… proxy → :9000 ⚠ :9000 directo aún expuesto
panel.educaluxe.net CloudPanel /home/clp/htdocs/app/files/public proxy → :8443 ✓ OK (SSL propio)
⚠️
educaluxe.net — server_name duplicado El archivo educaluxe.net.conf contiene dos bloques server {} con www.educaluxe.net referenciado en ambos. Puede causar comportamientos inesperados en la redirección www → non-www. Revisar y consolidar desde el panel CLP.
⚠️
web.educaluxe.net — arquitectura dual El vhost escucha en :443 y en :8080 con FastCGI. Varnish (:6081) tiene configurado :8080 como backend, pero Nginx puede estar yendo directo a PHP-FPM sin pasar por Varnish. El caché puede no estar funcionando.

🔒 SSL / Certificados

DominioEmitidoExpiraDías restantesEstado
educaluxe.net2026-05-232026-08-21~82 días✓ Válido
divinonet.educaluxe.net2026-05-222026-08-20~81 días✓ Válido
web.educaluxe.net2026-05-302026-08-28~89 días✓ Válido
mail.educaluxe.net2026-05-222026-08-20~81 días✓ Válido
panel.educaluxe.netSSL propio CLP
Renovación automática activa CloudPanel gestiona la renovación de certificados Let's Encrypt automáticamente. Los certificados están en /etc/nginx/ssl-certificates/. No instalar Certbot global para no interferir con mailcow ACME ni con CLP.

🐳 Docker & mailcow

mailcow lleva 8+ días estable. Sus puertos de correo son intencionales y no deben bloquearse.

Ver todos los containers Docker (19 activos)
ContainerImagenPuertosEstado
portainerportainer/portainer-ce0.0.0.0:9000⚠ Expuesto
mailcow-postfixghcr.io/mailcow/postfix25, 465, 587✓ Intencional
mailcow-dovecotghcr.io/mailcow/dovecot110, 143, 993, 995, 4190✓ Intencional
mailcow-nginxghcr.io/mailcow/nginx127.0.0.1:7080/7443✓ Solo localhost
mailcow-mysqlmariadb:10.11127.0.0.1:13306✓ Solo localhost
mailcow-redisredis:7.4.6-alpine127.0.0.1:7654✓ Solo localhost
mailcow-rspamdghcr.io/mailcow/rspamdinternoInterno
mailcow-clamdghcr.io/mailcow/clamdinterno✓ Healthy
mailcow-sogoghcr.io/mailcow/sogointernoInterno
mailcow-acmeghcr.io/mailcow/acmeinterno✓ Gestiona SSL
mailcow-unboundghcr.io/mailcow/unboundinterno (DNS)✓ Healthy
mailcow-watchdogghcr.io/mailcow/watchdoginternoInterno
mailcow-netfilterghcr.io/mailcow/netfilterinternoInterno
mailcow-memcachedmemcached:alpineinternoInterno
mailcow-php-fpmghcr.io/mailcow/phpfpminternoInterno
mailcow-olefyghcr.io/mailcow/olefyinternoInterno
mailcow-ofeliamcuadros/ofeliainternoCron jobs
mailcow-dockerapighcr.io/mailcow/dockerapiinternoInterno
mailcow-postfix-tlspolghcr.io/mailcow/postfix-tlspolinternoInterno
🔴
Portainer expuesto en :9000 Docker bypasa UFW directamente vía iptables. El puerto 9000 es público aunque no aparezca en las reglas UFW. Aunque docker.educaluxe.net ya hace proxy con SSL, el acceso directo http://IP:9000 sigue funcionando sin autenticación de Nginx. Requiere regla en la chain DOCKER-USER.

⚙️ PHP Multi-versión

CloudPanel instala todas las versiones PHP disponibles. Solo PHP 8.3 tiene pools de sitios activos.

VersiónPuerto FPMPool de sitioEstado
PHP 7.1:11000Ninguno⚠ Sin sitio — consume RAM
PHP 7.2:12000Ninguno⚠ Sin sitio — consume RAM
PHP 7.3:13000Ninguno⚠ Sin sitio — consume RAM
PHP 7.4:14000Ninguno⚠ Sin sitio — consume RAM
PHP 8.0:15000Ninguno⚠ Sin sitio — consume RAM
PHP 8.1:16000Ninguno⚠ Sin sitio — consume RAM
PHP 8.2:17000Ninguno⚠ Sin sitio — consume RAM
PHP 8.3:18001 / :18002 / :18003divinonet / educaluxe / web✓ En uso activo
PHP 8.4:19000Ninguno⚠ Sin sitio — consume RAM
PHP 8.5:20000Ninguno⚠ Sin sitio — consume RAM
⚠️
9 versiones PHP-FPM activas sin sitios Todos los procesos PHP-FPM (excepto 8.3) consumen RAM innecesariamente. Evaluar desactivación desde CloudPanel para las versiones no usadas (7.1–8.2, 8.4, 8.5). No editar manualmente — hacerlo desde el panel CLP.

⚡ Varnish Caché

Varnish está instalado como capa de caché HTTP. Configurado con backend en 127.0.0.1:8080.

Flujo esperado vs. flujo real

Flujo esperado (con Varnish activo):

Internet
Nginx :443
Varnish :6081
Nginx :8080
PHP-FPM :18003

Flujo real detectado (posible bypass):

Internet
Nginx :443
Nginx :8080
PHP-FPM :18003
🔴
Varnish :6081 expuesto públicamente El servicio escucha en 0.0.0.0:6081. Cualquiera puede hacer peticiones HTTP directas al backend sin pasar por Nginx, saltándose SSL, headers de seguridad y rate limiting. Debe restringirse a 127.0.0.1:6081.
⚠️
Verificar si Varnish está en el flujo real Ejecutar: grep -r "6081\|varnish" /etc/nginx/sites-enabled/ para confirmar si Nginx redirige tráfico a Varnish o va directo al backend.

🗄️ MariaDB

VersiónMariaDB 10.11.14
Puerto host3306⚠ bind en 0.0.0.0
Puerto Docker (mailcow)127.0.0.1:13306✓ Solo localhost
Datos/home/mysql/ — 1.3 GB
Credenciales root⚠ Desconocidas — requiere contraseña
🔴
MariaDB expuesto en 0.0.0.0:3306 La base de datos es accesible desde internet. Esto es una vulnerabilidad crítica que permite intentos de fuerza bruta directos al puerto MySQL. Cambiar bind-address = 127.0.0.1 en /etc/mysql/mariadb.conf.d/50-server.cnf.
⚠️
Credenciales root desconocidas El servidor MariaDB del host requiere contraseña (no usa auth_socket). Obtener credenciales desde el panel CloudPanel o la documentación del proveedor para poder auditar usuarios y bases de datos.

🔌 Puertos Abiertos

Públicos (0.0.0.0)

22
SSH (password auth)
Riesgo
21
ProFTPD (requerido por CLP)
FTP plano
80 / 443
Nginx (web)
OK
8080 / 8443
Nginx (backend CLP)
Revisar
3306
MariaDB (host)
Crítico
9000
Portainer (Docker)
Crítico
6081
Varnish
Expuesto
25/465/587
Postfix (mailcow)
Intencional
110/143/993/995
Dovecot (mailcow)
Intencional

Solo localhost ✅

6379
Redis
Seguro
11211
Memcached
Seguro
7080/7443
mailcow-nginx
Seguro
13306
mailcow-mysql
Seguro
11000–20000
PHP-FPM (todas versiones)
Seguro

🛡️ Estado de Seguridad

#ÍtemEstadoPrioridad
1Clave SSH en /root/.ssh/authorized_keys⚠ Vacío — debe hacerse PRIMERO🔴 Alta
2SSH PermitRootLoginyes — acceso root directo🔴 Alta
3SSH PasswordAuthenticationyes — brute force posible🔴 Alta
4MariaDB bind-address0.0.0.0 — expuesto a internet🔴 Alta
5Portainer :9000 públicoDocker bypasa UFW🔴 Alta
6Fail2banSolo jail SSH — faltan Nginx🟡 Media
7Varnish :6081HTTP público sin SSL🟡 Media
8ProFTPD puerto 21FTP plano (requerido por CLP)🟡 Media
9Backups configuradosSin crontab root — sin backup automático🟡 Media

UFW — Reglas actuales

# Reglas UFW activas
[ 1] 22/tcp        ALLOW   Anywhere   # SSH
[ 2] 80/tcp        ALLOW   Anywhere   # HTTP
[ 3] 443           ALLOW   Anywhere   # HTTPS
[ 4] 8433:8443/tcp ALLOW   Anywhere   # CLP backend (rango incluye 8443)
[ 5] 443/udp       ALLOW   Anywhere   # QUIC/HTTP3

# ⚠️ IMPORTANTE: Docker bypasa UFW directamente
# Puerto 9000 (Portainer) está abierto aunque no aparezca aquí

🔧 Plan de Hardening

1

Agregar clave SSH pública (HACER PRIMERO)

Sin esto, si se desactiva la contraseña quedarás sin acceso. Verificar en nueva terminal antes de continuar.

# PowerShell local:
Get-Content "C:\Users\FamCM\.ssh\id_ed25519.pub"

# En el VPS:
mkdir -p /root/.ssh && chmod 700 /root/.ssh
echo "PEGAR_CLAVE_PUBLICA_AQUI" >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
2

SSH Hardening — Deshabilitar contraseña

Cambiar PermitRootLogin a prohibit-password y desactivar PasswordAuthentication.

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)
sed -i 's/^PermitRootLogin yes/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl reload ssh
3

MariaDB — Restringir a localhost

Evitar exposición de la base de datos a internet. Crítico.

sed -i 's/.*bind-address.*/bind-address = 127.0.0.1/' \
  /etc/mysql/mariadb.conf.d/50-server.cnf
systemctl restart mariadb
ss -tlnp | grep 3306  # Debe mostrar 127.0.0.1:3306
4

Portainer — Bloquear acceso directo :9000

Docker bypasa UFW. Usar la chain DOCKER-USER de iptables. Portainer seguirá accesible en https://docker.educaluxe.net.

iptables -I DOCKER-USER -i eth0 -p tcp --dport 9000 -j DROP
apt install -y iptables-persistent
netfilter-persistent save
# Acceso futuro via túnel SSH:
# ssh -L 9000:localhost:9000 -N root@164.68.96.33
5

Fail2ban — Agregar jails para Nginx y MariaDB

Actualmente solo protege SSH. Añadir protección contra brute force en web y base de datos.

[sshd]
enabled = true
maxretry = 3

[nginx-http-auth]
enabled = true

[nginx-botsearch]
enabled = true

[mariadb-auth]
enabled  = true
filter   = mysqld-auth
logpath  = /var/log/mysql/error.log
6

Varnish — Restringir a localhost

Cambiar el bind de Varnish de 0.0.0.0:6081 a 127.0.0.1:6081.

# En /etc/varnish/varnish.params o /etc/default/varnish
# Buscar y cambiar: -a 0.0.0.0:6081 → -a 127.0.0.1:6081
systemctl restart varnish

🖥️ CloudPanel v6.0.8

El único panel instalado es CloudPanel v6.0.8. No existe CyberPanel ni ningún otro panel en el servidor.

Binario CLI/usr/bin/clpctl
Daemon/usr/sbin/clp-agent
URL panelhttps://panel.educaluxe.net
Nginx propioInstancia separada de Nginx del sistema — proceso como usuario clp
PHP propioInstancia PHP-FPM para el panel (en /home/clp/services/)

⏰ Cron Jobs

ArchivoPropósitoEstado
/etc/cron.d/clpTareas internas CloudPanelSistema
/etc/cron.d/educaluxeCron Moodle principalContenido no verificado
/etc/cron.d/educaluxe-divinonetCron Moodle divinonetContenido no verificado
/etc/cron.d/phpLimpieza sesiones PHPSistema
/etc/cron.d/staticrouteRutas de red estáticasSistema
/etc/cron.d/sysstatMétricas del sistema (sar)Sistema
/etc/cron.d/e2scrub_allVerificación filesystem ext4Sistema
⚠️
Cron de Moodle — verificar frecuencia Moodle requiere que su cron corra cada minuto para funcionar correctamente (notificaciones, eventos programados, caché). Verificar con: cat /etc/cron.d/educaluxe
🔴
Sin backup automático configurado No hay crontab de root y no se detectó ningún sistema de backup activo. Con 3 instancias de Moodle y ~3 GB de datos, una falla de disco sin backup sería pérdida total. Implementar backup urgente.

📦 Actualizaciones Pendientes

Solo 6 paquetes menores — sin CVEs críticos Todos los paquetes son actualizaciones de mantenimiento sin urgencia de seguridad.
PaqueteVersión actualNueva versión
vim9.1.0016-1ubuntu7.139.1.0016-1ubuntu7.14
vim-common9.1.0016-1ubuntu7.139.1.0016-1ubuntu7.14
vim-runtime9.1.0016-1ubuntu7.139.1.0016-1ubuntu7.14
vim-tiny9.1.0016-1ubuntu7.139.1.0016-1ubuntu7.14
xxd9.1.0016-1ubuntu7.139.1.0016-1ubuntu7.14
rclone1.60.1+dfsg-3ubuntu0.24.04.41.60.1+dfsg-3ubuntu0.24.04.5
apt upgrade -y   # Aplicar todas las actualizaciones pendientes

🚀 Análisis: Convertir el VPS en Plataforma Reseller

ℹ️
Diagnóstico de partida CloudPanel v6.0.8 (el único panel instalado) no tiene funcionalidades de reseller. Solo tiene 3 roles básicos: Admin, Site Manager y User. No permite límites de recursos por cliente, no tiene cuentas de reseller, ni sistema de facturación.

¿Qué necesitas para ofrecer hosting como reseller?

Función requeridaCloudPanel (actual)
Cuentas de reseller (sub-admin que gestiona sus propios clientes)❌ No existe
Límites de disco por cliente (GB)❌ No existe
Límites de ancho de banda por cliente❌ No existe
Límites de número de dominios/sitios por cliente❌ No existe
Panel separado por cliente final❌ No existe
Módulo de facturación / billing❌ No existe
Integración WHMCS❌ No oficial
Suspensión automática de cuentas❌ No existe
Estadísticas de uso por cliente❌ No existe
El cliente puede crear sus propios sitios❌ No

Opciones de paneles con capacidad reseller

CloudPanel + FOSSBilling
Gratis | Mínimo impacto
Sin migración — usar lo que ya tienes
FOSSBilling para facturación y portal cliente
Tú creas los sitios manualmente y los asignas
No hay self-service para el cliente
Sin límites de recursos reales
No es reseller verdadero — es hosting administrado

Ideal si: ofreces hosting gestionado donde tú haces el trabajo técnico.

ISPConfig
BSD — 100% gratuito | Requiere migración
Reseller con límites completos
Más granular que HestiaCP
Multi-servidor (único entre los gratuitos)
Módulo WHMCS oficial
⚠️ Interfaz menos moderna
⚠️ Conflicto con mailcow
cPanel / WHM
$15–45/mes | Pesado para este VPS
Estándar del sector para reseller
WHMCS oficial completo
Costoso
Muy pesado en recursos
Conflictos graves con la infra actual

No recomendado para este servidor.

Jerarquía de cuentas (con panel reseller real)

admin (tú)
└── reseller (tu cliente intermediario)
├── usuario-final-1 → sitios, mail, DBs, FTP
├── usuario-final-2 → sitios, mail, DBs, FTP
└── usuario-final-N → con sus propios límites

Tabla comparativa final

PanelPrecioResellerLímitesBillingConflicto stack
CloudPanel (actual)GratisNinguno
HestiaCPGratisWHMCS/FOSSBillingMail (evitable)
ISPConfigGratis✅✅WHMCSMail (evitable)
DirectAdmin~$2/mesWHMCS oficialMail (evitable)
cPanel/WHM$15–45/mes✅✅✅✅WHMCS completoAlto

✅ Recomendación Final

🅰️ Escenario A — Mínimo impacto: CloudPanel + FOSSBilling

Para: hosting gestionado donde tú administras todo

  • Mantener CloudPanel tal como está
  • Instalar FOSSBilling (open source, gratuito) en billing.educaluxe.net
  • Cada cliente recibe credenciales del portal de facturación
  • Tú creas los sitios en CloudPanel y los asignas manualmente al usuario del cliente
  • Cliente ve su factura, abre tickets — pero no crea sitios por su cuenta
ℹ️
Ideal si ofreces hosting administrado premium. No requiere migración. Se implementa en horas.
🅱️ Escenario B — Reseller real (recomendado si vas a escalar): HestiaCP + FOSSBilling

Para: hosting comercial con clientes self-service

  • Migrar sitios actuales (Moodle) a carpetas seguras primero
  • Instalar HestiaCP sin módulos de mail para no conflictuar con mailcow
  • Crear paquetes de hosting con límites (Starter: 1 GB disco / 1 dominio / 1 DB...)
  • Crear cuentas de reseller para intermediarios
  • Integrar FOSSBilling para billing y portal de clientes
# Instalación HestiaCP sin mail (para no conflictuar con mailcow):
bash hst-install.sh --exim no --dovecot no --spamassassin no --clamav no \
  --nginx yes --php yes --vsftpd yes --mysql yes
⚠️
Requiere planificación: migración con Moodle en producción. Hacerlo en ventana de mantenimiento con backup previo completo.
🅲 Escenario C — Reseller moderno con DirectAdmin ($2/mes)

Para: quien prefiere UI moderna y soporte oficial

  • Obtener licencia en directadmin.com (~$2/mes)
  • Migrar sitios y datos antes de instalar
  • Mismo proceso que HestiaCP pero con UI más pulida y WHMCS oficial

🎯 Mi recomendación directa

Dado que ya tienes Moodle, mailcow y CloudPanel funcionando en producción, la ruta más segura es:

Corto plazo (esta semana)
  • Hacer el hardening de seguridad (pasos 1–5)
  • Instalar FOSSBilling para facturación
  • Ofrecer hosting administrado con CloudPanel
Mediano plazo (próximo mes)
  • Evaluar migración a HestiaCP en un VPS de prueba
  • Preparar plan de migración de Moodle
  • Migrar en ventana de mantenimiento programada

Recursos y documentación