Tu primera hora con el VPS: guía completa de bare metal a seguro y listo (haz que tu OpenClaw sea más seguro)
Un VPS recién comprado es como una puerta sin cerradura, y hay script kiddies por todo el mundo tocando el timbre. En este post te enseño a ponerle buen cerrojo. Para que tu openclaw no salga correteando por ahí.
0. Antes de empezar
Acabas de comprar un VPS, te emocionas al recibir la IP y la contraseña de root, ¿y luego qué?
Lo que hace mucha gente es: empezar a instalar software y desplegar el proyecto directamente.
Ese es un hábito peligroso.
Tu VPS tiene una IP pública, lo que significa que cualquier persona en el mundo puede intentar conectarse a él. Y con la configuración por defecto:
- El puerto expuesto es el 22
- El usuario es el archiconocido root
- Solo te queda una contraseña para protegerte
Cada día, infinidad de scripts automatizados están escaneando rangos de IPs, intentando ataques de fuerza bruta con contraseñas comunes. Desde el instante en que tu servidor se conecta, ya está bajo ataque.
Por eso, lo primero que debes hacer al recibir tu VPS no es instalar software, sino dejar la seguridad a punto.
1. Nuestro objetivo
El objetivo de este artículo es:
- ✅ Montar acceso remoto seguro: login con llaves SSH + un puerto que no sea el de por defecto
- ✅ Crear un usuario normal: evita usar root directamente
- ✅ Configurar el firewall: abre solo los puertos imprescindibles
- ✅ Activar la aceleración de red: con BBR la conexión sale volando
- ✅ Frenar los ataques de fuerza bruta: fail2ban banea solito las IPs maliciosas
Con todo esto listo, tu VPS va a tener una base sólida para que puedas desplegar servicios con tranquilidad.
2. Plan y reflexión
¿Por qué hacer toda esta configuración?
Un VPS recién comprado es como un piso recién entregado, a medio terminar:
| Estado por defecto | Riesgo | Nuestra solución |
|---|---|---|
| Acceso directo con usuario root | Privilegios excesivos, un error puede ser fatal | Crear usuario normal + sudo |
| Acceso por contraseña | Vulnerable a ataques de fuerza bruta | Acceso SSH con llaves |
| Puerto 22 por defecto | Es el primer objetivo de los escáneres | Cambiar a un puerto no estándar |
| Firewall apagado | Todos los puertos expuestos | UFW para abrir solo lo necesario |
| Red nativa | Alta pérdida de paquetes y mucha latencia | Algoritmo de control de congestión BBR |
Flujo general

Vamos a seguir este orden paso a paso, y te explicaré el porqué de cada cosa.
3. Pasos a seguir
3.1 Primer acceso y actualización del sistema
Conseguir la IP del servidor
Una vez que compras el VPS, tu proveedor te va a dar:
- Dirección IP: por ejemplo
192.168.1.100 - Puerto: normalmente es
22(algunos proveedores lo cambian por otro) - Usuario: por lo general
root - Contraseña: una cadena de caracteres generada aleatoriamente

Conexión por SSH
Usuarios de Mac / Linux: abran la terminal y escriban directamente:
1 | ssh root@你的服务器IP |
Usuarios de Windows:
- Windows 10/11 ya incluye OpenSSH, así que pueden usar el comando anterior directamente en PowerShell o CMD
- O pueden usar herramientas como Termius, MobaXterm
La primera vez que se conecten verán un mensaje para confirmar la huella digital:
1 | The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established. |
Básicamente les pregunta: «No conozco esta máquina, ¿seguro que quieres conectarte?»
Escriban yes y presionen Enter. Luego escriban la contraseña (ojo: al escribirla no se muestra ningún carácter, es una medida de seguridad totalmente normal) y presionen Enter.

Si ven un mensaje parecido a este, ¡ya están dentro!:
1 | Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.x.x-x-generic x86_64) |
💡 ¿Por qué verificar la huella digital?
Para prevenir ataques de “man-in-the-middle”. La primera vez que te conectas, anotas la huella digital del servidor. Si en el futuro cambia al intentar conectarte, es una señal de que alguien podría estar suplantando tu servidor.

Conociendo tu servidor
Nada más iniciar sesión, échale un ojo al estado general de la máquina:
1 | # 查看系统版本 |

