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 de 60 es 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.