02-27-2007, 06:39 PM
La idea de este tuto es evacuar una de las dudas que surgio en este post: No dar señales en la red
La solución a esta pregunta la da un pequeño programita llamado knockd.
NOTA: Antes que nada aclaro que vamos a realizar tareas que necesitan cierta experiencia en el mundo Linux pero que no son imposibles de llevar a cabo.
La teoria:
knockd es lo que se conoce como port-knock server. Su funcion es la de "escuchar" todo el trafico en una interface ethernet o PPP (trabaja a nivel de la capa de enlace) en busca de una secuencia de "golpes" en ciertos puertos (port-hits).
Estos "golpes" (port-hits) son generados por una aplicación cliente mediante el envio de paquetes TCP o UDP al servidor. Por supuesto que los mismos no deben estar abiertos (en uso por alguna aplicacion).
Cuando el servidor detecta que una secuencia especifica de puertos han sido "golpeados" ejecuta un proceso especificado en su archivo configuracion. Esto puede ser usado, por ej., para abrir un puerto en un firewall para acceso temporario o simplemente para ejecutar un comando o script.
Ahora si!, la practica:
Lo primero que vamos a hacer es bajar la ultima version de knockd de aca: http://www.invoca.ch/pub/packages/knock/
Como veran es un RPM que contiene los fuentes que vamos a compilar con las tipicas sentencias:
./configure
make
make install
(Ok debianeros!, para Udes. tambien hay: http://packages.debian.org/unstable/net/knockd)
NOTA: Debemos tener instalados previamente los siguientes paquetes para que todo funcione bien durante la compilacion:
libpcap: es una biblioteca que implementa funciones para la captura de paquetes en una red, para lo cual coloca la placa de red en modo promiscuo.
bison: Bison es un generador de analizadores sintácticos, un sustituto de YACC ("Yet Another Compiler Compiler", otro compilador de compiladores). Es decir que es un programa que genera un programa que analiza la estructura de un archivo de texto.
flex: Flex es una herramienta para generar programas que reconocen patrones léxicos en un texto.
Una vez compilado e instalado todo vamos a modificar/agregar opciones en el archivo de configuracion /etc/knockd.conf; en él aparecen varios "tags" que vamos a enumerar:
el "tag" [options] es usuado para definir opciones globales, es decir que afecten a todas las directivas; dentro de el podemos usar:
UseSyslog
Los logs son manejados a traves del syslog(). Los mensajes son enviados al archivo /var/log/messages (o equivalente)
LogFile = /path/a/un/archivo
Especifica el archivo en el que se escribiran los logs que genere el programa
PidFile = /path/a/un/archivo
Esto se usa cuando el programa corre en modo daemon, por default seria /var/run/knockd.pid
Interface = <placa_de_red>
Nombre de la placa de red donde se "escuchara" el trafico (eth0, eth1, PPP, etc.)
Luego aparecen otro "tags" que son definidos por los usuarios para distinguir entre varias directivas (en el ejemplo [openSSH]). Dentro de estas directivas de usuario podemos utilizar:
Sequence = <puerto1>[:<tcp|udp>][,<puerto2>[:<tcp|udp>] ...]
Especifica la secuencia de puertos a encontrar. (por default son TCP).
One_Time_Sequences = /path/al/archivo/one_time_sequences
Es un archivo que contiene secuencias que se usuaran una por vez en lugar de secuencias "fijas". Knockd pone un # (numeral) delante de cada secuencia una vez usadas.
Nota: Te recomiendo que dejes un espacio en blanco delante de cada secuencia porque knockd reemplaza el primer caracter de la cadena y si no lo haces la deja trunka...
Seq_Timeout = <timeout>
El tiempo en segundos a esperar para que se complete una secuencia.
TCPFlags = fin|syn|rst|psh|ack|urg
Solo toma en cuenta los paquetes que tienen estos flags activos.
Usar TCPFlags = syn es principalmente util para conexiones SSH ya que esta suele interferir y en consecuencia invalidar la secuencia de golpes...
Si queres especificar mas flags TCP los podes separar con comas (TCPFlags = syn,ack,urg) y pueden ser explicitamente excluidos anteponiendo un "!" (TCPFlags = syn,!ack)
El tema de flags TCP lo voy a dejar para otro tuto
Start_Command = <comando>
Esto especifica el comando a ejecutar cuando el cliente realiza un port-knock correcto.
Se puede usar la variable %IP% que sera reemplazada por la direccion IP del cliente.
La directiva Command es un alias de Start_Command.
Cmd_Timeout = <timeout>
Tiempo a esperar entre Start_Command y Stop_Command. Esta directiva es opcional y es requerida solo si Stop_Command es usada.
Stop_Command = <comando>
Especifica el comando a ejecutar cuando Cmd_Timeout segundos han pasado desde que Start_Command ha sido ejecutado.
Un ejemplo:
Supongamos que necesitamos habilitar una conexion SSH a nuestro equipo conectado a internet desde nuestro trabajo. Dentro del archivo /etc/knock.conf vamos a poner las siguientes directivas:
por default nos aparece:
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
como ves, golpendo en secuencia los puertos TCP 7000, 8000 y 9000 hacemos que nuestro firewall nos abra el puerto 22 (puerto de escucha de ssh) solo a nuetra IP... y listo!!...
Para cerrar la conexion solo debemos golpear en secuencia los puertos TCP 9000, 8000 y 7000....
ok, llego el momento de hacer que nuestro knock server arranque; en la linea de comandos ejecutamos /usr/local/sbin/knockd -d para correrlo como "demonio" o servicio (hay mas opciones desde la linea de comando pero eso te lo dejo para que lo investigues vos, jeje!)...
ahora bien, como hacemos con el cliente?.. no te desesperes que ya llega la segunda parte...
.
La solución a esta pregunta la da un pequeño programita llamado knockd.
NOTA: Antes que nada aclaro que vamos a realizar tareas que necesitan cierta experiencia en el mundo Linux pero que no son imposibles de llevar a cabo.
La teoria:
knockd es lo que se conoce como port-knock server. Su funcion es la de "escuchar" todo el trafico en una interface ethernet o PPP (trabaja a nivel de la capa de enlace) en busca de una secuencia de "golpes" en ciertos puertos (port-hits).
Estos "golpes" (port-hits) son generados por una aplicación cliente mediante el envio de paquetes TCP o UDP al servidor. Por supuesto que los mismos no deben estar abiertos (en uso por alguna aplicacion).
Cuando el servidor detecta que una secuencia especifica de puertos han sido "golpeados" ejecuta un proceso especificado en su archivo configuracion. Esto puede ser usado, por ej., para abrir un puerto en un firewall para acceso temporario o simplemente para ejecutar un comando o script.
Ahora si!, la practica:
Lo primero que vamos a hacer es bajar la ultima version de knockd de aca: http://www.invoca.ch/pub/packages/knock/
Como veran es un RPM que contiene los fuentes que vamos a compilar con las tipicas sentencias:
./configure
make
make install
(Ok debianeros!, para Udes. tambien hay: http://packages.debian.org/unstable/net/knockd)
NOTA: Debemos tener instalados previamente los siguientes paquetes para que todo funcione bien durante la compilacion:
libpcap: es una biblioteca que implementa funciones para la captura de paquetes en una red, para lo cual coloca la placa de red en modo promiscuo.
bison: Bison es un generador de analizadores sintácticos, un sustituto de YACC ("Yet Another Compiler Compiler", otro compilador de compiladores). Es decir que es un programa que genera un programa que analiza la estructura de un archivo de texto.
flex: Flex es una herramienta para generar programas que reconocen patrones léxicos en un texto.
Una vez compilado e instalado todo vamos a modificar/agregar opciones en el archivo de configuracion /etc/knockd.conf; en él aparecen varios "tags" que vamos a enumerar:
el "tag" [options] es usuado para definir opciones globales, es decir que afecten a todas las directivas; dentro de el podemos usar:
UseSyslog
Los logs son manejados a traves del syslog(). Los mensajes son enviados al archivo /var/log/messages (o equivalente)
LogFile = /path/a/un/archivo
Especifica el archivo en el que se escribiran los logs que genere el programa
PidFile = /path/a/un/archivo
Esto se usa cuando el programa corre en modo daemon, por default seria /var/run/knockd.pid
Interface = <placa_de_red>
Nombre de la placa de red donde se "escuchara" el trafico (eth0, eth1, PPP, etc.)
Luego aparecen otro "tags" que son definidos por los usuarios para distinguir entre varias directivas (en el ejemplo [openSSH]). Dentro de estas directivas de usuario podemos utilizar:
Sequence = <puerto1>[:<tcp|udp>][,<puerto2>[:<tcp|udp>] ...]
Especifica la secuencia de puertos a encontrar. (por default son TCP).
One_Time_Sequences = /path/al/archivo/one_time_sequences
Es un archivo que contiene secuencias que se usuaran una por vez en lugar de secuencias "fijas". Knockd pone un # (numeral) delante de cada secuencia una vez usadas.
Nota: Te recomiendo que dejes un espacio en blanco delante de cada secuencia porque knockd reemplaza el primer caracter de la cadena y si no lo haces la deja trunka...
Seq_Timeout = <timeout>
El tiempo en segundos a esperar para que se complete una secuencia.
TCPFlags = fin|syn|rst|psh|ack|urg
Solo toma en cuenta los paquetes que tienen estos flags activos.
Usar TCPFlags = syn es principalmente util para conexiones SSH ya que esta suele interferir y en consecuencia invalidar la secuencia de golpes...
Si queres especificar mas flags TCP los podes separar con comas (TCPFlags = syn,ack,urg) y pueden ser explicitamente excluidos anteponiendo un "!" (TCPFlags = syn,!ack)
El tema de flags TCP lo voy a dejar para otro tuto
Start_Command = <comando>
Esto especifica el comando a ejecutar cuando el cliente realiza un port-knock correcto.
Se puede usar la variable %IP% que sera reemplazada por la direccion IP del cliente.
La directiva Command es un alias de Start_Command.
Cmd_Timeout = <timeout>
Tiempo a esperar entre Start_Command y Stop_Command. Esta directiva es opcional y es requerida solo si Stop_Command es usada.
Stop_Command = <comando>
Especifica el comando a ejecutar cuando Cmd_Timeout segundos han pasado desde que Start_Command ha sido ejecutado.
Un ejemplo:
Supongamos que necesitamos habilitar una conexion SSH a nuestro equipo conectado a internet desde nuestro trabajo. Dentro del archivo /etc/knock.conf vamos a poner las siguientes directivas:
por default nos aparece:
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
como ves, golpendo en secuencia los puertos TCP 7000, 8000 y 9000 hacemos que nuestro firewall nos abra el puerto 22 (puerto de escucha de ssh) solo a nuetra IP... y listo!!...
Para cerrar la conexion solo debemos golpear en secuencia los puertos TCP 9000, 8000 y 7000....
ok, llego el momento de hacer que nuestro knock server arranque; en la linea de comandos ejecutamos /usr/local/sbin/knockd -d para correrlo como "demonio" o servicio (hay mas opciones desde la linea de comando pero eso te lo dejo para que lo investigues vos, jeje!)...
ahora bien, como hacemos con el cliente?.. no te desesperes que ya llega la segunda parte...

.
rotocolo]> [puerto[
) o desde un equipo que no es el nuestro y que ademas tiene instalado un Window$... como hacemos?.. por suerte existe una version cliente Cygwin/Win32 que podemos llevar encima (yo la llevo en mi pendrive 