Conectar de manera segura desde ip dinámica.

En el anterior articulo de iptables. Especificamos unas ips de origen, a las cuales permitíamos el acceso por ssh y ftp. Ya vimos que esto no es siempre posible, debido a que la mayoría de las personas no tienen ip fija.

Para solventar este inconveniente, haremos uso de un demonio que escucha en una interface todo el tráfico de red, en busca de una determinada secuencia de “toques” a los puertos.
Desde el host remoto, tocaremos esos puertos y el servidor nos permitirá el acceso por ese puerto. Tened en cuenta que no nos abre la conexión, simplemente la permite, por lo que tendrás que validarte en el servicio correspondiente.
Usaremos knockd:

apt-get install knockd

Para permitir el arranque del demonio, deberemos poner la variable “START_KNOCKD” a “1″, en el fichero /etc/default/knockd. Aquí también podremos definir la interfaz en la que va a escuchar.
Para especificar una secuencia de puertos lo haremos en el fichero de configuración /etc/knockd.conf

[options]
logfile = /var/log/knockd.log

[opencloseSSH]
sequence = 3443,3943,9040
seq_timeout = 5
tcpflags = syn,ack
start_command = iptables -A INPUT -p TCP --dport 22 -s %IP% -m state --state NEW -j ACCEPT
cmd_timeout = 25
stop_command = iptables -D INPUT -p TCP --dport 22 -s %IP% -m state --state NEW -j ACCEPT

[opencloseFTP]
sequence = 3433:tcp,8323:udp,1230:udp
seq_timeout = 5
tcpflags = syn,ack
start_command = iptables -A INPUT -p TCP --dport 20:21 -s %IP% -m state --state NEW -j ACCEPT
cmd_timeout = 25
stop_command = iptables -D INPUT -p TCP --dport 20:21 -s %IP% -m state --state NEW -j ACCEPT

El fichero de configuración es bastante intuitivo. Al principio hemos definido un log y luego dos secuencias de toques para abrir el ssh o el ftp.
sequence: Especificamos la secuencia de puertos, por defecto son tcp, pero podemos indicar udp también.
seq_timeout: La secuencia debe ser ejecutada en ese intervalo de tiempo.
tcpflags: Los paquetes que tendrá en cuenta el demonio.
start_command: El comando que ejecutará.
cmd_timeout: Tiempo que espera para el siguiente comando.
stop_command: Otro comando que ejecutará.

Si recordáis el articulo sobre iptables, nosotros añadimos una regla, con la cual dejabamos pasar las conexiones establecidas. Por lo tanto, si ejecutamos la secuencia y conectamos, da igual que se quite la regla del firewall, ya que nosotros ya tendremos la conexión previamente establecida.
Si no tuviesemos esa regla, tendríamos que obviar las dos últimas lineas y meter otra secuencia solo para cerrar la conexion.

[openSSH]
sequence = 3444,5943,2040
seq_timeout = 5
tcpflags = syn,ack
start_command = iptables -A INPUT -p TCP --dport 22 -s %IP% -m state --state NEW -j ACCEPT

[closeSSH]
sequence = 7632,5032,5434
seq_timeout = 5
tcpflags = syn,ack
start_command = iptables -D INPUT -p TCP --dport 22 -s %IP% -m state --state NEW -j ACCEPT

Reiniciamos el demonio una vez configurado.
/etc/init.d/knockd restart

Partimos de la base de que el servidor tiene iptables configurado como comentamos en el articulo Asegurando Servidor Web I iptables.
Por lo que un intento de acceso por ssh deberia de ser rechazado desde una ip no definida en el:
Desde el cliente:
ssh root@servidor

ssh: connect to host servidor port 22: Connection timed out

Desde el servidor:
tail -f /var/log/syslog

Jun 26 00:30:42 xen01 kernel: Intento_SSH: IN=eth0 OUT= MAC=00:16:3e:13:2b:3b:00:13:02:0f:49:62:08:00 SRC=10.0.0.2 DST=10.0.0.3 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=54096 DF PROTO=TCP SPT=60028 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0

Antes de validarnos con el knock, dejaremos el log de éste abierto en el servidor:
tail -f /var/log/knockd.log

Vamos a validarnos ahora con knockd antes de hacer la conexion, antes de nada instalamos el knockd en el cliente. No necesitaremos configurarlo ya que solo queremos el cliente:
apt-get install knockd
Y ahora le mandamos la secuencia de toques:

knock servidor 3443 3943 9040

El log del servidor:

[2008-07-10 19:11] 10.0.0.2: opencloseSSH: Stage 1
[2008-07-10 19:11] 10.0.0.2: opencloseSSH: Stage 2
[2008-07-10 19:11] 10.0.0.2: opencloseSSH: Stage 3
[2008-07-10 19:11] 10.0.0.2: opencloseSSH: Stage 4
[2008-07-10 19:11] 10.0.0.2: opencloseSSH: OPEN SESAME
[2008-07-10 19:11] opencloseSSH: running command: iptables -A INPUT -p TCP --dport 22 -s 10.0.0.2 -m state --state NEW -j ACCEPT

Ahora es el momento de conectarse, antes de que se ejecute el comando de cierre:
ssh root@servidor

root@servidor's password:

Y tras unos segundos, si volvemos al log del knockd del servidor:

[2008-07-10 19:11] opencloseSSH: running command: iptables -D INPUT -p TCP --dport 22 -s 10.0.0.2 -m state --state NEW -j ACCEPT

Ya no podremos conectarnos:
ssh root@servidor

ssh: connect to host servidor port 22: Connection timed out

Pero si manejar la sesión que dejamos abierta.

El uso de knockd no se limita solamente a reglas del iptables, podréis ejecutar cualquier comando que especifiquéis en “start_command”.
También existe cliente para windows.

bookmark bookmark bookmark bookmark

Dejar una Respuesta.