Tutorial paso a paso para dejar un servidor virtual listo para trabajar con Python, Docker, GitHub, Jupyter, FastAPI y herramientas de MLOps. Un VPS (Virtual Private Server) es un servidor virtual que alquilas en la nube y al que accedes como si fuera una máquina Linux real. Disponer de un VPS propio es una de las mejores formas de practicar:
- Administración Linux
- DevOps
- Docker y Kubernetes
- CI/CD
- APIs con FastAPI
- Aplicaciones de IA agéntica
- MLOps
- Despliegue de modelos de Machine Learning
En esta guía vamos a configurar un VPS desde cero para convertirlo en un entorno profesional de laboratorio.
Características Recomendadas para un VPS de prácticas
Antes de contratar un VPS, conviene elegir una configuración equilibrada que permita trabajar con herramientas de desarrollo, contenedores y cargas moderadas de machine learning.
Configuración mínima recomendada
Para un laboratorio personal de DevOps, Data Science y MLOps, estas especificaciones son más que suficientes:
| Recurso | Recomendación mínima | Recomendación ideal |
|---|---|---|
| CPU | 2 vCPU | 4 vCPU |
| Memoria RAM | 4 GB | 8 GB o más |
| Almacenamiento | 40 GB SSD/NVMe | 80 GB NVMe |
| Transferencia | 1 TB/mes | 2 TB/mes o más |
| Sistema operativo | Ubuntu 24.04 LTS | Ubuntu 24.04 LTS |
| Acceso root | Sí | Sí |
| Snapshots | Deseable | Muy recomendable |
| Backup automático | Opcional | Recomendable |
Configuración recomendada según el uso
| Caracteristica | Laboratorio básico | Laboratorio profesional | Laboratorio Avanzado |
|---|---|---|---|
| CPU | 2 | 4 | 8 |
| RAM | 4 GB | 8 GB | 16 GB |
| NVMe | 40 GB | 80 GB | 160 GBNVMe |
| Adecuado para: | Linux, SSH, Python, GitHub Actions, Docker Básico | Docker Compose, FastAPI, MLflow, PostgreSQL, DVC, Entrenamiento de modelos moderados. | Múltiples contenedores, Airflow, Kubeflow ligero, procesamiento intensivo. |
Proveedores recomendados
- Hetzner Cloud
- Contabo
- DigitalOcean
- Vultr
- OVHcloud
- AWS EC2
- Google Cloud
- Microsoft Azure
Características del VPS elegido
Cloud VPS 20 de Contabo
| Característica | Especificación |
|---|---|
| vCPU Cores | 6 núcleos (AMD EPYC) |
| RAM | 12 GB |
| Almacenamiento | 200 GB SSD (o 100 GB NVMe) |
| Velocidad de Puerto | 300 Mbit/s |
| Tráfico | Ilimitado (inbound + outbound) |
| Snapshots | 2 snapshots incluidos |
| Virtualización | KVM |
| Sistema Operativo | Ubuntu Server 24.04 LTS |
| IP | 1 IPv4 dedicada |
| DDoS Protection | Siempre activada (gratis) |
| Precio Base | €7.00 / mes + IVA, €5.60/año + IVA |
Una vez completada la suscripción del servicio, nos llegan al correo las credenciales y dirección IP en aproximadamente 30 min. En la consola ya podemos realizar la primera conexión con ssh:
ssh root@IP_DEL_SERVIDORssh: El programa que establece la conexión segura y cifrada.root: El nombre de usuario con el que quieres entrar. En este caso, es el superusuario (el que tiene control total sobre el servidor).@203.0.113.10: La dirección IP del servidor remoto al que te quieres conectar.
Primeras acciones después de activar tu VPS
Actualizar el sistema
sudo apt update && sudo apt upgrade -ysudo: te da permisos de administrador para poder realizar cambios en el sistema.apt update: descarga la información más reciente sobre qué programas tienen versiones nuevas disponibles. No instala nada, solo actualiza la lista.&&: Es un conector lógico. Le dice a la terminal: “si el primer comando termina con éxito, ejecuta el siguiente inmediatamente”.apt upgrade: Compara tus programas instalados con la lista nueva y descarga e instala las actualizaciones.-y: Significa “Yes” (Sí). Responde automáticamente que sí a la pregunta de confirmación, así no tienes que presionar ninguna tecla para que la instalación continúe.
Crear un usuario administrativo
adduser usuario
usermod -aG sudo usuarioadduser usuario: Crea una cuenta de usuario nueva llamada “usuario”.- Te pedirá que establezcas una contraseña.
- Creará automáticamente su carpeta personal (
/home/usuario) y configurará los archivos básicos del entorno.
usermod -aG sudo usuario: Le otorga permisos de administrador.-aG sudo: Añade (-ade append) al usuario al grupo (-G) llamado sudo.- Esto permite que el nuevo usuario pueda ejecutar comandos con
sudo(como el de actualización que vimos antes) usando su propia contraseña.
- Después de ejecutar estos comandos, el nuevo usuario debe cerrar sesión y volver a entrar para que los permisos de administrador se activen.
Configurar la autenticación basada en llaves (en lugar de usar contraseñas).
En tu equipo local:
ssh-keygen -t ed25519 -C "[email protected]"Este comando se usa para crear un nuevo par de llaves SSH, que es una forma mucho más segura (y cómoda) de entrar a tu servidor que usar una contraseña tradicional.
ssh-keygen: La herramienta para generar las llaves.-t ed25519: Especifica el tipo de algoritmo. Ed25519 es el estándar moderno más recomendado porque es increíblemente seguro, rápido y genera llaves cortas.-C "[email protected]": Añade una etiqueta o comentario (normalmente tu email) al final de la llave pública para que sepas a quién pertenece cuando la veas en el servidor.
Cuando se ejecute el comando, te pregunta si guarda la clave en la ubicación por defecto: ~/.ssh/id_ed25519 (presiona Enter para aceptar). Luego te pedirá una “frase de paso” (opcional). Es una contraseña extra para proteger tu llave privada si alguien robara tu ordenador. Como resultado se crearán dos archivos en tu carpeta .ssh:
id_ed25519.pub(Llave Pública): Es como el candado. Esta es la que debes copiar al servidor para poder entrar sin contraseña.id_ed25519(Llave Privada): Es como tu llave física. Nunca la compartas ni la subas a ningún sitio.
Instalación de la llave pública en el servidor (o SSH Key Deployment).
Si usas Linux:
ssh-copy-id user@IP_DEL_SERVIDOR
Si usas Windows:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@IP_DEL_SERVIDOR "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"- Este código se conecta al servidor remoto usando tu contraseña por última vez.
- Copia el contenido de tu llave pública (
~/.ssh/id_ed25519.pub) al servidor. - Lo agrega automáticamente en un archivo especial llamado
~/.ssh/authorized_keysdentro de la carpeta del usuario remoto. - Configura los permisos correctos de las carpetas para que el servidor acepte la llave.
A partir de este momento, cuando escribas ssh user@IP_DEL_SERVIDOR, el servidor reconocerá tu “candado” y te dejará entrar sin pedirte contraseña, o si configuras una palabra de paso (passphrase) te la pedirá al loguearte.
Copiar tu llave privada a un pendrive
Puedes copiar tu llave privada a un pendrive y luego usarla en otro ordenador desde la consola de Windows (PowerShell). Supongamos que tu pendrive es la unidad D: Ejecuta esto en PowerShell:
# Crear una carpeta en el pendrive para la llave
mkdir D:\mykeys
# Copiar la llave privada
copy $env:USERPROFILE\.ssh\id_ed25519 D:\mykeys\Cómo usarla desde otro ordenador
Cuando estés en el otro ordenador y quieras conectarte a tu servidor usando la llave del pendrive puedes apuntar a ella directamente al conectarte:
# Windows
ssh -i D:\mykeys\id_ed25519 user@IP_DEL_SERVIDOR
# Linux
ssh -i /media/tu_usuario/NOMBRE_USB/mykeys/id_ed25519 user@IP_DEL_SERVIDOR
Fortalecer SSH (SSH Hardening).
El SSH Hardening es un conjunto de configuraciones de seguridad aplicadas al servicio de acceso remoto para evitar ataques. Por defecto, SSH es como una puerta con una cerradura estándar; el hardening es como poner una puerta blindada, cambiar la cerradura por un lector de huellas y ocultar la ubicación de la casa.
El objetivo principal es pasar de una autenticación basada en “algo que sabes” (contraseñas, que pueden ser adivinadas o robadas) a “algo que tienes” (una llave criptográfica única).
Los 3 Pilares del Fortalecimiento
- Eliminación de contraseñas: Se desactiva la posibilidad de loguearse con clave, obligando al uso de llaves SSH (Ed25519).
- Restricción de privilegios: Se prohíbe el acceso directo al usuario
root. Debes entrar con un usuario normal y escalar privilegios solo cuando sea necesario. - Reducción de exposición: Se configuran parámetros para que el servidor ignore intentos de conexión malintencionados.
Riesgos y Cómo evitarlos:
| Riesgo | Explicación | Cómo evitarlo |
|---|---|---|
| Bloqueo Total (Lockout) | Si tu ordenador se rompe o pierdes tu llave privada, no podrás entrar al servidor porque las contraseñas están desactivadas. | Guarda una copia de tu llave privada en un gestor de contraseñas o en un USB cifrado. |
| Robo de Llave Privada | Si alguien copia tu archivo id_ed25519, puede entrar a tu servidor sin esfuerzo. | Ponle una passphrase (contraseña) a tu llave al generarla. Así, aunque la roben, no podrán usarla sin la clave. |
| Cambio de IP del Servidor | Si el servidor cambia de IP y no tienes acceso físico, la llave SSH no servirá de nada si no sabes dónde conectar. | Usa una IP estática o un nombre de dominio (DNS) vinculado a tu servidor. |
Visto lo anterior, si necesitas tener una buena seguridad en tu VPS, realiza las siguientes tareas:
Ejecuta el siguiente comando en una terminal para editar el fichero sshd_config. (sustituye ? por i).
sudo nano /etc/ssh/sshd_conf?gSi deseas eliminar la entrada por contraseñas, realiza los siguientes cambios:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yesPermitRootLogin no: Prohíbe que alguien intente entrar directamente comoroot. Ahora es obligatorio entrar con tu usuario normal (user) y luego usarsudo. Esto frena miles de ataques automatizados que prueban contraseñas contra el usuario root.PasswordAuthentication no: Esta es la medida más importante. Desactiva las contraseñas por completo para SSH. A partir de ahora, si alguien no tiene tu archivo de llave privada, no podrá entrar aunque adivine tu contraseña.PubkeyAuthentication yes: Asegura que el sistema permita el acceso mediante el par de llaves (pública/privada) que configuraste antes.sudo systemctl restart ssh: Aplica los cambios inmediatamente.
¡Aviso muy importante! No toques esa ventana de la terminal después de reiniciar el servidor ssh. Úsala como “salvavidas”. Si algo falla, desde ahí puedes volver a abrir el archivo de configuración y arreglarlo.
Reinicia el servidor ssh.
sudo systemctl restart sshAbre una ventana de PowerShell (en Windows) o una terminal nueva (en Linux/Mac) totalmente independiente de la primera. Intenta conectar desde la nueva ventana:
ssh user@IP_DEL_SERVIDOR<br>Analiza el resultado:
- Si entras directamente (o te pide la contraseña de tu llave): ¡Éxito! El hardening funciona. Ahora sí puedes cerrar todas las sesiones.
- Si te pide la contraseña del usuario “fernan” (la de texto): algo falló. El servidor sigue aceptando contraseñas. Revisa que pusiste
PasswordAuthentication no. - Si te dice “Permission denied (publickey)”: ¡Cuidado! El servidor ha bloqueado las contraseñas, pero no reconoce tu llave.
¿Qué hacer si falla?: Como tienes la primera ventana todavía abierta, vuelve a ella y:
- Revisa el archivo:
sudo nano /etc/ssh/sshd_con* - Asegúrate de que tu llave pública esté en
~/.ssh/authorized_keys. - Reinicia de nuevo:
sudo systemctl restart ssh. - Vuelve a probar en la segunda ventana.
Configurar Firewall UFW
Configurar y activar el firewall (cortafuegos) de tu servidor, asegurándote de que no te bloquee el acceso SSH que acabas de configurar.
sudo ufw allow OpenSSH
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw statussudo ufw allow OpenSSH: Crea una regla que permite el tráfico para el perfil “OpenSSH”. Es la forma más recomendada porque el sistema ya sabe qué puertos usa SSH por defecto.sudo ufw allow 22/tcp: Hace casi lo mismo que el anterior, pero de forma manual especificando el puerto 22 y el protocolo TCP. Es redundante si ya hiciste el anterior, pero sirve como refuerzo.sudo ufw enable: Activa el firewall.- Al ejecutar el comando, te lanzará un aviso: “Command may disrupt existing ssh connections. Proceed with y/n?”. Escribe
yy presiona Enter. Como ya permitiste el puerto 22 en los pasos anteriores, no perderás la conexión.
- Al ejecutar el comando, te lanzará un aviso: “Command may disrupt existing ssh connections. Proceed with y/n?”. Escribe
sudo ufw status: Te muestra la lista de reglas activas para confirmar que el puerto 22 (SSH) está en modo ALLOW (Permitido).
Si en el futuro decides cambiar el puerto de SSH (por ejemplo al 2222) para evitar ataques automáticos, primero deberás hacer un sudo ufw allow 2222/tcp antes de cambiar la configuración del servidor, o te quedarás fuera.
Instalar Fail2Ban
Fail2Ban es un Framework de Prevención de Intrusiones (IPS) ligero y modular, escrito en Python. Su función técnica no es solo vigilar, sino actuar como una capa de automatización de políticas de red. En lugar de depender de la intervención manual de un administrador para bloquear ataques, Fail2Ban establece un puente entre el análisis de logs (aplicación) y la gestión de paquetes (red).
Características Técnicas
- Persistencia: Permite mantener bases de datos de atacantes recurrentes, lo que ayuda a identificar patrones de ataque persistentes y a establecer prohibiciones a largo plazo para IPs con comportamiento malicioso sistemático.
- Arquitectura Basada en Jails (Jaulas): Permite configurar entornos aislados para cada servicio (SSH, Nginx, MySQL). Cada “jail” combina un filtro (la expresión regular que busca el error) con una acción (la respuesta del firewall).
- Gestión Dinámica de Reglas Netfilter: A diferencia de las reglas estáticas de un firewall tradicional, Fail2Ban inyecta y remueve reglas en las tablas de
iptablesonftablesdinámicamente, minimizando el impacto en el rendimiento del sistema. - Multiservicio: Aunque su uso más común es SSH, es estándar en la industria para mitigar ataques de denegación de servicio (DDoS) a nivel de aplicación en servidores web, intentos de inyección en bases de datos y ataques de fuerza bruta en servidores de correo.
Instala el paquete desde los repositorios oficiales:
sudo apt update
sudo apt install fail2ban -yConfiguración (Crear tu “Jail”):
Para esto lo correcto es crear una copia local llamada jail.local. Nunca edites el archivo jail.conf directamente, ya que se sobrescribe al actualizar.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.localBusca la sección [sshd] y déjala configurada así (puedes borrar lo que haya o simplemente añadir estas líneas):
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600¿Qué significan estos valores?
maxretry = 3: El bot tiene solo 3 oportunidades antes del bloqueo.findtime = 600: Los 3 fallos deben ocurrir en una ventana de 10 minutos.bantime = 3600: Si falla, se le prohíbe la entrada por 1 hora (3600 segundos).
Activar y Verificar
Guarda el archivo y reinicia el servicio para aplicar los cambios:
sudo systemctl restart fail2ban
sudo systemctl enable fail2banVerifica que esté funcionando:
sudo fail2ban-client status sshdImportante: No te bloquees a ti mismo
Si te equivocas de contraseña 3 veces, tú también serás bloqueado. Para evitarlo, busca la línea ignoreip en tu archivo jail.local y añade tu IP local.
ignoreip = 127.0.0.1/8 ::1 TU_IP_AQUÍSi te quedas fuera por error o bloqueas a un compañero, puedes liberar la IP inmediatamente con este comando:
sudo fail2ban-client set sshd unbanip TU_IP_AQUÍSi no estás seguro de qué IPs están baneadas en este momento, primero listalas con:
sudo fail2ban-client status sshdConfigurar zona horaria
Comprobar la zona horaria del servidor
timedatectlEstablecer tu zona horaria, en mi caso Islas Canarias
sudo timedatectl set-timezone Atlantic/CanaryHerramientas útiles para administrar un VPS
Estas utilidades son ampliamente utilizadas en administración de sistemas, DevOps y operaciones.
- tmux — Permite mantener sesiones de terminal persistentes y ejecutar procesos largos aunque se cierre la conexión SSH.
- htop — Monitor interactivo de procesos para visualizar CPU, memoria y procesos en tiempo real.
- btop — Monitor avanzado del sistema con métricas de CPU, RAM, disco y red.
- tree — Muestra la estructura de directorios en formato de árbol.
- jq — Procesa y filtra datos JSON desde la línea de comandos.
- ncdu — Analiza el uso del disco y muestra qué directorios ocupan más espacio.
- rsync — Sincroniza archivos y directorios de forma eficiente, ideal para backups y despliegues.
- lsof — Muestra qué procesos tienen abiertos archivos, sockets y puertos.
- dnsutils — Incluye herramientas como
digynslookuppara diagnosticar DNS. - mtr — Analiza conectividad de red combinando
pingytraceroute. - sysstat — Proporciona herramientas como
iostat,sarympstatpara análisis de rendimiento. - ufw — Firewall simplificado para gestionar reglas de red.
- fail2ban — Bloquea automáticamente IPs con intentos repetidos de acceso fallido.
- unattended-upgrades — Instala automáticamente actualizaciones de seguridad del sistema.
- tcpdump — Captura y analiza tráfico de red a bajo nivel.
- iotop — Muestra qué procesos están generando actividad de lectura/escritura en disco.
- bash-completion — Añade autocompletado avanzado para comandos y opciones en Bash.
- git — Sistema de control de versiones para clonar y gestionar repositorios.
- curl — Herramienta para realizar peticiones HTTP y descargar contenido.
- wget — Utilidad para descargar archivos desde Internet.
Portal de proyectos para el VPS
Agrega un sitio web alojado en el vps donde tengas los proyectos que vayas realizando. Puedes ver este proyecto aquí.