This is an old revision of the document!
Sistema de golpeo de puertos (Port knocking) simple
El golpeo de puertos (del inglés port knocking) es un mecanismo para abrir puertos externamente en un sistema de control de acceso, normalmente un firewall, mediante una secuencia de “golpes”. Normalmente esos golpes son intentos de conexión a puertos que se encuentran cerrados en un orden determinado. Una vez que el sistema encargado de controlar ese port knocking recibe una secuencia de conexión correcta, las reglas del cortafuegos son modificadas para permitir algo, normalmente la conexión a un puerto que antes estaba cerrado.
El propósito principal del golpeo de puertos es prevenir mostrar puertos abiertos por razones de seguridad. Como los mismos solo se abren ante un golpeo de puertos correcto, normalmente los puertos donde se brindan los servicios se muestran aparentemente cerrados.
Por lo general este mecanismo de golpeo de puertos se implementa configurando un servicio para que revise la bitácora o log del firewall para detectar esta secuencia de intentos de conexión. Otra forma es tener un proceso examinando paquetes con alguna interfaz de captura de paquetes, pero esto tiene que hacerse en puertos TCP que se encuentren “abiertos”.
Ya hay software dedicado para estos fines en casi todos los sistemas operativos, pero vamos a ver una forma simple y de andar por casa para implementar un port knocking. Este se basará en ofrecer un servicio de proxy socks5 en un determinado puerto, el cual solo estará abierto a las IPs que realicen bien el golpeo, que en el caso del ejemplo no será propiamente un golpeo, si no enviar una determinada string a un puerto concreto.
Script knoking.sh
#!/bin/bash ############# CONFIG ############## port=534 # Puerto del servidor socks5. service_log="sshd.service" # Logs de sshd donde se buscará la string. payload="stallmanissexy\|XXXX" # La cadena que dará acceso al puerto 534 a la IP que la envíe. logfile=/var/log/proxy_knock.log # Logs del script. cron="2 minutes ago" # Espacio de tiempo donde se buscará la cadena de tecto en los logs de sshd. # La tarea crontab debe estar configurada para ejecutarse cada 2 minutos en este ejemplo. ################################## # Se obtiene la IP de la persona que ingreso la cadena de texto pertinen, en este caso "stallmanissexy" o "XXXX" ips=$( journalctl -u $service_log --since "$cron" | grep -i "from" | grep -i "$payload" | egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq | paste -d',' -s) # Si hay una IP que ha enviado dicha cadena de texto, se abrirá el puerto pertinente para dicha IP. if [ -n "$ips" ]; then /usr/sbin/iptables -C INPUT -p tcp -s $ips --dport $port -j ACCEPT || (/usr/sbin/iptables -I INPUT -p tcp -s $ips --dport $port -j ACCEPT && echo "$(date "+%x %H:%M:%S") ips $ips added." >> $logfile) fi
Tarea crontab (cada dos minutos se ejecuta el script).
*/2 * * * * /root/proxy.sh