Guarda bien esta información, te hará falta más adelante cuando tengas que solucionar algún problema.
Actualización del sistema
Una vez que ya conoces la info de tu servidor, la primera tarea seria es actualizar el sistema. La imagen del sistema de un servidor nuevo puede tener ya unos meses, y es muy probable que se hayan publicado parches de seguridad desde entonces:
1 | # 更新软件包列表 + 升级所有软件 + 清理 |
Explicación de los parámetros:
apt update: actualiza el índice de paquetesapt full-upgrade: actualiza todos los paquetes, incluido el kernel-y: confirma automáticamente, así no tienes que escribir “yes” a manoapt autoremove: elimina las dependencias que ya no se necesitanapt autoclean: limpia la caché de los paquetes de instalación descargados

⏱️ Este paso puede tardar unos minutos, dependiendo de la cantidad de actualizaciones. Si te pide confirmación en algún momento, básicamente dile que sí y sigue la corriente.
Comprobar si hace falta reiniciar
Después de actualizar el kernel, normalmente hace falta reiniciar para que los cambios surtan efecto:
1 | # 检查是否需要重启 |

Si te sale un aviso de que hay que reiniciar:
1 | reboot |
Tras el reinicio, tendrás que volver a conectarte por SSH.
Instalar herramientas de uso común
1 | apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch |
¿Para qué sirven estas herramientas?:
| Herramienta | Uso | |
|---|---|---|
sudo |
Permite a usuarios normales ejecutar comandos de administrador | |
curl / wget |
Descargar archivos | |
git |
Control de versiones | |
vim |
Editor de texto | |
htop |
Monitor de procesos más visual | |
tree |
Muestra la estructura de directorios en forma de árbol | |
net-tools |
Herramientas de red (ifconfig, netstat, etc.) | |
ufw |
Un firewall sencillo y fácil de usar | |
fail2ban |
Protección contra ataques de fuerza bruta | |
neofetch |
Muestra la información del sistema de forma bonita | |
![]() |
3.2 Crear un usuario no root
¿Por qué no usar root directamente?
El usuario root tiene demasiados privilegios. Con un simple resbalón tecleando rm -rf /, puedes borrar todo sin remedio. Para el día a día, conviene usar un usuario normal y recurrir a sudo solo cuando necesites permisos de administrador.
La langosta (openclaw) es un monstruo, ¿cómo se te ocurre darle acceso root?
Crear el usuario
1 | # 创建用户(把 ittinker 换成你想要的用户名) |
El sistema te pedirá que establezcas una contraseña y algunos datos adicionales:
1 | New password: # 输入密码(不会显示) |

Otorgar permisos sudo
1 | # 把用户加入 sudo 组, ittinker 换成你自己上面创建的那个用户 |
Comprobemos que funciona:
1 | # 切换到新用户 ittinker 换成你自己上面创建的那个用户 |
Si el resultado es root, significa que sudo se configuró correctamente.

💡 Tip
Si escribes
exitvolverás al usuario root. Para los siguientes pasos seguiremos configurando como root y, al terminar, cambiaremos al usuario normal.
3.3 Configurar acceso por clave SSH
Autenticación por clave vs. por contraseña

La autenticación por clave es muchísimo más segura que la de contraseña:
- Las contraseñas se pueden crackear por fuerza bruta; adivinar una clave es prácticamente imposible
- No tienes que escribir la contraseña cada vez, lo cual es mucho más cómodo
- Aunque tu contraseña se filtre, sin la clave privada nadie podrá iniciar sesión
Paso 1: Generar el par de claves en tu equipo local
Ejecuta esto en tu ordenador (no en el servidor):
1 | # 生成 ED25519 密钥(推荐,更安全更快) |
Te saldrá este aviso:
1 | Enter file in which to save the key (/Users/你/.ssh/id_ed25519): |
Simplemente pulsa Enter para usar la ruta por defecto. Aquí hemos usado ./ittinker, lo que significa que se guardará en el directorio actual con el nombre ittinker.
1 | Enter passphrase (empty for no passphrase): |
Puedes ponerle una contraseña a la clave (para tener una capa extra de protección) o simplemente pulsar Enter y dejarlo en blanco.

Cuando termine, verás dos archivos en el directorio ~/.ssh/ (estos son los nombres por defecto, así te quedarán si has pulsado Enter antes):
id_ed25519: la clave privada, ¡que jamás debes filtrar!id_ed25519.pub: la clave pública, que tienes que subir al servidor
💡 ed25519 vs RSA
ed25519es el algoritmo recomendado a día de hoy: más seguro que el clásico RSA y con claves más cortas. Si tu sistema es muy antiguo y no lo soporta, puedes tirar porssh-keygen -t rsa -b 4096.
Un pequeño detalle: la clave que genera ed25519 es bastante más pequeña, mientras que el archivo de RSA es muy grande. Se lo pregunté a la IA y me enteré de que el tamaño da igual, lo que importa es el algoritmo.
Paso 2: Sube la clave pública al servidor
Método A: Usar ssh-copy-id (recomendado)
1 | # 在你的电脑上执行 |
Tras meter la contraseña, la clave pública se copiará al servidor automáticamente.

