Llamando a la puerta de nuestro ordenador

knock knockHace tiempo contaba una forma de montar un apaño para poder ejecutar tareas puntuales en nuestro ordenador desde cualquier parte haciendo que éste leyese las órdenes que nosotros publicásemos en una web.

La ventaja de ese método no demasiado ortodoxo es que no necesitábamos abrir ningún puerto en nuestro router, pero por otra parte teníamos que disponer de un hosting web donde montar nuestra página desde la que enviar las órdenes.

Lo que vamos a ver ahora es otra forma de lanzar comandos en nuestro ordenador remotamente usando algo que en principio tampoco está pensado exactamente para esto: el port knocking.

La idea es que nuestro PC en principio no estará configurado para escuchar ningún tipo de conexión externa, pero como en las clásicas contraseñas de secuencias de golpes en la puerta podremos lanzar una serie de intentos de conexión en unos puertos determinados que se reconocerán como la señal para realizar alguna acción.

Para ello sólo necesitaremos instalar y configurar el paquete knockd.

Lo que hace este servicio es escuchar en todos los puertos a la espera de paquetes TCP con flag de SYN y comparar los paquetes consecutivos recibidos en diferentes puertos dentro de un periodo de tiempo con una lista de “contraseñas”.

Tras instalar knockd editamos el archivo de configuración /etc/knockd.conf. La configuración por defecto será algo como esto:

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 9000,8000,7000
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

Lo que nos dice esto es que si knockd recibe una secuencia de paquetes TCP con ese flag SYN en los puertos 7000, 8000 y por último 9000, todos ellos dentro de un espacio de 5 segundos, lanzará un comando iptables que agregará una regla al firewall para permitir la conexión a través del puerto 22 para la IP que ha enviado los paquetes.

Por otra parte si la secuencia es en los puertos 9000, 8000 y 7000 lo que hará es eliminar la regla anterior (si existiese) cerrando ese puerto en el firewall.

Una vez configurado el archivo anterior tendremos que arrancar el demonio knockd:

sudo /etc/init.d/knockd start

Y es que en principio esto está pensado como un paso adicional de autenticación para la conexión a través de ssh:

  • Impide cualquier intento de login por fuerza bruta ya que el servidor ssh ni siquiera es accesible hasta que enviemos la señal.
  • Nuestro servidor ssh no aparecerá como disponible para cualquiera que esté escaneando la red en busca de servicios activos.

Igual que para el ssh podemos usarlo por ejemplo para activar el acceso a un servidor FTP de forma que se abra el acceso cuando necesitemos subir o bajar algún archivo, pero manteniéndose oculto e inaccesible el resto del tiempo y para el resto de la gente.

La gracia adicional del port knocking es que no sólo le indicamos que queremos abrir un puerto al recibir una determinada secuencia, si no que nos permite indicar un comando completo de cualquier tipo, con lo que podemos reemplazar el comando iptables por cualquier cosa que queramos.

Podríamos por ejemplo arrancar un reproductor de música para que parezca que hay gente en casa mientras estamos de vacaciones, o arrancar un tunel ssh para crear una conexión ssh inversa a través de nuestro firewall desde el punto desde el que nos queramos conectar.

¿Y cómo lanzamos la secuencia de paquetes a los puertos? El paquete knockd también nos instala el programa knock:

knock 192.168.1.2 7000 8000 9000

Reemplazamos el 192.168.1.2 por la IP donde estará escuchando el knockd (si estamos fuera de casa será nuestra IP pública, obviamente, no la IP del PC).

Como decía al principio la complicación es que para poder hacer esto desde fuera de nuestra red local deberemos tener configurado el NAT para que dirija los puertos a nuestro PC (o colocar nuestro PC en la DMZ), pero por otra parte podemos mantener la seguridad dejando todos los puertos completamente cerrados con el firewall y aun así disponer de una forma de acceso segura a los servicios que necesitemos.