Guía práctica definitiva de SSH en Ubuntu: desde la conexión básica hasta el reenvío de puertos y la configuración de seguridad

Resumen

SSH (Secure Shell) es un protocolo de red estándar fundamental para la administración remota de servidores Linux. En este artículo, abordamos paso a paso desde la instalación y configuración del servidor OpenSSH en entornos Ubuntu hasta la autenticación mediante clave pública sin contraseña, el reenvío de puertos (port forwarding) para redes en entornos reales y consejos esenciales para fortalecer la seguridad.

1. Instalación de OpenSSH Server y activación del servicio

Para habilitar el servicio de acceso remoto en el sistema Ubuntu, actualizamos la lista de paquetes e instalamos el paquete openssh-server.

sudo apt-get update -qq && sudo apt-get install -y openssh-server

Ejecutamos el comando systemctl enable --now ssh para habilitar el inicio automático del servicio SSH al arrancar el sistema e iniciarlo de inmediato.

sudo systemctl enable –now ssh

Verificamos que el demonio del servicio SSH (sshd) se encuentre actualmente en estado activo y en ejecución (active (running)).

sudo systemctl status ssh –no-pager

Ejecutamos el comando ss -tulpn | grep :22 para comprobar que el servicio está a la escucha (LISTEN) de conexiones de red en el puerto 22, el puerto predeterminado de SSH.

ss -tulpn | grep :22

2. Generación y registro del par de claves SSH para acceso sin contraseña

Creamos el directorio ~/.ssh para almacenar de forma segura los archivos de claves SSH y configuramos sus permisos a 700 para que solo el propietario tenga acceso.

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

Ejecutamos el comando test -f ~/.ssh/id_ed25519 || ssh-keygen -t ed25519 -N '' -f ~/.ssh/id_ed25519 para generar un nuevo par de claves basado en el algoritmo Ed25519, conocido por su alta seguridad y rendimiento, en caso de que aún no exista.
Al finalizar la ejecución del comando, podemos confirmar que la clave privada (id_ed25519) y la clave pública (id_ed25519.pub) se han generado correctamente.

test -f ~/.ssh/id_ed25519 || ssh-keygen -t ed25519 -N ’’ -f ~/.ssh/id_ed25519

Añadimos el contenido de la clave pública generada al archivo de autorización de accesos ~/.ssh/authorized_keys.

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

Restringimos los permisos del archivo authorized_keys a 600 para mantener la seguridad de las claves autorizadas y cumplir con las comprobaciones estrictas de permisos del demonio SSH.

chmod 600 ~/.ssh/authorized_keys

Especificamos la clave privada Ed25519 creada para intentar una conexión a la dirección de loopback local (127.0.0.1) y validar que la autenticación basada en claves funcione correctamente.
Como resultado de la ejecución del comando, se muestra el mensaje de éxito indicando que la conexión local mediante autenticación por clave se realizó sin solicitar contraseña.

ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no $(whoami)@127.0.0.1 ’echo SSH 로컬 키 인증 접속 성공!’

3. Tunelización práctica de red: prueba de reenvío de puertos (Port Forwarding) SSH

Actualizamos la lista de paquetes e instalamos los paquetes curl y python3 para ejecutar un servidor web de prueba y realizar solicitudes HTTP.

sudo apt-get update -qq && sudo apt-get install -y curl python3

Ejecutamos el comando mkdir -p /tmp/webroot && echo '<h1>SSH Tunnel Test OK</h1>' > /tmp/webroot/index.html para crear el directorio raíz web y redactar un archivo HTML que servirá para probar el reenvío de puertos.

mkdir -p /tmp/webroot && echo ‘SSH Tunnel Test OK’ > /tmp/webroot/index.html

Ejecutamos en segundo plano un servidor web simple en el puerto 8080 para actuar como servicio interno mediante el comando python3 -m http.server 8080 --directory /tmp/webroot >/dev/null 2>&1 &.

python3 -m http.server 8080 –directory /tmp/webroot >/dev/null 2>&1 &

Iniciamos en segundo plano el reenvío de puerto local para redirigir las peticiones que lleguen al puerto local 9090 hacia el puerto 8080 del servidor de destino a través del túnel seguro SSH.
Tras ejecutar el comando, el túnel de reenvío de puertos se crea de forma segura en segundo plano sin bloquear la sesión de la terminal.

ssh -f -N -L 9090:localhost:8080 -o StrictHostKeyChecking=no $(whoami)@127.0.0.1

Enviamos una solicitud HTTP al puerto local 9090, reenviado a través del túnel SSH, para verificar que la conexión se transmite correctamente hacia el servidor web interno.
Como resultado, se obtiene la respuesta del servidor web interno en el puerto 8080 (<h1>SSH Tunnel Test OK</h1>), confirmando que el reenvío de puertos funciona a la perfección.

curl -s http://localhost:9090

Una vez finalizada la prueba de reenvío de puertos, ejecutamos el comando pkill -f 'http.server 8080' para terminar de forma segura el proceso del servidor web de prueba que se ejecutaba en segundo plano.

pkill -f ‘http.server 8080’

4. Configuración avanzada de seguridad para el servidor SSH (sshd_config)

Realizamos una copia de respaldo del archivo de configuración con el comando sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak para preservar la configuración original ante posibles eventualidades durante las modificaciones.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

Con el fin de reforzar la seguridad, bloqueamos por completo el acceso remoto directo de la cuenta root ejecutando el comando sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config para actualizar el parámetro correspondiente.

sudo sed -i ’s/^#PermitRootLogin./PermitRootLogin no/’ /etc/ssh/sshd_config

Ejecutamos el comando sudo sshd -t para verificar de forma segura y anticipada que no existan errores de sintaxis ni erratas en el archivo de configuración modificado del servidor SSH.
Al no mostrar ningún mensaje de error tras la ejecución del comando, confirmamos que la sintaxis de configuración es correcta.

sudo sshd -t

Ejecutamos el comando grep -E '^(PermitRootLogin|PasswordAuthentication)' /etc/ssh/sshd_config || echo '설정 검증 완료' para comprobar que la opción que deshabilita el inicio de sesión como root (PermitRootLogin no) se ha reflejado debidamente en el archivo de configuración.
En el resultado del comando se visualiza correctamente PermitRootLogin no, verificando que la directiva de seguridad ha sido aplicada con éxito.

grep -E ‘^(PermitRootLogin|PasswordAuthentication)’ /etc/ssh/sshd_config || echo ‘설정 검증 완료’

Hasta aquí hemos revisado los aspectos fundamentales necesarios para el trabajo diario en Ubuntu: desde la conexión básica por SSH hasta el reenvío de puertos y las configuraciones indispensables de seguridad.
Le recomendamos aplicar paso a paso estas prácticas de seguridad para construir un entorno de administración de servidores más seguro y eficiente.