Conexión
Conexión Básica
ssh user@host # conectar al host ssh -p 2222 user@host # puerto personalizado ssh user@host command # ejecutar comando remoto ssh -t user@host "top" # forzar asignación de TTY
Opciones de Conexión
-p portConectar a un puerto específico
-i keyUsar identidad específica (clave privada)
-tForzar asignación de pseudo-terminal
-v / -vv / -vvvDepuración detallada (nivel creciente)
-qModo silencioso (suprimir advertencias)
-NSin comando remoto (para túneles)
-fIr al fondo antes del comando
-J jumpHost de salto (ProxyJump)
Gestión de Claves
Generar Claves
ssh-keygen -t ed25519 -C "[email protected]" ssh-keygen -t rsa -b 4096 -C "[email protected]" ssh-keygen -t ed25519 -f ~/.ssh/mykey ssh-keygen -p -f ~/.ssh/id_ed25519 # cambiar frase de contraseña
Desplegar Clave Pública
ssh-copy-id user@host ssh-copy-id -i ~/.ssh/mykey.pub user@host # Manual: agregar .pub al authorized_keys remoto cat ~/.ssh/id_ed25519.pub | ssh user@host \ "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Archivos de Claves
~/.ssh/id_ed25519Clave privada (mantener en secreto)
~/.ssh/id_ed25519.pubClave pública (compartir libremente)
~/.ssh/authorized_keysRemoto: claves públicas aceptadas
~/.ssh/known_hostsHuellas digitales de hosts conocidos
Archivo de Configuración
Configuración Básica ~/.ssh/config
Host myserver HostName 192.168.1.100 User deploy Port 2222 IdentityFile ~/.ssh/deploy_key # Luego conectar solo con: # ssh myserver
Opciones de Configuración Útiles
Host * ServerAliveInterval 60 ServerAliveCountMax 3 AddKeysToAgent yes IdentitiesOnly yes Host bastion HostName bastion.example.com User admin
Directivas de Configuración
HostPatrón de alias para la entrada
HostNameNombre de host o IP real
UserNombre de usuario de inicio de sesión
PortPuerto remoto (por defecto 22)
IdentityFileRuta a la clave privada
ProxyJumpSaltar a través de otro host
ServerAliveIntervalIntervalo de keep-alive (segundos)
IdentitiesOnlyUsar solo las claves especificadas
Reenvío de Puertos
Reenvío Local (-L)
# Acceder al puerto remoto 5432 via puerto local 5432 ssh -L 5432:localhost:5432 user@host # Acceder a remote-db:3306 a través del host ssh ssh -L 3306:remote-db:3306 user@host # Enlazar a todas las interfaces ssh -L 0.0.0.0:8080:localhost:80 user@host
Reenvío Remoto (-R)
# Exponer el puerto local 3000 en el puerto remoto 8080 ssh -R 8080:localhost:3000 user@host # Permitir conexiones remotas desde cualquier interfaz ssh -R 0.0.0.0:8080:localhost:3000 user@host
Reenvío Dinámico (-D)
# Proxy SOCKS5 en puerto local 1080 ssh -D 1080 user@host # Proxy SOCKS en segundo plano ssh -D 1080 -fN user@host
SCP y SFTP
SCP (Copia Segura)
scp file.txt user@host:/remote/path/ scp user@host:/remote/file.txt ./local/ scp -r dir/ user@host:/remote/path/ scp -P 2222 file.txt user@host:/path/
SFTP (Transferencia Interactiva)
sftp user@host # Dentro de la sesión sftp: # put local.txt — subir archivo # get remote.txt — descargar archivo # ls / lcd / cd — listar / cambiar directorio
Opciones de Transferencia
-rRecursivo (copiar directorios)
-P portEspecificar puerto (SCP usa -P, no -p)
-CActivar compresión
-l limitLímite de ancho de banda en Kbit/s
-i keyUsar archivo de identidad específico
Reenvío de Agente
Agente SSH
eval "$(ssh-agent -s)" # iniciar agente ssh-add ~/.ssh/id_ed25519 # agregar clave al agente ssh-add -l # listar claves cargadas ssh-add -D # eliminar todas las claves
Reenviar el Agente
ssh -A user@host # reenviar agente # O en ~/.ssh/config: # Host myserver # ForwardAgent yes
Notas sobre el Agente
El reenvío de agente permite que el host remoto use tus claves locales sin copiarlas. Usar solo con hosts de confianza. Prefiere ProxyJump sobre el reenvío de agente cuando sea posible.
Túneles
Túnel Persistente
# Túnel en segundo plano que permanece abierto ssh -fNT -L 5432:localhost:5432 user@host # Túnel con reconexión automática (con autossh) autossh -M 0 -fNT -L 5432:localhost:5432 user@host
Hosts de Salto / Bastión
ssh -J bastion user@internal-host ssh -J user1@hop1,user2@hop2 user@target # Equivalente en config: # Host internal # HostName 10.0.0.5 # ProxyJump bastion
Gestión de Túneles
-fSegundo plano tras autenticación
-NSin comando remoto
-TDeshabilitar pseudo-terminal
~.Matar sesión SSH bloqueada (escape)
~CAbrir línea de comandos para reenvío
~#Listar conexiones reenviadas
Resolución de Problemas
Depurar la Conexión
ssh -vvv user@host # máxima verbosidad ssh -G user@host # volcar configuración (simulacro) ssh-keyscan host # obtener claves del host ssh-keygen -R host # eliminar de known_hosts
Problemas Comunes
Permission deniedClave, usuario o permisos de ~/.ssh incorrectos (700/600)
Host key changedssh-keygen -R host, luego reconectar
Connection timed outVerificar firewall, puerto y accesibilidad del host
Too many auth failuresUsar -i para especificar clave o IdentitiesOnly
Broken pipeAgregar ServerAliveInterval a la configuración
Permisos de Archivos
chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 # clave privada chmod 644 ~/.ssh/id_ed25519.pub # clave pública chmod 600 ~/.ssh/authorized_keys chmod 644 ~/.ssh/known_hosts
Buenas Prácticas de Seguridad
Endurecimiento del Servidor
PasswordAuthentication noDeshabilitar inicio de sesión con contraseña
PermitRootLogin noDeshabilitar acceso SSH como root
AllowUsers deployLista blanca de usuarios permitidos
Port 2222Puerto no estándar (evitar escáneres)
MaxAuthTries 3Limitar intentos de autenticación
Prácticas con Claves
Prefiere claves Ed25519 (más pequeñas, rápidas y seguras). Siempre establece una frase de contraseña en las claves privadas. Usa ssh-agent para evitar escribir la frase repetidamente. Rota las claves periódicamente; revoca las claves no usadas. Usa IdentitiesOnly para controlar qué clave se ofrece.
Multiplexación
Compartir Conexiones
# En ~/.ssh/config Host * ControlMaster auto ControlPath ~/.ssh/sockets/%r@%h-%p ControlPersist 600 # Crear directorio de sockets mkdir -p ~/.ssh/sockets
Beneficios de la Multiplexación
Reutiliza una sola conexión TCP para múltiples sesiones SSH al mismo host. Elimina los handshakes repetidos — conexiones más rápidas y menor sobrecarga. ControlPersist mantiene el maestro activo (en segundos).
Secuencias de Escape
Comandos de Escape SSH
~.Terminar conexión (matar sesión bloqueada)
~^ZSuspender sesión SSH
~CAbrir línea de comandos (agregar reenvío)
~#Listar conexiones reenviadas
~&Poner SSH en segundo plano (esperando conexiones)
~?Mostrar ayuda de escape
~~Enviar tilde literal