viernes, 4 de noviembre de 2011

Evitar timeout de sesiones SSH en Centos, Red Hat y Fedora

A veces estamos trabajando a través de SSH, dejamos de usar la sesión durante unos minutos y al volver a ella nos encontramos que la sesión ya no funciona. Al estar la sesión inactiva, el timeout ha expirado y tenemos que volver a iniciar sesión.

Por supuesto, se trata de un mecanismo de seguridad que viene activado por defecto en los servidores SSH de Centos, Red Hat y Fedora. A través de este mecanismo se previene que alguien le pueda dar un mal uso a una sesión SSH que otro usuario haya dejado abierta sin querer en algún ordenador. En Debian y Ubuntu la configuración por defecto no activa este mecanismo.

Sin embargo, en determinadas situaciones esto es especialmente molesto, sobre todo cuando estamos trabajando con varias ventanas o aplicaciones y entre ellas se encuentra una sesión SSH que usamos sólo de vez en cuando. Tenemos que estar continuamente abriendo consolas SSH y si encima teníamos abiertas varias sesiones a la vez, cosa muy habitual por otra parte, entonces los pensamientos (o gritos en los más expresivos) maldiciendo al servidor o al árbol genealógico de los creadores del SSH se multiplican.

Como ya he comentado, la sesión expira debido a la falta de actividad o intercambio de datos entre el cliente y el servidor. Algunos solucionan este problema dejando abierto algún comando que continuamente intercambie datos, como por ejemplo el comando top o watch. Sin embargo, si olvidas dejar ese comando antes de dejar de usar la consola te encontrarás una bonita sesión expirada al volver a usarla. :p

La solución en el caso de que esto suponga un problema es bien sencilla. Basta con configurar dos parámetros en el servidor SSH. En concreto se trata de los parámetros ClientAliveInterval y ClientAliveCountMax. El primer parámetro establece el tiempo en el que, en caso de estar la conexión SSH inactiva, el servidor SSH enviará una petición al cliente para comprobar si sigue existiendo la conexión, o en otras palabras, para comprobar si el cliente sigue "vivo". El segundo parámetro indica cuantas peticiones con el fin anterior sin respuesta se van a permitir como máximo antes de dar por finalizada la conexión.

Dicho de otro modo, configurando adecuadamente los parámetros anteriores, el servidor SSH en caso de encontrarse una sesión inactiva, enviará peticiones al cliente para comprobar que la conexión sigue existiendo y no cerrará la sesión SSH a menos que realmente la conexión se pierda.

Estos parámetros se configuran en /etc/ssh/sshd_config y una configuración típica es:

ClientAliveInterval 10
ClientAliveCountMax 3

Lo que quiere decir esta configuración es que en las sesiones inactivas el servidor comprobará que la conexión sigue activa cada 10 segundos y si es así no cerrará la sesión. En el caso de que realmente se interrumpa la comunicación entre el servidor y el cliente, el servidor la dará por "muerta" a los 3 intentos fallidos, es decir, en 30 segundos (10x3).

Como decía, en el fichero sshd_config por defecto de Centos, Red Hat y Fedora no vienen estos valores (o vienen comentados) y el valor por defecto de ClientAliveInterval es 0. Por tanto, eso significa que no se van a realizar las comprobaciones anteriores y de ahí que nuestra sesión caduque al poco tiempo de dejar de usarla.

Por último, comentar que realmente sólo es estrictamente necesario el parámetro ClientAliveInterval ya que el valor por defecto de ClientAliveCountMax es precisamente 3. Sin embargo, no está de más ponerlo.

Espero que os sea de utilidad.
;-)

1 comentario:

TokeRock dijo...

Muy bueno el aporte!
Lamento que haya sido un poco tarde para mi, se ha cortado la conexión via SSH por el motivo que tu indicas, durante la actualización de la versión de PHP a 5.3.
A ver ahora como continúo con ella...

Aún así, gran aporte!