Configurar ajustes avanzados del cliente SSH para un rendimiento y seguridad óptimos
Configura `~/.ssh/config` para alias, keepalives, claves, cifrados, compresión y acceso a bastión con ejemplos prácticos de SSH.
Configurar ajustes avanzados del cliente SSH para un rendimiento y seguridad óptimos
Establecer una conexión segura es a menudo el primer paso en la administración remota de sistemas, generalmente con un simple comando ssh usuario@host. Cuando gestionas varios servidores, los ajustes del cliente SSH en ~/.ssh/config mantienen esas conexiones estables, repetibles y menos propensas a errores.
Puedes usar un solo archivo para definir alias de host, archivos de identidad, comportamiento de keepalive, cifrados, compresión y enrutamiento a través de un bastión sin tener que volver a escribir largas líneas de comando.
Entendiendo el archivo de configuración SSH
El centro de control principal para el comportamiento del cliente SSH es el archivo de configuración ubicado en ~/.ssh/config. Si este archivo no existe, puedes crearlo de forma segura. Este archivo te permite definir ajustes específicos para Host, lo que significa que puedes tener una configuración para tu servidor de producción y otra diferente para tu entorno de pruebas.
Estructura del archivo de configuración
Las configuraciones se estructuran usando directivas aplicadas globalmente (al principio) o específicamente dentro de un bloque Host. Los ajustes dentro de un bloque Host anulan los ajustes globales.
# Ajustes globales aplicados a todas las conexiones a menos que se anulen
Host *
ServerAliveInterval 60
# Ajustes específicos para un servidor de desarrollo
Host devserver
HostName 192.168.1.100
User developer_user
Port 2222
IdentityFile ~/.ssh/id_rsa_dev
Optimizando la persistencia de la conexión y los tiempos de espera
Las desconexiones frecuentes, especialmente en redes inestables o VPNs, pueden perjudicar gravemente la productividad. Los clientes SSH utilizan mecanismos para mantener la conexión activa.
Mecanismos de KeepAlive
Para evitar que las conexiones inactivas se agoten debido a la configuración de inactividad del firewall o del enrutador, puedes configurar el cliente para que envíe "paquetes nulos" periódicos.
ServerAliveInterval: Especifica un tiempo de espera en segundos después del cual el cliente envía un mensaje al servidor para mantener la conexión activa si no se han recibido datos. Un valor de60es común.ServerAliveCountMax: Especifica el número de reintentos del cliente sin recibir respuesta del servidor antes de rendirse y desconectarse.
Ejemplo de configuración para estabilidad:
Host stable-server
HostName production.example.com
User sysadmin
ServerAliveInterval 30
ServerAliveCountMax 3
Esta configuración enviará un paquete nulo cada 30 segundos. Si envía este paquete 3 veces sin respuesta, el cliente se desconectará.
Tiempo de espera de conexión
Si un intento de conexión se queda colgado indefinidamente cuando un servidor está caído o es inalcanzable, puedes establecer un tiempo de espera para la fase inicial de conexión:
ConnectTimeout: Define el tiempo máximo (en segundos) que el cliente SSH esperará para que se establezca una conexión antes de abortar el intento.
Mejorando la seguridad mediante el endurecimiento del cliente
Si bien la configuración del servidor determina gran parte de la postura de seguridad, el cliente puede imponer preferencias de seguridad y simplificar la autenticación compleja.
Imponiendo la autenticación basada en clave
Para servidores críticos, siempre debes imponer la autenticación basada en clave y deshabilitar las solicitudes de contraseña. La directiva PreferredAuthentications controla el orden y el tipo de métodos de autenticación que el cliente intenta.
Para priorizar la autenticación de clave pública:
Host critical-db
HostName db.internal.net
PreferredAuthentications publickey
PubkeyAuthentication yes
PasswordAuthentication no
Especificando archivos de identidad
Si usas múltiples pares de claves (uno para el trabajo, otro para proyectos personales, etc.), puedes asignar claves específicas a hosts específicos usando IdentityFile.
Host gitlab.work.com
IdentityFile ~/.ssh/id_rsa_gitlab_work
Host github.com
IdentityFile ~/.ssh/id_rsa_personal
Mejor práctica de seguridad: Asegúrate de que tus claves privadas tengan permisos restrictivos (por ejemplo,
chmod 600 ~/.ssh/id_rsa).
Optimizando el rendimiento: Cifrados y compresión
El rendimiento de SSH puede verse afectado por los algoritmos criptográficos utilizados para el cifrado y la sobrecarga de la compresión de datos.
Selección de cifrados
Los clientes SSH modernos admiten una amplia variedad de cifrados. Puedes especificar una lista preferida usando Ciphers para asegurarte de usar algoritmos fuertes y rápidos compatibles tanto con el cliente como con el servidor, o para imponer estándares más antiguos si el hardware heredado lo requiere.
Los cifrados modernos preferidos a menudo incluyen implementaciones AES-GCM.
Host fast-connection
HostName remote.fastlane.io
Ciphers [email protected],[email protected],[email protected]
Compresión
La compresión de datos (Compression) puede acelerar las sesiones en enlaces muy lentos, pero añade sobrecarga de CPU en ambos extremos. Generalmente está deshabilitada en redes rápidas.
Compression no: (Predeterminado) Sin compresión.Compression yes: Habilita la compresión usando el algoritmo ZLIB.
Host slow-wan-link
Compression yes
Simplificando conexiones con alias y ProxyJumps
Una de las características más potentes de ~/.ssh/config es simplificar rutas de conexión complejas, como saltar a través de un host bastión (un "jumpbox").
Alias de host
En lugar de escribir el nombre completo del servidor y el usuario cada vez, puedes crear un alias simple:
Host web
HostName 172.16.0.50
User alice
Ahora puedes conectarte simplemente usando: ssh web.
ProxyJump para hosts bastión
La directiva ProxyJump (o su equivalente más antiguo, ProxyCommand) permite al cliente tunelizar automáticamente a través de un servidor intermedio antes de llegar al destino final. Esto evita la necesidad de llamadas ssh separadas o configuraciones de nc (netcat).
Para conectarse a database a través de jumpbox:
Host jumpbox
HostName 203.0.113.5
User bastion_user
Host database
HostName 10.0.0.5
User db_user
ProxyJump jumpbox
Ahora, el comando ssh database se conecta automáticamente primero a jumpbox y luego reenvía la sesión al servidor database.
Conclusión
El archivo ~/.ssh/config es donde conviertes comandos SSH repetitivos en perfiles claros y con nombre. Comienza con alias, User, HostName, IdentityFile y ServerAliveInterval; luego añade ProxyJump, preferencias de cifrado o compresión solo donde tu entorno los necesite. Antes de imponer una opción estricta a nivel global, pruébala con tus hosts más antiguos para no quedarte fuera de un servidor que admita un conjunto de características SSH más limitado.