túneles SSH – túnel persistente


Esta es una ténica muy potente para jugar con túneles. En otros posts se había visto como se crean de manera interactiva, esto es con la intervencíon más o menos directa del usuario. Pero en este caso, vamos a ver como se hace para que una máquina abra túnel SSH contra otra (u otras) gestionando la creación del túnel, y si por cualquier problema de red esa conexión se corta, es el propio proceso init quien se encarga de reestablecer la conexión y el túnel.

La encontré en un artículo de la revisa SysAdmin Magazine, y la usaban como apoyo para montar una infraestructura de Syslog-NG donde los logs de los servidores se redirigían a un servidor central donde se procesan y archivan. De todas maneras, la técnica en sí del túnel SSH por init me pareció lo suficientemente interesante por sí misma puesto que en otros entornos puede ser de gran ayuda contar con ella.

  • Certificados SSH
  • El primer paso, es crearse los certificados de SSH para poder logar de la máquina A a la B sin que pida el password de usuario. De otra forma tendríamos que hardcodearlo en algun archivo plano, y eso no es muy elegante.
    SSH sin password

  • Configuración inittab
  • Y el segundo paso, es añadir la siguiente línea al /etc/inittab de la maquina A
    -----------------------------------
    log1:3:respawn:/usr/bin/ssh -nNTx
    -R 514:maquinaB.domain.com:514
    maquinaA.domain.com >/dev/null 2>&1
    -----------------------------------

    NOTA: Aunque esté puesto a tres líneas para facilitar la explicación, en el fichero sólo deberá estar en una.

    Examinemos la entrada de inittab

    La segunda línea “-R 514:maquinaB.domain.com:514”, nos define un túnel de tipo remoto.
    La primera línea en cuanto a los parámetros del comando “ssh”, -n hace que asocie la entrada estándar con /dev/null puesto que lo ejecutaremos como un daemon vía init.

    Tambien al final del comando redirigimos la salida estándar y de errores a /dev/null ( ... > /dev/null 2>&1).

    Tampoco necesitamos que se ejecuten comandos con esta conexión están los parámetros (solo queremos el túnel), el parámetro -T significa que no aloje una pseudo-tty y el -N que no prepare un stream de comandos.
    La opción -x sólo es impedir la redirección de las X11.

    El resto de elementos de la linea son “log1” que ha de ser un string de 2-4 alfanuméricos, único en el archivo inittab, que hará la función de identificador. El segundo campo “3” es el runlevel en el que se ejecutará este comando.

    Cuidado porque debemos asegurarnos de que se ejecuta despues de que se configuren las interfaces de red, pero antes de que se inicialice el servicio que se apoya en los túneles. Es decir, que si vamos a montar un sistema que usa el túnel para enviar archivos por FTP, hemos de asegurarnos de que cuando se arranque el túnel esten listas las interfaces de red, pero se arranca el túnel antes de levantar el servicio FTP.

    La opción respawn es la que hace que se relanze un proceso SSH si detecta que el proceso ha muerto por cualquier motivo (reinicio del sistema remoto, problemas de red, …)

  • Pruebas
  • Cuando las claves públicas de SSH y la linea de inittab esté puesta, hay que mandar un HUP a init (kill -HUP 1), lo que causa que se relea el fichero /etc/inittab y lance el proceso SSH. Comprobamos que efectivamente see han abierto los túneles que hayamos definido con “netstat -natet voilá!

One Response to “túneles SSH – túnel persistente”

  1. En esta parte del comando (-R 514:maquinaB.domain.com:514 ) para que sirve el 514? Y una vez establecida la conexión persistente, cómo puedo usarla?

    Salu2

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: