El port knocking es una técnica que se utiliza para mantener uno o más puertos cerrados hasta que se detecte una secuencia de “golpeado” de puertos en un orden determinado.
El servicio se llama knockd el cual se lo puede encontrar en varias distribuciones.
En el caso de Debian:
apt-get install knockd
Una vez instalado el servicio habrá que habilitarlo, ya que se encuentra deshabilitado de manera predeterminada.
vi /etc/default/knockd #Cambiar 0 por 1 START_KNOCKD=1 #Si quiero que escuche en una interfaz determinada, lo defino en esta variable KNOCKD_OPTS="-i eth1"
Editar la configuración para definir la secuencia de puertos y la configuración de iptables para habilitar o deshabilitar el puerto a ocultar.
La configuración predeterminada está pensada para un iptables con la política DROP de manera predeterminada.
Si no fuera tu caso y tuvieras distintas reglas de acceso con ACCEPT, y como última regla un DROP/REJECT, hay que cambiar el iptables -A por iptables -I, así la regla se agrega a la cabeza de las demás reglas.
vi /etc/knockd.conf [openSSH] sequence = 3050,4060,5070 seq_timeout = 5 command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 5070,4060,3050 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
Luego de grabar el archivo de configuración hay que reiniciar el servicio
/etc/init.d/knockd restart
Por último probar la secuencia de puertos. Se puede realizar ejecutando 3 telnets en orden, netcat, nmap, etc
En este caso utilizo nmap. La opción -r es para desactivar el random en el orden de los puertos, y que lo haga de manera secuencial
nmap -r -p 3050,4060,5070 10.0.0.139 tail -f /var/log/syslog Sep 11 01:17:44 zeque knockd: 10.1.32.24: openSSH: Stage 1 Sep 11 01:17:44 zeque knockd: 10.1.32.24: openSSH: Stage 2 Sep 11 01:17:44 zeque knockd: 10.1.32.24: openSSH: Stage 3 Sep 11 01:17:44 zeque knockd: 10.1.32.24: openSSH: OPEN SESAME Sep 11 01:17:44 zeque knockd: openSSH: running command: /sbin/iptables -I INPUT -s 10.0.32.24 -p tcp --dport 22 -j ACCEPT
Podemos ver que se ejecuto la regla de iptables -I aceptando la IP de origen.
Ahora utilizo la secuencia inversa para cerrar el puerto.
nc 10.0.34.139 5070 4060 3050 tail -f /var/log/syslog Sep 11 01:30:53 zeque knockd: 10.0.32.24: closeSSH: Stage 1 Sep 11 01:30:53 zeque knockd: 10.0.32.24: closeSSH: Stage 2 Sep 11 01:30:53 zeque knockd: 10.0.32.24: closeSSH: Stage 3 Sep 11 01:30:53 zeque knockd: 10.0.32.24: closeSSH: OPEN SESAME Sep 11 01:30:53 zeque knockd: closeSSH: running command: /sbin/iptables -D INPUT -s 10.0.32.24 -p tcp --dport 22 -j ACCEPT
Al hacer la secuencia de cierre, se puede ver que se ejecuta iptables -D para borrar la regla agregada anteriormente.