Guía práctica completa de SSH en Ubuntu

Resumen

Este artículo cubre los conceptos fundamentales y los casos de uso clave de SSH (Secure Shell), una herramienta esencial para la administración de servidores Linux y el trabajo remoto. Desde la instalación del paquete del cliente hasta la conexión remota básica, la generación segura de pares de claves SSH, la autenticación sin contraseña, perfiles prácticos en el archivo SSH config y técnicas de reenvío de puertos (port forwarding), se explica todo paso a paso con comandos prácticos de terminal fáciles de entender.

1. Verificación del cliente SSH y conexión remota básica

Para comenzar con la práctica de conexión remota por SSH, instalamos y actualizamos el paquete openssh-client a su versión más reciente.

apt-get update -qq && apt-get install -y openssh-client

El comando ssh -V comprueba la versión del cliente OpenSSH instalado en el sistema.
⚙️ [Opciones principales]

-p : Especifica un número de puerto concreto utilizado por el servidor remoto en lugar del puerto predeterminado 22.
-i : Especifica la ruta al archivo de clave privada (Private Key) utilizado para la autenticación en lugar de una contraseña.
-v : Muestra mensajes detallados de depuración (debug) para diagnosticar el proceso de conexión y las causas de posibles problemas.
-C : Habilita la compresión durante la transferencia de datos para optimizar el ancho de banda de red.
-o : Permite especificar directamente en la línea de comandos opciones configurables en ~/.ssh/config (por ejemplo, ConnectTimeout).
-L : Configura el reenvío de puertos local (Local Port Forwarding) para redirigir tráfico a un servicio de red remoto.
-R : Configura el reenvío de puertos remoto (Remote Port Forwarding) para permitir el acceso desde el servidor remoto a un servicio local.

ssh -V

El comando ssh -p 22 -o ConnectTimeout=5 [email protected] intenta conectarse al host remoto especificado utilizando el puerto 22 y un tiempo de espera de conexión de 5 segundos.
Esto evita esperas indefinidas en caso de demoras en la conexión y permite comprobar rápidamente el estado del enlace.

ssh -p 22 -o ConnectTimeout=5 testuser@127.0.0.1 || true

2. Generación del par de claves SSH (Key Pair) y configuración segura de permisos

Preparamos el directorio donde se almacenarán de forma segura los archivos de claves SSH y limitamos el acceso únicamente a su propietario mediante el comando mkdir -p ~/.ssh && chmod 700 ~/.ssh.

mkdir -p ~/.ssh && chmod 700 ~/.ssh

El comando ssh-keygen -t ed25519 -C 'lab-demo@ubuntu' -f ~/.ssh/id_ed25519 -N '' genera un nuevo par de claves SSH sin contraseña (passphrase) utilizando el algoritmo Ed25519, un estándar criptográfico moderno.
Al ejecutar el comando, se verifica que la clave privada (id_ed25519), la clave pública (id_ed25519.pub) y la huella digital (fingerprint) única de la clave se han generado correctamente.

ssh-keygen -t ed25519 -C ’lab-demo@ubuntu’ -f ~/.ssh/id_ed25519 -N ‘’

Para cumplir con los estrictos requisitos de seguridad del demonio SSH, establecemos los permisos de archivo con chmod 600 ~/.ssh/id_ed25519 && chmod 644 ~/.ssh/id_ed25519.pub, permitiendo que solo el propietario pueda leer y escribir la clave privada, y que la clave pública pueda ser leída por cualquier usuario.

chmod 600 ~/.ssh/id_ed25519 && chmod 644 ~/.ssh/id_ed25519.pub

El comando ls -la ~/.ssh muestra en detalle la lista de archivos creados dentro del directorio y los permisos de seguridad aplicados.
A través de la salida, podemos comprobar que el directorio .ssh tiene drwx------ (700), la clave privada -rw------- (600) y la clave pública -rw-r--r-- (644), confirmando que los permisos deseados se aplicaron correctamente.

ls -la ~/.ssh

3. Registro de la clave pública para inicio de sesión sin contraseña (ssh-copy-id)

Creamos el archivo donde se guardará la clave pública para las conexiones remotas y configuramos sus permisos con touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys para que únicamente el propietario pueda leerlo y escribirlo.

touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys

Ejecutamos el comando cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys para añadir el contenido de la clave pública generada a la lista de claves autorizadas para la autenticación.

cat ~/.ssh/id_ed25519.pub » ~/.ssh/authorized_keys

El comando ssh-keygen -l -f ~/.ssh/authorized_keys consulta la huella digital (fingerprint) del archivo de claves autorizadas registrado para validar que la clave pública se haya añadido correctamente.
En la salida se puede confirmar que la clave pública Ed25519 de 256 bits y el comentario asignado durante su creación (lab-demo@ubuntu) están registrados de manera adecuada.

ssh-keygen -l -f ~/.ssh/authorized_keys

4. Simplificación de comandos de conexión complejos mediante el archivo SSH Config

Definimos la dirección IP del host remoto, el usuario, el número de puerto y la ruta de la clave de autenticación en el archivo ~/.ssh/config para poder conectarnos de forma sencilla utilizando un alias en lugar de introducir todos los parámetros largos de conexión.

cat « ‘EOF’ > ~/.ssh/config
Host dev-server
HostName 127.0.0.1
User testuser
Port 22
IdentityFile ~/.ssh/id_ed25519
EOF

Para evitar que el cliente SSH rechace el archivo de configuración por motivos de seguridad, aplicamos chmod 600 ~/.ssh/config para que solo el propietario tenga permisos de lectura y escritura.

chmod 600 ~/.ssh/config

El comando cat ~/.ssh/config muestra el contenido del archivo de configuración del cliente SSH para verificar su estado.
La salida confirma que el nombre de host, la cuenta de usuario, el puerto y la clave privada de autenticación para el alias dev-server se han guardado exactamente como se esperaba.

cat ~/.ssh/config

5. Ejecución de comandos únicos y tunelización SSH para mejorar la productividad remota

El comando ssh -V comprueba la versión del cliente OpenSSH instalado actualmente en el sistema.

ssh -V

El comando ssh -o BatchMode=yes -o ConnectTimeout=2 [email protected] 'uname -a; df -h' || true ejecuta directamente en el host remoto los comandos para consultar la información del sistema y el uso del disco sin abrir un shell interactivo, devolviendo los resultados en pantalla.
Al estar configurado para ejecutarse sin esperar la introducción de contraseñas, permite ejecutar comandos de forma segura en scripts de automatización o tareas por lotes.

ssh -o BatchMode=yes -o ConnectTimeout=2 testuser@127.0.0.1 ‘uname -a; df -h’ || true

El comando ssh -f -N -L 8080:localhost:80 -o ConnectTimeout=2 [email protected] || true realiza un reenvío de puertos local (Local Port Forwarding) estableciendo en segundo plano un túnel cifrado y seguro sin ejecutar comandos remotos, conectando el puerto 8080 del sistema local al puerto 80 del servidor remoto.
Esto permite acceder de forma segura a servicios web internos o bases de datos del servidor remoto a través de un puerto local, incluso si no son accesibles directamente desde el exterior.

ssh -f -N -L 8080:localhost:80 -o ConnectTimeout=2 testuser@127.0.0.1 || true

Hasta aquí hemos revisado paso a paso en Ubuntu desde la conexión remota básica con SSH hasta el inicio de sesión seguro sin contraseña mediante claves y prácticas útiles de reenvío de puertos.
Aproveche las técnicas de SSH aprendidas en esta práctica para construir en adelante un entorno de administración de servidores remotos mucho más seguro y eficiente.