Un túnel ssh provisional

Para tener acceso a una máquina de backup instalada en una red extraña.

El caso es el típico: tengo un pequeño ordenador (un QNAP TS-220) con una Debian 10 instalada y dos discos de 1 Tb en RAID 1. Dispone de todo el software que necesito para realizar copias de seguridad en una pequeña red y debo instalarlo en tierra extraña: una vivienda con su fibra y su enrutador y su televisión y demás cosas, con máquinas dispares y sin ninguna intención de auxiliar a mi pequeño montaje.

El servidor de copias se instala junto al rúter de fibra y se le proporciona una conexión cableada al mismo y electricidad y allí te las apañes. Como estoy en los previos de montar una VPN, pero necesito situar ya la máquina allí, me decido por montar un túnel SSH inverso hacía el servidor principal en Internet que dispone de IP fija.

Así que los pasos que sigo son los siguientes:

  1. En el servidor de copias tengo un usuario especial para administración llamado operador.
  2. Para ese usuario creo un clave RSA y la transfiero a la misma cuenta en el servidor público.
  3. Creo el túnel SSH conectándome con el servidor público y le indico que una vez creada la conexión se quede a la escucha en el puerto 40022 y que haga de puente con el puerto 22 del servidor de copias.
  4. En el servidor público altero el cortafuegos para que los accesos desde Internet al puerto 40022.
$ ssh -nNT -p 372 -R 40022:localhost:22 -i ~operador/.ssh/id_rsa operador@servidor.publico

Luego intento conectar desde mi máquina personal con ese sistema empleando al servidor público como puente.

Host        servidor
Hostname    servidor.publico
Port        372
User        operador

Y ahora probamos a pedir la hora, por ejemplo, directamente en el servidor.

$ ssh -J servidor -p 40022 operador@localhost date 
Sat Nov 28 12:24:20 CET 2020
$

autossh

Lo anterior está bien pero necesitamos que el túnel sea creado automáticamente y mantenido en el tiempo. Empleamos para eso el programa autossh y lo llamamos de la siguiente manera:

$ autossh -f -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -nNT -p 372 -R 40022:localhost:22 -i ~operador/.ssh/id_rsa operador@servidor.publico

El programa crea el túnel, se pasa a segundo plano y lo mantiene abierto enviando pequeños paquetes regularmente.

Como el invento nos funciona vamos un paso más y lo incluimos entre los servicios del sistema. Con un archivo de servicio para systemd como el siguiente:

[Unit]
Description=AutoSSH tunnel service to servidor.publico
After=network.target

[Service]
User=operador
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -nNT -p 372 -R 40022:localhost:22 -i ~operador/.ssh/id_rsa operador@servidor.publico

[Install]
WantedBy=multi-user.target

El servicio está indicando que ejecute lo mismo que antes a mano, con el usuario operador para no tener líos con los archivos, y que lo haga tras tener la red activa.

Una vez habilitado el servicio éste se arranca automáticamente tras un reinicio de prueba de la máquina. Está lista para llevarla a su nuevo hogar y desde mi casa tener acceso a la misma. Confío incluso en poder añadirla a la VPN en remoto.

Referencias