Método B: Copiar a mano
Si ssh-copy-id no te funciona, puedes hacerlo a mano:
1 | # 1. 在你的电脑上,查看公钥内容 |
Copia el texto que te arroja la consola (es una cadena bastante larga que empieza con ssh-ed25519).
1 | # 2. 在服务器上,为新用户创建 .ssh 目录, ittinker 换成你刚刚创建的用户名 |
⚠️ ¡Ojo con los permisos!
SSH es súper estricto con los permisos de los archivos:
- Directorio
.ssh: 700 (acceso exclusivo para ti)- Archivo
authorized_keys: 600 (lectura y escritura solo para ti)Si los permisos no están bien, SSH se negará en redondo a usar tu llave para iniciar sesión.
Paso 3: Probar el inicio de sesión con llave
Abre una ventana de terminal nueva (no cierres la original por si metes la pata y necesitas revertir los cambios) y prueba acceder con tu llave:
1 | ssh ittinker@你的服务器IP |
Si logras entrar sin que te pida la contraseña, ¡ya quedó lista la configuración de la llave! 🎉
(Si le pusiste una passphrase a tu llave privada, te pedirá esa contraseña; es un comportamiento totalmente normal)

Aquí le pasamos el parámetro -i porque esta llave no está en la ruta por defecto, sino en el directorio actual. Si no se lo especificamos, el sistema intentará usar la llave por defecto.
3.4 Reforzando la seguridad de SSH
Ya que el inicio de sesión con llave te funciona, vamos a blindar un poco más el SSH:
- Cambiar el puerto por defecto (para esquivar a los bots que escanean la red)
- Desactivar el inicio de sesión con contraseña
- Bloquear el acceso directo del usuario root
Editar el archivo de configuración de SSH
1 | # 备份原配置 |

