¿Qué es SSH?

SSH (Secure Shell) es un protocolo de red que permite acceder de forma segura a máquinas remotas a través de una red no confiable. Fue creado por Tatu Ylönen en 1995 como reemplazo seguro de protocolos como Telnet, rlogin y FTP, que transmitían credenciales y datos en texto plano.

SSH cifra toda la comunicación entre el cliente y el servidor usando criptografía de clave pública, garantizando confidencialidad, integridad y autenticación. Es, sin exagerar, una de las herramientas más importantes para cualquier administrador de sistemas o desarrollador.

Conexión básica

La forma más sencilla de conectarse a un servidor remoto es:

ssh usuario@192.168.1.100

Si el servidor SSH corre en un puerto no estándar (no el 22), se especifica con -p:

ssh -p 2222 usuario@servidor.com

Al conectarse por primera vez, SSH muestra la huella digital (fingerprint) del servidor para que verifiques su identidad. Siempre debes confirmar que coincide antes de aceptar — esto previene ataques Man-in-the-Middle.

Autenticación por clave pública

Usar contraseñas es inseguro. Lo correcto es autenticarse con un par de claves RSA, Ed25519 o ECDSA.

Paso 1: Generar el par de claves

ssh-keygen -t ed25519 -C "mi-correo@ejemplo.com"

Esto genera dos archivos: ~/.ssh/id_ed25519 (clave privada, jamás compartir) y ~/.ssh/id_ed25519.pub (clave pública).

Paso 2: Copiar la clave al servidor

ssh-copy-id usuario@servidor.com

O manualmente:

cat ~/.ssh/id_ed25519.pub | ssh usuario@servidor.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Paso 3: Deshabilitar autenticación por contraseña

Edita /etc/ssh/sshd_config en el servidor:

PasswordAuthentication no
PubkeyAuthentication yes

Y reinicia SSH: sudo systemctl restart sshd.

Tunneling y Port Forwarding

SSH puede tunelizar tráfico, permitiendo acceder a servicios que no están directamente expuestos en la red.

Local Port Forwarding

Redirige un puerto local hacia un servicio remoto a través del servidor SSH:

ssh -L 8080:localhost:80 usuario@servidor.com

Esto hace que localhost:8080 en tu máquina apunte al puerto 80 del servidor remoto. Muy útil para acceder a paneles de administración web que solo escuchan en localhost.

Remote Port Forwarding

Expone un puerto local en el servidor remoto:

ssh -R 8080:localhost:3000 usuario@servidor.com

Útil para mostrar un servidor de desarrollo local al mundo exterior a través de un servidor público.

Dynamic Port Forwarding (SOCKS Proxy)

ssh -D 1080 usuario@servidor.com

Crea un proxy SOCKS5 en el puerto 1080. Configuras tu navegador para usar ese proxy y todo el tráfico web se encamina a través del servidor SSH.

SCP — Copia segura de archivos

SCP (Secure Copy) transfiere archivos sobre SSH:

scp archivo.txt usuario@servidor.com:/home/usuario/

scp -r directorio/ usuario@servidor.com:/home/usuario/  # recursivo

scp usuario@servidor.com:~/backup.tar.gz .                # descargar

SFTP — Transferencia interactiva

SFTP (SSH File Transfer Protocol) es una alternativa interactiva a SCP, con operaciones tipo FTP:

sftp usuario@servidor.com
> ls
> get archivo-remoto.txt
> put archivo-local.txt
> exit

SFTP soporta reanudación de descargas, listado de directorios y permisos, algo que SCP no ofrece.

El archivo de configuración ~/.ssh/config

Administrar múltiples servidores con opciones específicas se vuelve tedioso en la línea de comandos. El archivo ~/.ssh/config simplifica todo:

Host prod
    HostName 185.23.45.67
    User deploy
    Port 2222
    IdentityFile ~/.ssh/prod_ed25519

Host dev
    HostName dev.internal.company.com
    User developer
    Port 22

Host home
    HostName 192.168.1.50
    User gabriel

Ahora puedes conectarte con solo escribir:

ssh prod
ssh dev
ssh home

Y copiar archivos fácilmente:

scp archivo.tar.gz prod:/var/www/

ssh-agent y ssh-add

Cuando usas una clave privada con frase de contraseña (passphrase), tener que escribirla cada vez que te conectas es molesto. ssh-agent resuelve esto:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

Ingresas la passphrase una vez y el agente la recuerda por el resto de la sesión. Para listar las claves cargadas:

