gotburnout

Configuración de Hetzner VPS

Desde un servidor en blanco hasta una máquina segura lista para producción. Elige cómo quieres configurar tu servidor.

Automáticamente (IA)
Habilidad universal para Claude Code, Cursor, Windsurf y Antigravity.
Manualmente
14 pasos para un control manual completo sobre el proceso.

Preparación de Variables

En los comandos a continuación, deberás sustituir tus valores en lugar de las llaves:

  • {username} — el nombre de tu usuario regular (ej., dev)
  • {nickname} — un nombre corto para el servidor por conveniencia (ej., hetzner-main)
  • {SERVER_IP} — la dirección IP pública de tu nuevo servidor

1 Crear una Clave SSH (Local)

Se ejecuta en tu computadora (Mac o Linux) ANTES de conectarte al servidor.

Terminal (Local)
ssh-keygen -t ed25519 -C "{username}@{nickname}" -f ~/.ssh/{nickname}_key -N "" cat ~/.ssh/{nickname}_key.pub

Copia la salida del segundo comando (comienza con ssh-ed25519 ...). Esta es tu clave pública.

2 Inicio de sesión como Root

Conéctate al servidor usando la contraseña que Hetzner envió a tu correo.

Terminal
ssh root@{SERVER_IP}
Hetzner puede pedirte que cambies la contraseña. Ingresa la contraseña actual, luego la nueva temporal dos veces. Si la conexión se cae después de esto, simplemente conéctate nuevamente usando la nueva contraseña.

3 Actualización del Sistema

Actualizando todos los paquetes en modo no interactivo (sin ventanas emergentes de grub).

Root Terminal
apt update && DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt upgrade -y

4 Crear un Usuario con sudo

Trabajar como root es peligroso. Creamos un usuario regular y le damos privilegios de administrador.

Root Terminal
useradd -m -s /bin/bash {username} echo "{username}:ВАШ_НОВИЙ_СКЛАДНИЙ_ПАРОЛЬ" | chpasswd usermod -aG sudo {username}

5 Despliegue de Clave SSH

Escribiremos tu clave pública, que copiaste en el Paso 1, en el servidor.

Root Terminal
mkdir -p /home/{username}/.ssh echo "{PUBLIC_KEY_CONTENT}" > /home/{username}/.ssh/authorized_keys chmod 700 /home/{username}/.ssh chmod 600 /home/{username}/.ssh/authorized_keys chown -R {username}:{username} /home/{username}/.ssh

6 Verificación de Inicio de Sesión

PUNTO DE CONTROL OBLIGATORIO

¡No cierres la sesión root! Abre una nueva ventana de terminal en tu PC e intenta iniciar sesión usando la clave. Solo puedes continuar después de un inicio de sesión exitoso.

New Terminal (Local)
ssh -i ~/.ssh/{nickname}_key {username}@{SERVER_IP}

Comprueba si sudo funciona (el sistema debería pedir la contraseña que configuraste en el Paso 4 y mostrar "root"):

User Terminal
sudo whoami

7 Cortafuegos (UFW)

Ejecuta todos los comandos posteriores como tu nuevo usuario (con sudo). Configurando la política "denegar todas las entradas excepto SSH, HTTP y HTTPS".

User Terminal
sudo apt install -y ufw sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow ssh sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw --force enable sudo ufw status

8 Protección del Kernel (sysctl)

Aplicando parámetros para proteger contra ataques de red.

User Terminal
sudo tee /etc/sysctl.d/99-security.conf << 'EOF' net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 EOF sudo sysctl -p /etc/sysctl.d/99-security.conf

9 Paquetes Básicos y Hora

La hora exacta es crítica para los registros, certificados SSL y fail2ban.

User Terminal
sudo apt install -y chrony curl wget git unzip net-tools sudo systemctl enable chrony

10 Configuración SSH Local

Configurando un acceso directo en tu PC local para conectarte con un comando corto ssh {nickname} en el futuro.

Terminal (Local)
mkdir -p ~/.ssh && touch ~/.ssh/config && chmod 600 ~/.ssh/config cat >> ~/.ssh/config << 'EOF' Host {nickname} HostName {SERVER_IP} User {username} IdentityFile ~/.ssh/{nickname}_key IdentitiesOnly yes EOF

11 Verificación de Seguridad

Verifica que el comando corto desde la PC local funcione y que las protecciones básicas estén habilitadas.

Terminal (Local)
ssh {nickname} # Після успішного входу: sudo ufw status sudo sysctl net.ipv4.conf.all.rp_filter

12 Bloqueo Final

Instalamos protección contra fuerza bruta (fail2ban) y deshabilitamos permanentemente el inicio de sesión con contraseña y el inicio de sesión root.

User Terminal
sudo apt install -y fail2ban && sudo tee /etc/fail2ban/jail.local << JAILEOF [DEFAULT] bantime = 1h findtime = 10m maxretry = 5 [sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 24h JAILEOF sudo systemctl enable fail2ban && sudo systemctl restart fail2ban sudo sed -i "s/^#\?PermitRootLogin.*/PermitRootLogin no/" /etc/ssh/sshd_config sudo sed -i "s/^#\?PasswordAuthentication.*/PasswordAuthentication no/" /etc/ssh/sshd_config sudo systemctl restart sshd
¡Hecho! El servidor está completamente configurado y asegurado.