<$BlogRSDUrl$>

12 marzo 2009

Tunel SSH Permanentes entre Servidores Linux 

Vuelvo a mis fueros técnicos con una traducción (un poco libre) de un artículo en Inglés sobre el tema que marca el título. Que lo disfrutéis.
Si estás leyendo esto es que quieres conectar un servicio entre dos máquinas comunicadas por un canal no seguro através de ssh. Suponemos que ese servicio es mysql, pero puede ser cualquier otro y solo hay que modificar los scripts para que usen el puerto correspondiente.
Planteamiento del escenario:

------------ -----------------
-- HOST A -- --------- Internet ------------ HOST B --
-- -- -- ssh y mysql --
------------ -----------------


Los requerimientos son:

Pasos:

Crear un usuario ‘tunnel’ en HostA:
[root@hosta ~]# useradd -d /home/tunnel tunnel
[root@hosta ~]# passwd tunnel ## Un pasword fuerte
[root@hosta ~]# su - tunnel ## Convertirse en el usuario 'tunnel'


Crear un par de claves pública/privada
[tunnel@hosta ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tunnel/.ssh/id_rsa): ## pulsar enter
Enter passphrase (empty for no passphrase): ## no usar password
Enter same passphrase again:
Your identification has been saved in /home/tunnel/.ssh/id_rsa.
Your public key has been saved in /home/tunnel/.ssh/id_rsa.pub.
The key fingerprint is:
6f:30:b8:e1:36:49:74:b9:32:68:6e:bf:3e:62:d3:c2 tunnel@hosta
Ahora usa cat para ver el fichero id_rsa.pub que contiene la clave pública que necesitas pner en HostB.
[tunnel@hosta ~]# cat /.ssh/id_rsa.pub
ssh-rsa blahAAAAB3NzaC1yc2EAAAABIwAAAQEA......6BEKKCxTIxgBqjLP tunnel@hosta
Ahora crea un usuario 'tunnel' en HostB y guarda la clave pública de tunnel@HostA en el fichero de claves autorizadas:
[root@hostb ~]# useradd -d /home/tunnel tunnel
[root@hostb ~]# passwd tunnel ## Un pasword fuerte
[root@hostb ~]# su - tunnel
[tunnel@hostb ~]# mkdir .ssh
[tunnel@hostb ~]# vi .ssh/authorized_keys ## Now paste in the public key for tunnel@hosta
En este momento deberías poder conectarte desde HostA a HostB con el usuario tunnel sin usar un passwrod. Depende de tu configuración, es posible que debas añadir al usuario 'tunnel' a los usuarios permitidos en /etc/ssh/sshd_config. También es posible que quieras cambiar algunas opciones de SSh, como el puerto de destino, en ~/.ssh/config.

Ahora creamos el script /home/tunnel/check_ssh_tunnel.sh en HostA
createTunnel() {
/usr/bin/ssh -f -N -L13306:hosta:3306 -L19922:hosta:22 tunnel@hostb
if [[ $? -eq 0 ]]; then
echo Tunnel to hostb created successfully
else
echo An error occurred creating a tunnel to hostb RC was $?
fi
}
## Run the 'ls' command remotely. If it returns non-zero, then create a new connection
/usr/bin/ssh -p 19922 tunnel@localhost ls
if [[ $? -ne 0 ]]; then
echo Creating new tunnel connection
createTunnel
fi
Guardamos el fichero y lo hacemos ejecutable:

chmod 700 ~/check_ssh_tunnel.sh
El script intenta conectarse al puerto local 19922 y ejecutar el comando ls. Si falla, intenta crear el tunel SSH. El comando para crear el tunel SSH, tunelará el puerto local 13306 al puerto 3306 de HostB. Puedes modificar aquí lo necesario para que los puertos se adecuen a tus necesidades. También crea un tunel del puerto local 19922 al puerto 22 en HostB que comprobar la conexión.

Ahora solo añade el script al crontab del usuario 'tunnel' para que se compruebe la conexión cada pocos minutos. Automáticamente reconectará el tunel si algo falla. Cuando crea una nueva conexión enviará un correo al usuario definido en el crontab.

Etiquetas: , , , ,


0 Comentarios
Comentarios: Publicar un comentario
Nedstat Basic - Estadisticas gratis