ssh-add -l

ProxyJump — Saltar a través de un bastión

En muchas arquitecturas, no puedes acceder directamente a los servidores internos; debes pasar por un bastión o jump box:

ssh -J bastion@publico.com interno@10.0.1.50

O en el archivo de configuración:

Host bastion
    HostName publico.com
    User bastion

Host interno
    HostName 10.0.1.50
    User admin
    ProxyJump bastion

Con ProxyJump te conectas directamente al servidor interno y SSH maneja el salto de forma transparente.

Multiplexación de conexiones

Abrir una nueva conexión SSH cada vez tiene overhead. Con multiplexación, reutilizas una sola conexión TCP para múltiples sesiones:

Host *
    ControlMaster auto
    ControlPath ~/.ssh/controlmasters/%r@%h:%p
    ControlPersist 10m

Crea el directorio ~/.ssh/controlmasters primero. La primera conexión es normal; las siguientes reutilizan el mismo canal, haciéndose instantáneas.

X11 Forwarding

¿Ejecutar una aplicación gráfica remota y que se muestre en tu pantalla local? Es posible con X11 forwarding:

ssh -X usuario@servidor.com
# Luego en el servidor:
xclock &
gedit &

Más seguro: usar -X en vez de -x activa el modo «trusted». Con -Y (modo untrusted) se aplican restricciones de seguridad adicionales.

Puertos no estándar y curvas de seguridad

Cambiar el puerto SSH del 22 a otro número reduce drásticamente los intentos de autenticación automatizados:

Port 22222

Otras medidas de seguridad esenciales en /etc/ssh/sshd_config:

PermitRootLogin no                  # No permitir root directo
MaxAuthTries 3                       # Máximo de intentos
AllowUsers gabriel admin             # Solo usuarios específicos
Protocol 2                           # Solo SSHv2 (obsoleto en OpenSSH >7.4)
ClientAliveInterval 300              # Timeout de inactividad
ClientAliveCountMax 2

Fail2ban y protección contra fuerza bruta

Fail2ban monitorea los logs del sistema y bloquea IPs con demasiados intentos fallidos:

sudo apt install fail2ban
sudo systemctl enable --now fail2ban

La configuración por defecto ya incluye una regla para SSH. Puedes personalizarla en /etc/fail2ban/jail.local:

[sshd]
enabled = true
maxretry = 5
bantime = 3600
findtime = 600

Buenas prácticas de seguridad resumidas

  • Usa autenticación por clave, nunca contraseñas. Las contraseñas se pueden adivinar, interceptar o reutilizar. Las claves Ed25519 son matemáticamente seguras.
  • Protege tu clave privada. Siempre con passphrase. chmod 600 ~/.ssh/id_ed25519.
  • Mantén SSH actualizado. Las versiones antiguas tienen vulnerabilidades conocidas (CVE).
  • Usa un puerto no estándar. No es seguridad real, pero elimina el 99% del ruido automatizado.
  • Deshabilita root login. Usa sudo o su después de conectarte.
  • Implementa autenticación de dos factores (2FA). Combina clave SSH + Google Authenticator para capas extra.
  • Monitorea los logs. /var/log/auth.log o journalctl -u sshd te mostrarán quién intentó conectarse.
  • Usa ProxyJump para redes internas. No expongas todos los servidores a internet.

Comandos útiles de un vistazo

# Conectar
ssh usuario@host

# Con puerto personalizado
ssh -p 2222 usuario@host

# Ejecutar comando remoto
ssh usuario@host "df -h"

# Copiar archivo local → remoto
scp archivo usuario@host:/ruta/

# Copiar archivo remoto → local
scp usuario@host:/ruta/archivo .

# Túnel local
ssh -L 9090:localhost:9090 usuario@host

# Proxy SOCKS5
ssh -D 1080 usuario@host

# Reenviar agente SSH
ssh -A usuario@host

# ProxyJump por bastión
ssh -J bastion@host interno

Conclusión

SSH es mucho más que una terminal remota. Es una navaja suiza de conectividad, seguridad y automatización. Dominar sus capacidades — desde el tunneling hasta ProxyJump, desde ssh-agent hasta multiplexación — te convertirá en un administrador de sistemas mucho más efectivo.

La seguridad no es opcional: usa claves, deshabilita contraseñas, cambia el puerto y monitorea los accesos. Con estas herramientas, tu infraestructura estará en buenas manos.

¿Tienes algún uso avanzado de SSH que quieras compartir? ¡Déjalo en los comentarios! 🚀