Busca y modifica las siguientes opciones (algunas quizás estén comentadas, así que borra el # del principio):
1 | # 修改端口(选一个 1024-65535 之间的数字) |

Guarda y sal del editor (ctrl + o).
En Nano, para guardar es Ctrl + O; te pedirá el nombre del archivo, dale directamente Enter, y para salir es Ctrl + X.
Reiniciar el servicio SSH
1 | systemctl restart sshd.service |
⚠️ ¡Ojo con esto!
¡No cierres la terminal actual! Primero abre una ventana nueva y prueba si puedes iniciar sesión con la nueva configuración:
1 ssh -p 22000 yourname@你的服务器IPSi logras entrar, entonces ya puedes cerrar la ventana vieja. Si te quedas fuera, todavía puedes arreglar la configuración desde la sesión anterior.
Si compraste un servidor ligero, lo más probable es que este puerto no se pueda cambiar; en cambio, los servidores ECS tradicionales sí lo permiten. Tenlo en cuenta.
3.5 Configurar el firewall UFW

UFW (Uncomplicated Firewall) es la herramienta de firewall que viene por defecto en Ubuntu. Es súper fácil de configurar, pero potente a la vez.
Configuración básica
1 | # 设置默认策略:拒绝所有入站,允许所有出站 |
Activar el firewall
1 | ufw enable |
Te mostrará este mensaje:
1 | Command may disrupt existing ssh connections. Proceed with operation (y|n)? |
Escribe y para confirmar.
Comprobar el estado
1 | ufw status verbose |

El 23022 fue un error de tipeo mío, simplemente ajusten eso según su propio caso.
La salida será algo como:
1 | Status: active |
Chuleta de comandos habituales
1 | # 查看状态 |
3.6 Activar la aceleración BBR
BBR (Bottleneck Bandwidth and Round-trip propagation time) es un algoritmo de control de congestión TCP desarrollado por Google que mejora significativamente el rendimiento de la red.
Activarlo con un solo comando
1 | # 添加 BBR 配置 |
Verificar si está activado
1 | # 查看当前拥塞控制算法 |
La salida debería ser:
1 | net.ipv4.tcp_congestion_control = bbr |
1 | # 确认 BBR 模块已加载 |
La salida será algo como:
1 | tcp_bbr 20480 3 |
💡 El efecto de BBR
Tras activar BBR, especialmente en entornos con red inestable o alta latencia, notarás claramente:
- Descargas más rápidas
- Operaciones SSH más fluidas
- Carga de páginas más veloz

3.7 Configurar fail2ban para prevenir ataques de fuerza bruta
fail2ban monitoriza los registros y, si detecta una IP con múltiples intentos de inicio de sesión fallidos, la bloquea automáticamente.
Configuración básica
1 | # 复制默认配置(不要直接修改 jail.conf) |
Busca la sección [sshd] y asegúrate de tener la siguiente configuración:
1 | [sshd] |

Levantar el servicio
1 | # 重启 fail2ban |
Revisar el estado
1 | # 查看 fail2ban 状态 |

El resultado será algo parecido a esto:
1 | Status for the jail: sshd |
Comandos más usados
1 | # 手动封禁 IP |
3.8 [Opcional] Gestionar varios servidores con SSH Config
Si tienes varios servidores, escribir ssh -p 22000 user@ip cada vez es un rollo. Puedes usar SSH Config para simplificarlo.
Archivo de configuración
Edita ~/.ssh/config en tu computadora local:
1 | vim ~/.ssh/config |
Añade la configuración:
1 | # 第一台服务器 |
Cómo usarlo
Ahora puedes conectarte directamente usando el alias:
1 | # 连接第一台服务器 |
¡Te ahorras tener que memorizar la IP, el puerto y el nombre de usuario!
3.9 [Opcional] Permitir el acceso solo desde Cloudflare
Si tu web está completamente detrás de Cloudflare, puedes configurar el firewall para que solo las IP de Cloudflare puedan acceder a los puertos 80/443 y darle un extra de seguridad.
⚠️ Ojo: para esta configuración, tu dominio ya debe estar apuntando a Cloudflare CDN.
Script de configuración automática
1 | # 下载脚本 |
Este script se encarga de:
- Consigue los rangos de IP más recientes desde la página oficial de Cloudflare
- Añade reglas en UFW para que solo esas IPs puedan acceder a los puertos 80/443
- Recarga UFW
Programar actualizaciones automáticas
Los rangos de IP de Cloudflare pueden cambiar, así que vamos a configurar una actualización automática semanal:
1 | # 添加 cron 任务(每周一凌晨执行) |
3.10 Configurar la zona horaria
La zona horaria por defecto seguramente sea UTC. Cámbiala a tu zona local para que te sea más cómodo leer los logs:
1 | # 查看当前时区 |

3.11 [Opcional] Configurar actualizaciones de seguridad automáticas
Deja que el sistema instale los parches de seguridad por su cuenta y olídate de hacerlo a mano cada vez:
1 | # 安装自动更新工具 |
Selecciona «Sí» para activar las actualizaciones automáticas.
💡 Esta función instala automáticamente las actualizaciones de seguridad, pero no te subirá a versiones mayores nuevas, así que es bastante seguro.
4. Resumen
Checklist de inicialización
Cuando termines toda la configuración anterior, repasa todo con esta checklist:
| Verificación | Comando | Resultado esperado |
|---|---|---|
| Sistema actualizado | apt update && apt list --upgradable |
No hay paquetes para actualizar |
| Usuario normal puede usar sudo | sudo whoami |
Devuelve root |
| Login por clave funciona | ssh yourname@ip -p port |
Entra sin pedir contraseña |
| Login por contraseña deshabilitado | grep PasswordAuth /etc/ssh/sshd_config |
PasswordAuthentication no |
| Puerto SSH modificado | grep Port /etc/ssh/sshd_config |
El puerto que configuraste |
| Firewall activado | ufw status |
Status: active |
| BBR activado | sysctl net.ipv4.tcp_congestion_control |
= bbr |
| fail2ban en ejecución | systemctl status fail2ban |
active (running) |
| Zona horaria configurada | timedatectl |
Asia/Shanghai o tu zona horaria |
| Config SSH local | cat ~/.ssh/config |
Alias del servidor configurado |
Ubicación de archivos clave
1 | /etc/ssh/sshd_config # SSH 服务端配置 |
Mejores prácticas de seguridad
- Actualiza el sistema regularmente:
apt update && apt upgrade - Revisa los logs de acceso con frecuencia:
lastb(logins fallidos),last(logins exitosos) - Mantente al tanto de los bloqueos de fail2ban
- Haz siempre un backup antes de tocar archivos de configuración importantes
5. Registro de incidencias
Q1: ¿Falló el login por clave y te sigue pidiendo contraseña?
Posibles causas:
-
Problema de permisos (lo más común)
1
2
3# 检查并修复权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys -
La clave pública no se copió correctamente
1
2
3# 检查 authorized_keys 内容
cat ~/.ssh/authorized_keys
# 应该是一行完整的公钥,以 ssh-ed25519 或 ssh-rsa 开头 -
Interferencia de SELinux (sistemas CentOS/RHEL)
1
restorecon -Rv ~/.ssh
Q2: ¿No puedes conectarte después de cambiar el puerto?
Pasos para revisar:
-
Confirma que el nuevo puerto esté abierto en el firewall:
1
ufw status | grep 你的端口
-
Verifica que la configuración de SSH esté correcta:
1
grep Port /etc/ssh/sshd_config
-
Asegúrate de que el servicio SSH esté corriendo:
1
systemctl status sshd
-
Si no hay forma de conectarse, entra por la consola VNC de tu proveedor para arreglarlo.
Q2.5: ¿El cambio de puerto no surte efecto? (Servidores ligeros en la nube)
Síntoma: Modificaste /etc/ssh/sshd_config, pero al reiniciar el servicio el puerto 22 sigue activo y el nuevo puerto no funciona.
Cómo diagnosticarlo:
bash
1 | # 查看是谁在监听 22 端口 |
Si el resultado es algo como:
1 | tcp 0 0.0.0.0:22 0.0.0.0:* LISTEN 1/init |
Significa que el puerto 22 lo está escuchando init (PID 1), y no el proceso de sshd.
Motivo: En algunos proveedores de nube, el SSH de los «servidores de aplicaciones ligeros» o «instancias de contenedor» pasa por un proxy a nivel de plataforma, así que la configuración de sshd dentro de tu servidor no hace nada.
Solución:
| Tipo de instancia | Cómo cambiar el puerto SSH |
|---|---|
| ECS tradicional | Modificar sshd_config ✅ |
| Servidor ligero | Puede que tengas que cambiarlo desde el panel de la nube, o que directamente no se pueda |
| Instancia de contenedor | Normalmente no se puede cambiar |
Si tu instancia no soporta cambiar el puerto, las demás medidas de seguridad pesan más:
- ✅ Crear un usuario normal + deshabilitar el login de root
- ✅ Login por clave SSH + deshabilitar el login por contraseña
- ✅ fail2ban para frenar los ataques de fuerza bruta
Si aplicas bien estas medidas, la seguridad sigue siendo alta.
Q3: ¿fail2ban me bloqueó a mí mismo?
1 | # 用 VNC 登录后解封 |
Q4: ¿UFW dejó el sitio inaccesible tras activarlo?
1 | # 检查 80/443 是否开放 |
Q5: ¿Al ejecutar un comando te dice que no encuentra sudo?
La instalación mínima de Debian puede no traer sudo; instálalo como root:
1 | apt install sudo |
6. Script de inicialización con un clic (para cuando ya le tengas agarre)
Si ya te sientes cómodo con los pasos anteriores, usa este script para inicializar rápido.
⚠️ Ojo: Antes de ejecutar el script, asegúrate de tener lista tu llave pública de SSH.
1 |
|
7. Con todo esto, ¿cuánto mejoró la seguridad?
| Paso | Qué hicimos | Por qué es importante |
|---|---|---|
| Actualizar el sistema | Instalar los últimos parches | Corrige vulnerabilidades conocidas |
| Crear un nuevo usuario | Dejar de usar root directamente | Reduce el riesgo de errores |
| Llaves SSH | Usar llaves en vez de contraseñas | Imposible de vulnerar por fuerza bruta |
| Cambiar el puerto | Esquivar el puerto 22 por defecto | Baja la probabilidad de que te escaneen |
| Deshabilitar contraseñas | Solo permitir login con llave | Elimina por completo los ataques de contraseñas |
| Deshabilitar root | root no puede iniciar sesión directo | Sube la dificultad para los atacantes |
| Firewall UFW | Abrir solo los puertos necesarios | Reduce la superficie de ataque |
| Aceleración BBR | Optimizar el rendimiento de red | Mejora la velocidad de acceso |
| fail2ban | Bloquear IPs maliciosas automáticamente | Previene ataques persistentes |
Con todo esto, la seguridad de tu servidor ya supera a la del 90% de los VPS.
Avance del próximo artículo
En el próximo artículo hablaremos sobre la Guía rápida de configuración para login con llaves SSH, donde veremos más a detalle:
- Cómo generar llaves en distintos sistemas
- Gestión de múltiples llaves
- Configuración de SSH Agent
| Ajustes comunes para clientes SSH
Este artículo se actualizó por última vez: enero de 2026
Serie sobre el kit de herramientas del indie dev. ¡No te pierdas las próximas entregas!




