VPS: qué es, configurar, SSH, seguridad y DNS
VPS: qué es, configurar, SSH, seguridad y DNS
[!tip] VPS en una frase Un VPS (Virtual Private Server) es un servidor virtual dedicado dentro de un servidor físico. Lo controlas completamente — sistema operativo, firewall, servicios — sin compartir recursos con otros usuarios.
¿Qué es un VPS?
Un VPS es una máquina virtual dedicada creada por virtualización (KVM, VMware, Xen). Compartes el hardware físico con otros VPS, pero cada uno tiene su propio:
- Sistema operativo
- CPU (reservado o compartido)
- Memoria RAM
- Disco
- Dirección IP
- Acceso root completo
VPS vs Hosting compartido vs Cloud
| Shared Hosting | VPS | Cloud (AWS EC2, etc.) | Bare Metal | |
|---|---|---|---|---|
| Control | Limitado (cPanel) | Completo (root) | Completo | Completo |
| Rendimiento | Compartido | Reservado o compartido | Reservado | 100% dedicado |
| Escalabilidad | Baja (cambiar plan) | Media (upgrade plan) | Alta (escalar en minutos) | Baja (cambiar hardware) |
| Precio | $2-10/mes | $5-50/mes | $5-500+/mes | $50-500+/mes |
| Configuración | Preconfigurado | Desde cero | Desde cero | Desde cero |
| Uso típico | Blogs, sitios simples | APIs, apps, bases de datos | Producción escalable | High performance |
Proveedores de VPS populares
| Proveedor | Precio desde | Características |
|---|---|---|
| DigitalOcean | $4/mes | Simple, good docs, droplets |
| Linode (Akamai) | $5/mos | Simple, buen soporte |
| Vultr | $2.50/mes | Muchos locations, high-frequency |
| Hetzner | €3.99/mes | Excelente precio/rendimiento (EU/US) |
| AWS EC2 | $0.01/hr | Enterprise, todo incluido, complejo |
| Google Cloud | $0.011/hr | Good ML tools, GCP integration |
| Azure | $0.0084/hr | Enterprise, Microsoft ecosystem |
| Contabo | €3.99/mes | Mucha RAM/Disk por precio |
Primeros pasos: configurar un VPS
1. Elegir el plan
Para empezar (proyectos personales):
- CPU: 1-2 vCPUs
- RAM: 1-2 GB
- Disk: 25-50 GB SSD
- OS: Ubuntu 22.04 LTS o Debian 12
- Location: más cercano a tus usuarios
Para producción (APIs, apps):
- CPU: 2-4 vCPUs
- RAM: 4-8 GB
- Disk: 80-100 GB NVMe
- OS: Ubuntu 22.04 LTS o Debian 12
- Location: múltiples regiones si posible
2. Conexión inicial
# Conectar por SSH (el proveedor te da IP + password)
ssh root@TU_IP_DEL_VPS
# Una vez dentro, crear usuario:
useradd -m -s /bin/bash tu_usuario
passwd tu_usuario
# Dar privilegios sudo:
usermod -aG sudo tu_usuario
# O en Debian:
usermod -aG wheel tu_usuario
# Probar con tu nuevo usuario:
ssh tu_usuario@TU_IP_DEL_VPS3. Configuración básica del sistema
# Actualizar sistema
sudo apt update && sudo apt upgrade -y
# Instalar herramientas esenciales
sudo apt install -y curl wget git htop tmux unzip net-tools
# Configurar hostname
sudo hostnamectl set-hostname mi-servidor
# Configurar timezone
sudo timedatectl set-timezone America/Mexico_CitySSH: la herramienta esencial
SSH sin contraseña (claves SSH)
NUNCA uses contraseña para SSH en producción. Usa claves SSH.
# En tu computadora LOCAL (no en el VPS):
# Generar par de claves (si no tienes):
ssh-keygen -t ed25519 -C "tu@email.com"
# o con RSA (compatibilidad máxima):
ssh-keygen -t rsa -b 4096 -C "tu@email.com"
# Copiar la clave pública al VPS:
ssh-copy-id -i ~/.ssh/id_ed25519.pub tu_usuario@TU_IP_DEL_VPS
# O manualmente:
cat ~/.ssh/id_ed25519.pub
# Copia la salida y haz:
ssh root@TU_IP_DEL_VPS "mkdir -p ~/.ssh && echo 'PASTE_KEY_AQUI' >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"Archivos de configuración SSH
# ~/.ssh/config (en tu computadora local):
Host mi-vps
HostName TU_IP_DEL_VPS
User tu_usuario
IdentityFile ~/.ssh/id_ed25519
Port 22
ServerAliveInterval 60
ServerAliveCountMax 3
# Ahora puedes hacer:
ssh mi-vps
# /etc/ssh/sshd_config (en el VPS):
# Cambiar puerto (seguridad por oscuridad, ayuda contra bots)
Port 2222
# Desactivar login con contraseña
PasswordAuthentication no
# Desactivar login root
PermitRootLogin no
# Limitar usuarios con SSH
AllowUsers tu_usuario
# Timeout de inactividad
ClientAliveInterval 300
ClientAliveCountMax 2
# Número máximo de intentos
MaxAuthTries 3
# Usar solo SSH v2
Protocol 2
# Restart sshd después de cambiar config:
sudo systemctl restart sshdSSH con llave privada protegida por passphrase
# Al generar la clave:
ssh-keygen -t ed25519 -C "tu@email.com"
# Te pedirá un passphrase (recomendado)
# Para no escribir el passphrase cada vez:
ssh-add ~/.ssh/id_ed25519
# Se guarda en memoria (agent) hasta que reiniciasSSH Agent
# Agregar clave al agent
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# Ver claves cargadas
ssh-add -l
# SSH Agent forwarding (conectar a otro server desde tu VPS)
# En ~/.ssh/config:
Host mi-vps
HostName TU_IP_DEL_VPS
User tu_usuario
ForwardAgent yes
# Desde el VPS puedes SSH a otro server sin copiar la clave:
ssh otro-servidorHardening de seguridad del VPS
Firewall (UFW)
# Instalar UFW (Uncomplicated Firewall)
sudo apt install -y ufw
# Configurar políticas por defecto
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Permitir SSH (¡IMPORTANTE: hazlo antes de activar!)
sudo ufw allow 2222/tcp # O tu puerto SSH personalizado
# Permitir HTTP/HTTPS (si es un servidor web)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Activar firewall
sudo ufw enable
# Ver estado
sudo ufw status verbose
# Para añadir reglas adicionales:
sudo ufw allow from 192.168.1.0/24 # Solo tu red local
sudo ufw deny 8080/tcp # Bloquear un puerto específicoFail2Ban
Fail2Ban bloquea IPs que hacen muchos intentos fallidos de SSH:
# Instalar
sudo apt install -y fail2ban
# Configurar para SSH
sudo nano /etc/fail2ban/jail.local
# Contenido:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600 # 1 hora de ban
findtime = 600 # En 10 minutos
banaction = ufwSSH con llave + fail2ban + UFW = Seguridad básica
Capas de seguridad:
1. UFW: firewall básico (solo puertos necesarios abiertos)
2. SSH key-only: sin contraseña, solo llaves
3. Fail2Ban: bloquea IPs con intentos fallidos
4. Actualizaciones automáticas: security patches
5. Monitoreo de logs
Actualizaciones automáticas
# Instalar unattended-upgrades
sudo apt install -y unattended-upgrades
# Configurar
sudo dpkg-reconfigure -plow unattended-upgrades
# Ver logs
cat /var/log/unattended-upgrades/unattended-upgrades.logChroot SSH (ssh-chroot / jailing)
Para limitar qué puede hacer un usuario con SSH:
# Crear un jailing environment para usuarios SFTP
sudo useradd -m -s /bin/false sftp_user
sudo mkdir -p /home/sftp_user/uploads
sudo chown root:root /home/sftp_user
sudo chmod 755 /home/sftp_user
# Configurar SFTP-only en sshd_config:
# Match Group sftponly
# ChrootDirectory /home/%u
# ForceCommand internal-sftp
# AllowTcpForwarding noAudit de seguridad
# Ver puertos abiertos
sudo ss -tlnp
# Ver procesos corriendo
ps aux --sort=-%cpu | head -20
# Ver usuarios con shell
grep -v -E "^(#|$)" /etc/passwd | awk -F: '$7 ~ /bash|sh/ {print $1}'
# Ver servicios activos
sudo systemctl list-units --type=service --state=running
# Ver archivos con SUID
find / -perm -4000 -type f 2>/dev/null
# Ver conexiones activas
sudo ss -tnpSSH hardening checklist
✅ Cambiar puerto SSH de 22 a algo arbitrario
✅ Desactivar login root por SSH (PermitRootLogin no)
✅ Usar solo claves SSH (PasswordAuthentication no)
✅ Limitar usuarios con SSH (AllowUsers / AllowGroups)
✅ Configurar MaxAuthTries a 3
✅ Instalar y configurar fail2ban
✅ Configurar UFW firewall
✅ Actualizaciones automáticas activadas
✅ Monitorear logs con journalctl
✅ Backup del VPS
DNS para tu VPS
Configurar DNS en Cloudflare
# Ejemplo: tu VPS tiene IP 192.0.2.1
Tipo Name Value Proxy
───────────────────────────────────────────────────────
A @ 192.0.2.1 Proxied (naranja)
A www 192.0.2.1 Proxied (naranja)
AAAA @ 2001:db8::1 Proxied (si IPv6)
TXT @ v=spf1 include:_spf.google.com ~all
MX @ mail.ejemplo.com DNS only (10)
Configurar DNS en tu proveedor (DigitalOcean, Linode, etc.)
# Si NO usas Cloudflare, configuras DNS directamente en tu proveedor:
A @ 192.0.2.1 DNS only
A www 192.0.2.1 DNS only
AAAA @ 2001:db8::1 DNS only
CNAME mail mail.provider.com DNS only
TXT @ v=spf1 include:_spf.google.com ~all
DNS de tu VPS
# Configurar resolver DNS en el VPS:
sudo nano /etc/resolv.conf
# nameserver 1.1.1.1
# nameserver 8.8.8.8
# En systemd-resolved:
sudo nano /etc/systemd/resolved.conf
# [Resolve]
# DNS=1.1.1.1 8.8.8.8
# FallbackDNS=1.0.0.1 8.8.4.4Servidores web en tu VPS
Nginx
# Instalar Nginx
sudo apt install -y nginx
# Configurar sitio
sudo nano /etc/nginx/sites-available/mi-sitio
# Contenido:
server {
listen 80;
server_name ejemplo.com www.ejemplo.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name ejemplo.com www.ejemplo.com;
ssl_certificate /etc/letsencrypt/live/ejemplo.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ejemplo.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/mi-sitio;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location /api {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# Activar y reiniciar
sudo ln -s /etc/nginx/sites-available/mi-sitio /etc/nginx/sites-enabled/
sudo nginx -t # Verificar configuración
sudo systemctl restart nginxCaddy (auto-HTTPS)
# Caddyfile — Auto-HTTPS
ejemplo.com {
root * /var/www/mi-sitio
file_server
encode gzip
handle_path /api/* {
reverse_proxy localhost:3000
}
}
www.ejemplo.com {
redir https://ejemplo.com{uri}
}Docker en tu VPS
# Instalar Docker
curl -fsSL https://get.docker.com | sh
# Agregar usuario al grupo docker
sudo usermod -aG docker tu_usuario
# Instalar Docker Compose
sudo apt install -y docker-compose-plugin
# docker-compose.yml
version: '3.8'
services:
web:
build: ./frontend
ports:
- "8080:80"
api:
build: ./backend
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
db:
image: postgres:16
environment:
- POSTGRES_PASSWORD=secreto
volumes:
- pgdata:/var/lib/postgresql/data
redis:
image: redis:7
volumes:
pgdata:Monitoreo del VPS
Herramientas
# htop — monitor de procesos
sudo apt install -y htop
htop
# Prometheus + Node Exporter
# Instalar node_exporter para métricas del sistema
# Configurar Grafana para visualización
# Uptime Kuma — Monitoreo de uptime simple
docker run -d --restart=unless-stopped \
-v uptime-kuma:/app/data \
-p 3001:3001 \
louislam/uptime-kuma:1
# Prometheus + Grafana para métricas completas
# Node Exporter → Prometheus → GrafanaLogs
# Ver logs del sistema
journalctl -u nginx -f
journalctl -u ssh -f
journalctl -u docker -f
# Ver logs de fail2ban
journalctl -u fail2ban -f
# Buscar errores en los logs
journalctl -p err -bResumen
- Un VPS es un servidor virtual dedicado con control root completo
- Configura SSH con claves (no contraseñas) y cambia el puerto
- Usa UFW como firewall, fail2ban contra brute-force
- Desactiva login root por SSH
- Configura DNS apuntando al VPS
- Usa certificados Let's Encrypt (Certbot) o Caddy para HTTPS
- Monitorea con htop, Prometheus, Uptime Kuma
- Mantiene el sistema actualizado con unattended-upgrades
[!quote] La clave Un VPS te da control total. La seguridad empieza con SSH por claves, firewall, fail2ban, y actualizaciones automáticas. Desde ahí puedes instalar cualquier software que necesites.
Conexión con el resto de la wiki
| Concepto tocado | Artículo en profundidad |
|---|---|
| Cloudflare | [[19-cloudflare-completo]] (usar Cloudflare delante del VPS) |
| Certificados | [[08-lets-encrypt]] (Let's Encrypt en tu VPS) |
| Nginx | [[14-servidores-procesos]] (servidores como Nginx) |
| Docker | [[01-que-es-internet]] (contenedores en el VPS) |
| Puertos | [[12-puertos]] (qué puertos abrir en tu VPS) |
| Firewalls | [[17-firewalls-proxies-loadbalancers]] |