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

VPS初始化流程

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

VPS 服务商后台的登录信息页面

Conexión por SSH

Usuarios de Mac / Linux: abran la terminal y escriban directamente:

1
2
ssh root@你的服务器IP
# 例如:ssh [email protected]

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
2
3
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

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.

首次 SSH 连接的完整过程,包含指纹确认

Si ven un mensaje parecido a este, ¡ya están dentro!:

1
2
3
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.x.x-x-generic x86_64)
...
root@hostname:~#

💡 ¿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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看系统版本
cat /etc/os-release

# 查看内核版本
uname -r

# 查看 CPU 核心数和型号
nproc
lscpu | grep "Model name"

# 查看内存
free -h

# 查看磁盘
df -h

服务器基本信息输出

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
2
# 更新软件包列表 + 升级所有软件 + 清理
apt update && apt full-upgrade -y && apt autoremove -y && apt autoclean

Explicación de los parámetros:

  • apt update: actualiza el índice de paquetes
  • apt full-upgrade: actualiza todos los paquetes, incluido el kernel
  • -y: confirma automáticamente, así no tienes que escribir “yes” a mano
  • apt autoremove: elimina las dependencias que ya no se necesitan
  • apt autoclean: limpia la caché de los paquetes de instalación descargados

apt update 和 apt upgrade 执行过程

⏱️ 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
2
# 检查是否需要重启
cat /var/run/reboot-required 2>/dev/null && echo ">>> 需要重启" || echo ">>> 无需重启"

是否需要重启

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
neofetch 显示的系统信息

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
2
# 创建用户(把 ittinker 换成你想要的用户名)
adduser ittinker

El sistema te pedirá que establezcas una contraseña y algunos datos adicionales:

1
2
3
4
5
6
7
8
New password:              # 输入密码(不会显示)
Retype new password: # 再输入一次
Full Name []: # 可以直接回车跳过
Room Number []: # 回车跳过
Work Phone []: # 回车跳过
Home Phone []: # 回车跳过
Other []: # 回车跳过
Is the information correct? [Y/n] # 输入 Y 确认

adduser 创建用户的完整交互过程

Otorgar permisos sudo

1
2
# 把用户加入 sudo 组, ittinker 换成你自己上面创建的那个用户
usermod -aG sudo ittinker

Comprobemos que funciona:

1
2
3
4
5
# 切换到新用户 ittinker 换成你自己上面创建的那个用户
su - ittinker

# 测试 sudo 是否生效
sudo whoami

Si el resultado es root, significa que sudo se configuró correctamente.
测试sudo

💡 Tip

Si escribes exit volverá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

SSH密钥认证原理

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
2
# 生成 ED25519 密钥(推荐,更安全更快)
ssh-keygen -t ed25519 -C "[email protected]"

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.

本地生成 SSH 密钥的过程

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

ed25519 es 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 por ssh-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
2
# 在你的电脑上执行
ssh-copy-id -i ~/.ssh/id_ed25519.pub yourname@你的服务器IP

Tras meter la contraseña, la clave pública se copiará al servidor automáticamente.

ssh-copy-id 执行成功

Método B: Copiar a mano

Si ssh-copy-id no te funciona, puedes hacerlo a mano:

1
2
# 1. 在你的电脑上,查看公钥内容
cat ~/.ssh/id_ed25519.pub

Copia el texto que te arroja la consola (es una cadena bastante larga que empieza con ssh-ed25519).

1
2
3
4
5
6
7
8
9
10
11
# 2. 在服务器上,为新用户创建 .ssh 目录, ittinker 换成你刚刚创建的用户名
mkdir -p /home/ittinker/.ssh
chmod 700 /home/ittinker/.ssh

# 3. 创建 authorized_keys 文件并粘贴公钥
vim /home/ittinker/.ssh/authorized_keys
# 按 i 进入编辑模式,粘贴公钥,按 Esc,输入 :wq 保存退出

# 4. 设置正确的权限
chmod 600 /home/ittinker/.ssh/authorized_keys
chown -R ittinker:ittinker /home/ittinker/.ssh

⚠️ ¡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:

  1. Cambiar el puerto por defecto (para esquivar a los bots que escanean la red)
  2. Desactivar el inicio de sesión con contraseña
  3. Bloquear el acceso directo del usuario root

Editar el archivo de configuración de SSH

1
2
3
4
5
# 备份原配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 编辑配置
nano /etc/ssh/sshd_config

修改前

