# 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.

:::tabs
=== Automáticamente (IA)
### Configuración Automática vía IA
Proporciona a tu asistente de IA acceso a este repositorio. Realizará automáticamente todas las verificaciones, configurará la seguridad y generará un archivo con todas las credenciales de acceso en tu computadora.

[Abrir Repositorio de GitHub](https://github.com/orlovvugorivzai/vps-hetzner-setup-by-orlov)

=== Manualmente
### 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.

```bash
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.

> [!WARNING]
> 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.

```bash
ssh root@{SERVER_IP}
```

## 3. Actualización del Sistema
Actualizando todos los paquetes en modo no interactivo (sin ventanas emergentes de grub).

```bash
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.

```bash
useradd -m -s /bin/bash {username}
echo "{username}:YOUR_SECURE_PASSWORD" | chpasswd
usermod -aG sudo {username}
```

## 5. Despliegue de Clave SSH
Escribiremos tu clave pública, que copiaste en el Paso 1, en el servidor.

```bash
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
> [!IMPORTANT]
> **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.

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

```bash
ssh -i ~/.ssh/{nickname}_key {username}@{SERVER_IP}
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".

```bash
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.

```bash
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.

```bash
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.

```bash
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.

```bash
ssh {nickname}
sudo ufw status
sysctl net.ipv4.tcp_syncookies
```

## 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.

```bash
sudo apt install -y fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo tee /etc/ssh/sshd_config.d/99-hardening.conf << 'EOF'
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey
EOF
sudo sshd -t && sudo systemctl restart ssh
```

> [!TIP]
> ¡Hecho! El servidor está completamente configurado y asegurado.