~/.ssh/config: el archivo que todo sysadmin debería estar usando
El problema
Hasta hace unos años mis conexiones SSH eran así:
ssh -i ~/.ssh/clave_servidor_produccion.pem -p 2222 admin@10.20.30.40
20 servidores = 20 comandos distintos. Me los guardaba en un .txt y copiaba/pegaba como un animal.
Un día un colega vio mi pantalla y me dijo “¿por qué no usas ~/.ssh/config?”. No supe qué responder.
Lo básico: alias
Host prod
HostName 10.20.30.40
Port 2222
User admin
IdentityFile ~/.ssh/clave_produccion.pem
Ahora:
ssh prod
Eso es todo. El tab-complete de tu shell te lo sugiere. ssh pr<TAB> → ssh prod.
Puedes tener docenas de entradas. Cada una con su puerto, usuario y clave.
Comodines
Si tienes varios servidores con la misma configuración base:
Host *.internal
User admin
IdentityFile ~/.ssh/id_ed25519
ForwardAgent yes
Host db.internal
HostName 192.168.1.10
Host web.internal
HostName 192.168.1.11
ssh db.internal y ssh web.internal heredan usuario, clave y ForwardAgent.
Túneles que no se olvidan
En vez de escribir esto cada vez:
ssh -L 5432:localhost:5432 -L 8080:localhost:8080 prod
Lo metés en la config y te olvidás:
Host prod-tunnel
HostName prod.example.com
User admin
LocalForward 5432 localhost:5432
LocalForward 8080 localhost:8080
ssh prod-tunnel y ya tienes los dos túneles levantados. Si desconectas, se cierran solos. No hay screen ni tmux que valgan.
También hay túneles inversos (RemoteForward) pero los uso menos. El día que los necesites, mismo mecanismo.
ProxyJump: el salto que no duele
Antes, para llegar a un servidor interno tenía que hacer:
ssh -J bastion.prod.com admin@10.0.0.5
En la config:
Host bastion
HostName bastion.prod.com
User admin
Host interno-1
HostName 10.0.0.5
User admin
ProxyJump bastion
ssh interno-1 hace el salto por bastion automáticamente. Y si tienes varios servidores detrás del mismo bastion, solo pones ProxyJump bastion en cada uno.
Multiplexión: no volver a autenticar
Si entras y sales de un servidor seguido (ansible, deploys, scripts), la autenticación SSH puede ser lenta. Con multiplexión, la primera conexión autentica y las siguientes reúsan el canal:
Host *
ControlMaster auto
ControlPath ~/.ssh/controlmasters/%r@%h:%p
ControlPersist 10m
Creá el directorio:
mkdir -p ~/.ssh/controlmasters
Ahora: primera conexión autentica normal, segunda es instantánea. El canal se mantiene 10 minutos después de cerrar la última sesión.
KeepAlive para que no se caiga
Si tu firewall corporativo mata conexiones inactivas:
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
Manda un paquete cada 60 segundos. Si no responde después de 3 intentos, se desconecta. Tus sesiones largas no se mueren solas.
Include: separar en archivos
Cuando la config crece, puedes partirla:
Include ~/.ssh/config.d/*.conf
Y creás:
~/.ssh/config.d/personal.conf
~/.ssh/config.d/trabajo.conf
~/.ssh/config.d/clientes.conf
Cada archivo con sus hosts. Se cargan en orden alfabético. Si hay conflicto, gana el último.
Ejemplo completo que uso
Host *
ServerAliveInterval 60
AddKeysToAgent yes
UseKeychain yes
Host bastion-prod
HostName 203.0.113.10
User admin
Host *.prod
ProxyJump bastion-prod
User admin
IdentityFile ~/.ssh/prod_ed25519
Host db.prod
HostName 10.0.1.5
LocalForward 5432 localhost:5432
Host web.prod
HostName 10.0.1.10
Host gh-personal
HostName github.com
User git
IdentityFile ~/.ssh/personal_ed25519
Si estás copiando y pegando comandos SSH de un .txt, dedícale 15 minutos a armar tu ~/.ssh/config. La primera vez que escribas ssh prod y funcione, no vuelves.