La teoría de estos sistemas es bastante sencilla. Consiste en correr un
servidor que esta a la escucha en un interfaz indicada, esperando
secuencias de "llamadas" a una secuencia de puertos, con el fin de
ejecutar un comando dependiendo de la secuencia. Aunque parezca algo
sencillo a simple vista, puede ser muy útil como medidas para ejecutar
comandos especiales remotamente sin necesitar de abrir un ssh.
Estas escuchas se hacen a nivel de capa de enlace, por lo que no es
necesario que los puertos estén abiertos, para tener información de que
puertos han recibido un "knock". Es recomendable que utilicemos una
secuencia de puertos no consecutiva, no incremental o decremental, etc
es decir algo que no sea fácil de averiguar por otra gente ajena a
nosotros.
He encontrado un sistemad de este tipo llamado Knockd, cuyo paquete nos lo podemos bajar de:
http://www.zeroflux.org/knock/knock-0.2.1.tar.gz.
Para instalarlo basta con el típico:
./configure && make && make install,
Eso si aseguraros de tener las libpcap-dev, ya que se basa en ellas.
Una vez lo hayamos compilado correctamente, podemos distinguir 3
ficheros importantes.
El Knockd es el servidor, que se ejecutara en el ordenador que queremos
que este ala escucha y ejecute los comandos en función de la secuencia
que mandemos. Aquí os pongo sus opciones:
-i, --interface <int> La interfaz en la que escuchara, por defecto eth0
-d, --daemon Si lo queremos corres en modo demonio.
-c, --config <file> El fichero de configuración, por defecto /etc/knock/.etc
-D, --debug Mensajes de debugging..
-v, --verbose Una salida con mas información.
-V, --version Muestra la versión.
-h, --help Ayuda.
El Knock es, por decirlo de algún modo, el llamador. Su sintaxis es muy
sencilla, ya que tenemos que indicarle, el host al que queremos llamar,
y la secuencia de puertos.
-u, --udp Mandar paquetes UDP, por defecto TCP
-v, --verbose Una salida con mas información
-V, --version Muestra la versión
-h, --help Ayuda.
El /etc/knock.conf, aquí es donde indicamos toda la relación de
comandos con la de secuencias de puertos, así como otro tipo de
configuraciones. Estos son los parámetros que podemos poner.
UseSyslog
Esto hace que se introduzcan mensajes de información en el syslog.
LogFile = /path/to/file
Archivo de log.
PidFile = /path/to/file
Cuando corre en demonio podemos indicarle un archivo PID..
Sequence = port,port,port...
Secuencia de puertos.
Protocol = tcp|udp
Que protocolo utilizaran los paquetes que nos enviaran.
TCPFlags = fin|syn|rst|psh|ack|urg
Podemos especificar la bandera de los paquetes a los que haremos caso.
Command = command
El comando que ejecutaremos, con esa secuencia. Existe una variable
llamada %IP%, que contiene la ip del que nos ha mandado la secuencia de
puertos.
Ahora pasemos a la versión practica. Lo primero que tenemos que hacer
es escribir nuestro knock.etc, para ello podemos indicar conjuntos como
estos:
Ahora corremos el knockd en el host en el que queremos ejecutar
comandos: knockd -i eth0 -v. Despues ya solo falta utilizar el knock,
es decir el llamador cuando queramos ejecutar algo. Un ejemplo de
salida seria el siguiente:
Cliente:
# /usr/local/bin/knock -v 192.168.1.1 7000 8000 9000
hitting tcp 192.168.1.1:7000
hitting tcp 192.168.1.1:8000
hitting tcp 192.168.1.1:9000
#
Servidor:
./knockd -v
listening on eth0...
192.168.1.3: Abrir el FTP para mi: Stage 1
192.168.1.3: Abrir el FTP para mi: Stage 2
192.168.1.3: Abrir el FTP para mi: Stage 3
192.168.1.3: Abrir el FTP para mi: OPEN SESAME
running command: /sbin/iptables -I INPUT -s 192.168.1.3 -p tcp --dport 21 -j ACCEPT
Pues esto es todo, y espero que os sea tan útil como a mi me lo ha sido. Podeis encontrar mas información en: