A partir de la versión 4 de OpenSSH se pueden compartir las conexiones seguras a un máquina remota, de tal manera que, una vez establecida la primera conexión, el resto de conexiones reutilizan la primera, por lo que el establecimiento de la conexión de éstas será mucho más rápido.

Configuración

Lo primero es asegurarnos de que existe el directorio ~/.ssh en el cliente, con permisos 700 (sólo accesible por nosotros mismos... y cualquier administrador).

A continuación, añadimos las siguientes líneas al fichero ~/.ssh/config:

bash Host * ControlPath ~/.ssh/master-%l-%r@%h:%p ControlMaster auto

  • Host * especifica que se aplica a cualquier máquina remota,
  • ControlMaster auto especifica que se reutilice una conexión existente, si es posible, y
  • ControlPath ~/.ssh/master-%l-%r@%h:%p especifica dónde se debe crear el fichero de socket que representa la conexión maestra. %r se sustituye por el nombre de usuario, %h por el nombre de la máquina remota, %p por el puerto remoto y %l por el nombre de la máquina local, que, aunque sólo es útil si el directorio se puede montar en varias máquinas (por ejemplo, si el directorio de usuario se monta por NFS), no molesta si se incluye siempre.

Comparación de tiempos

Para la primera conexión:

```bash $ time ssh user@remote exit

real 0m1.217s user 0m0.012s sys 0m0.004s ```

Para las siguientes conexiones:

```bash $ time ssh user@remote exit

real 0m0.168s user 0m0.008s sys 0m0.012s ```

La diferencia es notable. Para evitar que nos pida la contraseña y tener que introducirla manualmente, podemos utilizar el inicio de sesión por clave, o recurrir al comando expect para evitar introducir la contraseña.

Las siguientes conexiones

Si estamos haciendo estas pruebas utilizando algunos de los scripts que se basan en expect es posible que nos de un error o un al intentar enviar la contraseña, ya que mientras estemos haciendo uso de la conexión compartida, para las siguientes conexiones no será necesario introducir la contraseña.

Ademá, dado que se reutiliza la conexión maestra, si queremos conectarnos utilizando diferentes parámetros deberemos crear una conexión nueva, utilizando el argumento -S none:

bash $ ssh -S none -X user@remote

Ficheros de socket

Si no finalizamos la conexión correctamente, es posible que el fichero de socket no se elimine correctamente, lo que puede provocar que no nos permita volver a conectarnos:

bash Control socket connect(/home/user/.ssh/master-remote-local@example.net:1234): Connection refused ControlSocket /home/user/.ssh/master-remote-local@example.net:1234 already exists

Simplemente debemos eliminar estos ficheros para solucionarlo.

Salir de la sesión maestra mientras hay otras conexiones

Si salimos de la sesión maestra mientras hay más conexiones abiertas, la primera quedará colgada hasta que terminen el resto de sesiones. Una posible solución para evitar este inconveniente es realizar la conexión maestra utilizando el argumento -N para que no nos ofrezca un terminal, y matar el proceso cuando ya no la necesitemos.


Entradas relacionadas


Published

Category

admin

Tags

Contacto