Table des matières
Le port knocking est une technique permettant d'ouvrir un port TCP après une combinaison de connexions sur divers ports préalablement choisis. Cela permet par exemple d'ouvrir le port SSH à la demande.
Plusieurs mécanismes permettent de réaliser le port knocking. Le plus simple étant un programme à l'écoute de la pile TCP, qui après avoir recut les packets SYN sur les bons ports exécute une commande prédéfinie. L'autre technique peu se faire au moyen de quelques lignes 'iptables'.
knockd est un daemon permettant de mettre en oeuvre cette technique simplement.
Celui-ci se base sur un unique fichier de configuration que nous allons voir immédiatement. Celui-ci se nomme /etc/knockd.conf
[options]
logfile = /var/log/knockd.log
Interface = eth1
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
Dans cet exemple il nous faudra transmettre des packets SYN sur les ports 7000, 8000 et 9000 de l'interface eth1 pour ouvrir la connexion à SSH et sur les ports 9000, 8000 et 7000 pour la fermer. On constate aussi qu'il s'agit d'une commande iptables qui ouvre le port 22, mais cela aurait pu être le démarrage du daemon sshd.
Simple et efficace.
Il s'agit de la méthode que je préfère car elle ne dépend pas d'un outil annexe. Je l'ai découverte sur le forum d'openwrt
#!/bin/sh # Pour ouvrir le port verrouiller par cle # nmap -PA100,200,300,400 -r -M1 @IP # ou # alias tl"="telnet @IP" # tl 100,200,300,400 PORT_KNOCK="22" /sbin/iptables -N INTO-PHASE2 /sbin/iptables -A INTO-PHASE2 -m recent --name PHASE1 --remove /sbin/iptables -A INTO-PHASE2 -m recent --name PHASE2 --set /sbin/iptables -A INTO-PHASE2 -j LOG --log-prefix "INTO PHASE2: " /sbin/iptables -N INTO-PHASE3 /sbin/iptables -A INTO-PHASE3 -m recent --name PHASE2 --remove /sbin/iptables -A INTO-PHASE3 -m recent --name PHASE3 --set /sbin/iptables -A INTO-PHASE3 -j LOG --log-prefix "INTO PHASE3: " /sbin/iptables -A INPUT -m recent --update --name PHASE1 /sbin/iptables -A INPUT -p tcp --dport 7000 -m recent --set --name PHASE1 /sbin/iptables -A INPUT -p tcp --dport 8000 -m recent --rcheck --name PHASE1 -j INTO-PHASE2 /sbin/iptables -A INPUT -p tcp --dport 9000 -m recent --rcheck --name PHASE2 -j INTO-PHASE3 /sbin/iptables -A INPUT -p tcp --dport $PORT_KNOCK -m recent --rcheck --seconds 5 --name PHASE3 -j ACCEPT iptables -P INPUT DROP # On conserve les connexions etablies iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT # on permet les connexions vers l'exterieur iptables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
En gros ça nous donne :
Connexion au port 7000 : enregistre l'@IP de l'emetteur dans la liste PHASE1
Connexion au port 8000 + @IP en PHASE1 : suppression @IP de la PHASE1 et enregistrement en PHASE2
Connexion au port 9000 + @IP en PHASE2 : suppression @IP de la PHASE2 et enregistrement en PHASE3 + ajoute la chaine ouvrant le SSH.
Propre et élégant :)
La transmission des fameux packets SYN peut se faire avec de nombreux outils, voilà déjà deux moyens simples d'y parvenir.
Une simple connexion telnet, disponible sur tous système, débute toujours par la transmission de ce type de packet.
alias syn='telnet @IP_Serveur' syn 7000; syn 8000; syn 9000; ssh @IP_Serveur
Entre chaque telnet on peut faire un 'Ctrl C' pour accélérer l'envoi des packets.
On peut aussi réaliser cet envoi avec la commande 'nmap'.
nmap -PA7000,8000,9000 -r -M1 @IP



Commentaires: