SSH (Secure Shell) es el protocolo estándar para administrar servidores Linux de forma remota: cifra la sesión completa y permite autenticarse con contraseña o, mucho mejor, con un par de claves. En esta guía te conectarás por primera vez a un servidor con Ubuntu 24.04, crearás una clave Ed25519, la instalarás en el servidor y configurarás un alias en ~/.ssh/config para conectarte con un solo comando desde Linux, macOS o Windows.

Requisitos previos

  • Un servidor Linux con el servicio SSH activo, por ejemplo un VPS de CubePath con Ubuntu 24.04. Las instrucciones sirven igual para Debian 12 y Rocky Linux 9.
  • La dirección IP pública del servidor (your_server_ip) y el usuario inicial con su contraseña o la clave que elegiste al crearlo.
  • Un equipo local con Linux, macOS o Windows 10/11. Los tres incluyen el cliente OpenSSH.

Paso 1: Comprobar el cliente SSH en tu equipo

Linux y macOS traen el cliente ssh instalado. En Windows 10 y 11 viene como característica opcional activada por defecto y funciona desde PowerShell o Windows Terminal. Comprueba la versión:

ssh -V
OpenSSH_9.6p1 Ubuntu-3ubuntu13, OpenSSL 3.0.13 30 Jan 2024

La versión exacta varía según el sistema. Si en Windows el comando no existe, instálalo desde PowerShell como administrador:

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

En una distribución Linux mínima sin cliente, instálalo con sudo apt install openssh-client (Debian/Ubuntu) o sudo dnf install openssh-clients (Rocky/RHEL).

Paso 2: Conectarte por primera vez

La sintaxis básica es ssh usuario@servidor. Sustituye root por el usuario inicial de tu servidor y your_server_ip por su IP:

ssh root@your_server_ip

En la primera conexión el cliente no conoce el servidor y te muestra su huella digital:

The authenticity of host 'your_server_ip (your_server_ip)' can't be established.
ED25519 key fingerprint is SHA256:Vb3mP0qZ1pQ8f5bX2c7n4H9yKkLw6tR0aJ1sE8dUu2c.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Esa huella identifica al servidor. Si quieres asegurarte de que no hay nadie en medio, compárala con la que muestra el propio servidor desde la consola del panel de CubePath:

ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub

Escribe yes. El cliente guarda la huella en ~/.ssh/known_hosts y en las siguientes conexiones solo avisará si cambia. Después introduce la contraseña (no se muestra al escribirla) y verás el prompt del servidor:

Welcome to Ubuntu 24.04.3 LTS (GNU/Linux 6.8.0-85-generic x86_64)
...
root@your_hostname:~#

Para salir escribe exit o pulsa Ctrl+D. Si el servidor escucha en otro puerto, indícalo con -p:

ssh -p 2222 root@your_server_ip

Paso 3: Crear un par de claves SSH

La autenticación con claves es más segura que la contraseña y permite desactivar después el acceso por contraseña. Genera una clave Ed25519 en tu equipo local, no en el servidor:

ssh-keygen -t ed25519 -C "[email protected]"

Pulsa Enter para aceptar la ruta por defecto (~/.ssh/id_ed25519) y escribe una frase de paso. La frase cifra la clave privada en disco: si alguien copia el archivo, no podrá usarlo sin ella.

Your identification has been saved in /home/your_user/.ssh/id_ed25519
Your public key has been saved in /home/your_user/.ssh/id_ed25519.pub

Se crean dos archivos:

ArchivoContenidoSe comparte
~/.ssh/id_ed25519Clave privadaNunca
~/.ssh/id_ed25519.pubClave públicaSí, se copia a los servidores

Paso 4: Copiar la clave pública al servidor

La clave pública debe añadirse al archivo ~/.ssh/authorized_keys del usuario con el que te conectas. En Linux y macOS, ssh-copy-id lo hace por ti y ajusta los permisos:

ssh-copy-id root@your_server_ip
Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@your_server_ip'"
and check to make sure that only the key(s) you wanted were added.

Windows no incluye ssh-copy-id. Desde PowerShell puedes enviar la clave con un solo comando:

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh root@your_server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Vuelve a conectarte. Esta vez el servidor no pedirá la contraseña del usuario, solo la frase de paso de tu clave (si la pusiste):

ssh root@your_server_ip

Para confirmar qué método se ha usado, conéctate en modo detallado y busca la línea de autenticación:

ssh -v root@your_server_ip exit 2>&1 | grep "Authenticated"
Authenticated to your_server_ip ([your_server_ip]:22) using "publickey".

Paso 5: Evitar escribir la frase de paso con ssh-agent

El agente SSH mantiene la clave descifrada en memoria durante la sesión. En la mayoría de escritorios Linux y en macOS ya está en marcha; añade la clave con:

ssh-add ~/.ssh/id_ed25519

En macOS puedes guardar la frase en el llavero con ssh-add --apple-use-keychain ~/.ssh/id_ed25519. En Windows, activa el servicio del agente una vez desde PowerShell como administrador y añade la clave:

Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519

Comprueba las claves cargadas con ssh-add -l.

Paso 6: Crear un alias en ~/.ssh/config

Si gestionas varios servidores, el archivo de configuración del cliente evita recordar IPs, usuarios y puertos. Créalo o edítalo en tu equipo local (en Windows está en C:\Users\tu_usuario\.ssh\config):

nano ~/.ssh/config

Añade un bloque por servidor:

Host mi-vps
    HostName your_server_ip
    User your_user
    Port 22
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes
    ServerAliveInterval 60

IdentitiesOnly yes hace que se ofrezca solo esa clave, lo que evita errores de "Too many authentication failures" cuando tienes muchas claves en el agente. ServerAliveInterval envía un paquete cada 60 segundos para que la sesión no se corte por inactividad. En Linux y macOS el archivo debe ser privado:

chmod 600 ~/.ssh/config

Ahora te conectas con el alias, y también funciona con scp y rsync:

ssh mi-vps
scp archivo.tar.gz mi-vps:/tmp/

Paso 7: Ejecutar comandos y abrir túneles

No siempre necesitas una sesión interactiva. Puedes ejecutar un comando remoto y volver a tu terminal:

ssh mi-vps "uptime && df -h /"

Un túnel local sirve para llegar a un servicio que solo escucha en localhost del servidor, como un panel de administración o una base de datos. Este ejemplo publica en tu puerto local 8080 el puerto 80 del servidor, sin abrirlo en el firewall:

ssh -N -L 8080:localhost:80 mi-vps

Mientras el comando siga activo, abre http://localhost:8080 en tu navegador. Pulsa Ctrl+C para cerrar el túnel.

Solución de problemas

Connection timed out: el paquete no llega al servidor. Comprueba la IP, que el servidor esté encendido y que el firewall permita el puerto SSH. Prueba el puerto desde tu equipo con nc -vz your_server_ip 22.

Connection refused: el servidor responde pero nada escucha en ese puerto. Entra por la consola del panel y revisa el servicio con sudo systemctl status ssh (en Rocky Linux, sshd) y el puerto real con sudo ss -tlnp | grep ssh.

Permission denied (publickey): el servidor no acepta tu clave. Revisa que te conectas con el usuario correcto y que los permisos en el servidor son estrictos, ya que OpenSSH ignora authorized_keys si otros usuarios pueden escribir en él:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

En el servidor, sudo journalctl -u ssh -n 20 muestra el motivo exacto del rechazo.

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!: la clave del servidor no coincide con la guardada. Es normal si reinstalaste el servidor con la misma IP; en ese caso borra la entrada antigua y vuelve a verificar la huella:

ssh-keygen -R your_server_ip

Si no has reinstalado nada, no continúes e investiga antes de conectarte.

Conclusión

Ya te conectas a tu servidor con una clave Ed25519 protegida por frase de paso y un alias en ~/.ssh/config. El siguiente paso lógico es crear un usuario con sudo, desactivar el acceso por contraseña y el login de root, y activar un firewall, tal como se explica en la guía de configuración inicial de seguridad en Ubuntu/Debian. También puedes cambiar el puerto SSH por defecto para reducir el ruido de los escaneos automáticos.