Busca y modifica las siguientes opciones (algunas quizás estén comentadas, así que borra el # del principio):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 修改端口(选一个 1024-65535 之间的数字)
Port 22000

# 禁止 root 登录
PermitRootLogin no

# 允许密钥登录
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 禁止密码登录(确保密钥登录测试成功后再改!)
PasswordAuthentication no

# 使用更安全的 SSH2 协议
Protocol 2

# 最大认证尝试次数
MaxAuthTries 3

# 客户端超时设置
ClientAliveInterval 300
ClientAliveCountMax 2

修改后的 sshd_config 关键配置

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@你的服务器IP

Si 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防火墙规则

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
2
3
4
5
6
7
8
9
10
11
# 设置默认策略:拒绝所有入站,允许所有出站
ufw default deny incoming
ufw default allow outgoing

# 允许 SSH(使用你设置的端口)
ufw allow 22000/tcp comment 'SSH'
ufw allow 22/tcp comment 'SSH' # 如果是轻量服务器,还是开22端口

# 允许 HTTP 和 HTTPS
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'

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

ufw status 的输出结果

El 23022 fue un error de tipeo mío, simplemente ajusten eso según su propio caso.

La salida será algo como:

1
2
3
4
5
6
7
8
9
10
11
12
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)

To Action From
-- ------ ----
22000/tcp (SSH) ALLOW IN Anywhere
80/tcp (HTTP) ALLOW IN Anywhere
443/tcp (HTTPS) ALLOW IN Anywhere
22000/tcp (SSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (HTTP (v6)) ALLOW IN Anywhere (v6)
443/tcp (HTTPS (v6)) ALLOW IN Anywhere (v6)

Chuleta de comandos habituales

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看状态
ufw status

# 添加规则
ufw allow 8080/tcp

# 删除规则
ufw delete allow 8080/tcp

# 允许特定 IP 访问所有端口
ufw allow from 192.168.1.100

# 禁用防火墙(不推荐)
ufw disable

# 重置所有规则
ufw reset

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
2
3
4
5
6
# 添加 BBR 配置
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

# 使配置生效
sysctl -p

Verificar si está activado

1
2
# 查看当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

La salida debería ser:

1
net.ipv4.tcp_congestion_control = bbr
1
2
# 确认 BBR 模块已加载
lsmod | grep 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

bbr 开启


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
2
3
4
5
# 复制默认配置(不要直接修改 jail.conf)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑配置
vim /etc/fail2ban/jail.local

Busca la sección [sshd] y asegúrate de tener la siguiente configuración:

1
2
3
4
5
6
7
8
[sshd]
enabled = true
port = 22000 # 改成你的 SSH 端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 最大尝试次数
bantime = 3600 # 封禁时间(秒),这里是 1 小时
findtime = 600 # 在这个时间窗口内

fail2ban

Levantar el servicio

1
2
3
4
5
# 重启 fail2ban
systemctl restart fail2ban

# 设置开机自启
systemctl enable fail2ban

Revisar el estado

1
2
3
4
5
# 查看 fail2ban 状态
fail2ban-client status

# 查看 SSH 监控状态
fail2ban-client status sshd

fail2ban-client status sshd 的输出

El resultado será algo parecido a esto:

1
2
3
4
5
6
7
8
9
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:

Comandos más usados

1
2
3
4
5
6
7
8
# 手动封禁 IP
fail2ban-client set sshd banip 1.2.3.4

# 手动解封 IP
fail2ban-client set sshd unbanip 1.2.3.4

# 查看被封禁的 IP
fail2ban-client status sshd

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 第一台服务器
Host vps1
HostName 192.168.1.100
User yourname
Port 22000
IdentityFile ~/.ssh/id_ed25519

# 第二台服务器
Host vps2
HostName 192.168.1.101
User admin
Port 22222
IdentityFile ~/.ssh/id_ed25519

# 通用设置(应用于所有连接)
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes

Cómo usarlo

Ahora puedes conectarte directamente usando el alias:

1
2
3
4
5
# 连接第一台服务器
ssh vps1

# 连接第二台服务器
ssh vps2

¡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
2
3
4
5
6
7
8
# 下载脚本
wget -O ~/.cloudflare-ufw.sh https://gist.githubusercontent.com/Xm798/12560579ce11f62027ea8da1fae37456/raw/b07ac8cfe09badf02fc70e2d8bc2da68cabbda50/cloudflare-ufw.sh

# 添加执行权限
chmod +x ~/.cloudflare-ufw.sh

# 执行脚本
~/.cloudflare-ufw.sh

Este script se encarga de:

  1. Consigue los rangos de IP más recientes desde la página oficial de Cloudflare
  2. Añade reglas en UFW para que solo esas IPs puedan acceder a los puertos 80/443
  3. 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
2
# 添加 cron 任务(每周一凌晨执行)
(crontab -l 2>/dev/null; echo "0 0 * * 1 /root/.cloudflare-ufw.sh > /dev/null 2>&1") | crontab -

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
2
3
4
5
6
7
8
# 查看当前时区
timedatectl

# 设置为上海时区(中国用户)
sudo timedatectl set-timezone Asia/Shanghai

# 验证
date

设置时区


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
2
3
4
5
# 安装自动更新工具
sudo apt install -y unattended-upgrades

# 配置
sudo dpkg-reconfigure --priority=low unattended-upgrades

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
2
3
4
/etc/ssh/sshd_config        # SSH 服务端配置
~/.ssh/authorized_keys # 允许登录的公钥
~/.ssh/config # 本地 SSH 客户端配置(在你电脑上)
/etc/fail2ban/jail.local # fail2ban 配置

Mejores prácticas de seguridad

  1. Actualiza el sistema regularmente: apt update && apt upgrade
  2. Revisa los logs de acceso con frecuencia: lastb (logins fallidos), last (logins exitosos)
  3. Mantente al tanto de los bloqueos de fail2ban
  4. 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:

  1. Problema de permisos (lo más común)

    1
    2
    3
    # 检查并修复权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. La clave pública no se copió correctamente

    1
    2
    3
    # 检查 authorized_keys 内容
    cat ~/.ssh/authorized_keys
    # 应该是一行完整的公钥,以 ssh-ed25519 或 ssh-rsa 开头
  3. Interferencia de SELinux (sistemas CentOS/RHEL)

    1
    restorecon -Rv ~/.ssh

Q2: ¿No puedes conectarte después de cambiar el puerto?

Pasos para revisar:

  1. Confirma que el nuevo puerto esté abierto en el firewall:

    1
    ufw status | grep 你的端口
  2. Verifica que la configuración de SSH esté correcta:

    1
    grep Port /etc/ssh/sshd_config
  3. Asegúrate de que el servicio SSH esté corriendo:

    1
    systemctl status sshd
  4. 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
2
# 查看是谁在监听 22 端口
netstat -lntp | grep :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
2
3
4
5
# 用 VNC 登录后解封
fail2ban-client set sshd unbanip 你的IP

# 把你的 IP 加入白名单,编辑 jail.local
ignoreip = 127.0.0.1/8 ::1 你的IP

Q4: ¿UFW dejó el sitio inaccesible tras activarlo?

1
2
3
4
5
6
# 检查 80/443 是否开放
ufw status

# 如果没有,添加规则
ufw allow 80/tcp
ufw allow 443/tcp

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
2
apt install sudo
usermod -aG sudo ittinker

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash
# VPS 初始化脚本
# 使用方法:以 root 身份运行

set -e

# === 配置区域(根据你的需求修改)===
NEW_USER="ittinker" # 新用户名
NEW_SSH_PORT="22000" # 新 SSH 端口
TIMEZONE="Asia/Shanghai" # 时区
# =====================================

echo "=== VPS 初始化脚本 ==="
echo ""

# 1. 更新系统
echo "[1/8] 更新系统..."
apt update && apt upgrade -y

# 2. 安装基础工具
echo "[2/8] 安装基础工具..."
apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch

# 3. 创建新用户
echo "[3/8] 创建用户 $NEW_USER..."
if id "$NEW_USER" &>/dev/null; then
echo "用户已存在,跳过创建"
else
adduser --gecos "" $NEW_USER
usermod -aG sudo $NEW_USER
fi

# 4. 配置 SSH 目录
echo "[4/8] 配置 SSH 目录..."
mkdir -p /home/$NEW_USER/.ssh
chmod 700 /home/$NEW_USER/.ssh
touch /home/$NEW_USER/.ssh/authorized_keys
chmod 600 /home/$NEW_USER/.ssh/authorized_keys
chown -R $NEW_USER:$NEW_USER /home/$NEW_USER/.ssh

echo ""
echo ">>> 请将你的公钥粘贴到下面(粘贴后按 Ctrl+D 结束):"
cat >> /home/$NEW_USER/.ssh/authorized_keys
echo ""

# 5. 修改 SSH 配置
echo "[5/8] 修改 SSH 配置..."
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i "s/^#*Port .*/Port $NEW_SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/^#*PermitRootLogin .*/PermitRootLogin no/" /etc/ssh/sshd_config
sed -i "s/^#*PasswordAuthentication .*/PasswordAuthentication no/" /etc/ssh/sshd_config
sed -i "s/^#*PermitEmptyPasswords .*/PermitEmptyPasswords no/" /etc/ssh/sshd_config

# 6. 配置防火墙
echo "[6/8] 配置防火墙..."
ufw default deny incoming
ufw default allow outgoing
ufw allow $NEW_SSH_PORT/tcp
ufw allow 80/tcp
ufw allow 443/tcp
echo "y" | ufw enable

# 7. 开启 BBR
echo "[7/8] 开启 BBR..."
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

# 8. 设置时区
echo "[8/8] 设置时区..."
timedatectl set-timezone $TIMEZONE

# 重启 SSH
systemctl restart sshd

echo ""
echo "=========================================="
echo " ✅ 初始化完成!"
echo "=========================================="
echo ""
echo " 新 SSH 端口: $NEW_SSH_PORT"
echo " 新用户: $NEW_USER"
echo " 时区: $TIMEZONE"
echo ""
echo " 请使用以下命令登录:"
echo " ssh -p $NEW_SSH_PORT $NEW_USER@$(curl -s ifconfig.me 2>/dev/null || echo '你的IP')"
echo ""
echo " ⚠️ 重要:请先测试新配置能否登录,再关闭当前终端!"
echo ""

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!