El protocolo SSH (Secure SHell) es sin duda uno de los más utilizados para establecer conexiones seguras cliente-servidor. Gracias a él cualquier usuario puede conectarse a modo terminal a una máquina remota y tomar el control sobre ella fácilmente y de forma segura, ideal para servidores Linux. Aunque en muchas ocasiones hemos explicado el funcionamiento de este protocolo, existen muchas opciones avanzadas muy útiles que por lo general son desconocidas para la mayor parte de los usuarios, por ejemplo, la multiplexación.
En términos de definición, la multiplexación es una técnica que nos permite enviar más de una señal diferente a través de una única conexión. La multiplexación de las conexiones SSH, o SSH Multiplexing en su término técnico, nos va a permitir utilizar una conexión TCP previamente establecida para disponer de múltiples sesiones SSH simultáneas en lugar de crear una nueva conexión por cada sesión que queramos iniciar.
La principal ventaja de poder hacer uso de esta técnica es el ahorro de recursos y la eliminación de la sobrecarga que se genera al crear varias conexiones TCP simultáneas. Debido a que el número de conexiones TCP que podemos crear es finito y que se requiere de cierta potencia para controlarlas, cuantas menos conexiones simultáneas funcionará mejor la red y el sistema estará más liberado.
Podemos ver un ejemplo de esto analizando las tablas de conexiones de nuestro sistema. Un ejemplo sin multiplexación sería similar al siguiente, con 6 conexiones establecidas.
# Local Address Foreign Address State
# one connection
tcp 0 0 192.168.x.y:45050 192.168.x.z:22 ESTABLISHED
# two separate connections
tcp 0 0 192.168.x.y:45050 192.168.x.z:22 ESTABLISHED
tcp 0 0 192.168.x.y:45051 192.168.x.z:22 ESTABLISHED
# three separate connections
tcp 0 0 192.168.x.y:45050 192.168.x.z:22 ESTABLISHED
tcp 0 0 192.168.x.y:45051 192.168.x.z:22 ESTABLISHED
tcp 0 0 192.168.x.y:45052 192.168.x.z:22 ESTABLISHED
Y si activamos la multiplexación veremos que el rendimiento es igual a tener sólo 3.
# Local Address Foreign Address State
# one connection
tcp 0 0 192.168.x.y:58913 192.168.x.z:22 ESTABLISHED
# two multiplexed connections
tcp 0 0 192.168.x.y:58913 192.168.x.z:22 ESTABLISHED
# three multiplexed connections
tcp 0 0 192.168.x.y:58913 192.168.x.z:22 ESTABLISHED
Cómo configurar las conexiones SSH Multipleadas
La multiplexación en SSH se realiza modificando las directivas de configuración ControlMaster, ControlPath y ControlPersist. Estas 3 se encuentran en el fichero de configuración ssh_config, presente en el directorio ~/.ssh/config.
- ControlMaster indica si el servidor escuchará las conexiones de control y cómo tratarlas.
- ControlPath Se refiere a cómo se tratarán las conexiones multiplexadas y la ruta de acceso que se va a utilizar.
- ControlPersist dejará las conexiones de ControlMaster abiertas hasta que se cierren manualmente.
Un ejemplo de configuración SSH multiplexada sería el siguiente:
Host machine1
HostName machine1.example.org
ControlPath ~/.ssh/controlmasters/%r@%h:%p
ControlMaster auto
ControlPersist 10m
Con esta configuración a la hora de conectarnos podemos hacerlo tecleando simplemente ·ssh
Cómo establecer manualmente una conexión SSH Multiplexada
Para establecer una conexión multiplexada debemos utilizar en el comando los parámetros -M y -S que corresponden con ControlMaster y ControlPath respectivamente. Por ello, tras lanzar el comando SSH añadiremos -M para empezar a utilizar la multiplexación y -S seguido de la ruta de acceso a utilizar.
Por ejemplo:
ssh -M -S /home/fred/.ssh/controlmasters/fred@server.example.org:22 server.example.org
El resto de clientes que vayan a utilizar esa misma conexión deben crear la instancia modificando el socket de control (ControlPath o -S) para que coincida con el original. Por ejemplo:
ssh -S /home/fred/.ssh/controlmasters/fred@server.example.org:22 server.example.org
Finalizar conexiones SSH Multiplexadas
Para finalizar un servidor multiplexado debemos ejecutar el parámetro -O. Un ejemplo para finalizar el servidor 1 sería el siguiente:
ssh -O stop -S ~/.ssh/controlmasters/fred@server1.example.org:22 server1.example.org
Una vez introducido este comando el servidor se cerrará, quedando así la rama «maestra» finalizada, bloqueando nuevas conexiones multiplexadas pero manteniendo el funcionamiento de las conexiones ya establecidas hasta que se finalicen todas ellas.
Si en vez de -O stop tecleamos -O exit se finalizarán también todas las conexiones existentes.
Como hemos visto antes, también es posible configurar ControlPersist con un tiempo limitado para que el servidor y las conexiones finalicen automáticamente al transcurrir dicho periodo.