¿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
sudoosudespués de conectarte. - Implementa autenticación de dos factores (2FA). Combina clave SSH + Google Authenticator para capas extra.
- Monitorea los logs.
/var/log/auth.logojournalctl -u sshdte 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! 🚀