Scripts et Programmation

iptables : Port Knocking pour ouvrir SSH

Table des matières

Introduction



Knock Knock Knock ! Connaissez-vous le port knocking ?

Le tocage à la porte, ou port-knocking, est une méthode permettant de modifier le comportement d'un pare-feu (firewall) en temps réel en provoquant l'ouverture de ports permettant la communication, grâce au lancement préalable d'une suite de connexions sur des ports distincts dans le bon ordre, à l'instar d'un code frappé à une porte.

C'est pratique d'un point de vue sécurité pour par exemple toujours fermer le port 22 (SSH) et l'ouvrir quand une séquence est réalisée.

Ci-dessous, voici le script, assez commenté. Vous pouvez l'adapter évidemment.

Séquence utilisée



J'utilise la séquence de port 100 puis 200 puis 300 puis 400.
J'ai défini une limitation avec au maximum 10 secondes pour effectuer les tentatives.
Ce sont des paquets TCP qu'on doit envoyer sur ces ports.
Si on met trop de temps à l'étape 3, il faut repartir depuis le début.

Donc on peut utiliser telnet pour envoyer les paquets :
Code BASH :
telnet server 100
telnet server 200
telnet server 300
telnet server 400


Ou bien via un navigateur web :
Code BASH :
http://server:100∕
http://server:200∕
http://server:300∕
http://server:400


Même si la connexion est refusée, le paquet est envoyé ;)

Le script



Code BASH :
#! /bin/bash
 
####### Menage avant initialisation
# Si pas d'autres scripts avec iptables :
iptables -X
iptables -F
# On nettoie les chaines du code
iptables -X INTO-P2
iptables -X INTO-P3
iptables -X INTO-P4
 
 
####### Exclusions SSH sans passer par le code secret #######
#iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 22 -j ACCEPT
#iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 22 -j ACCEPT
#iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 22 -j ACCEPT
 
###### Accepter les connexions en cours #######
iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state RELATED -j ACCEPT
 
####### Etapes du code secret #######
####### Creation des chaines puis ajout des regles
iptables -N INTO-P2
iptables -A INTO-P2 -m recent --name P1 --remove
iptables -A INTO-P2 -m recent --name P2 --set
iptables -A INTO-P2 -j LOG --log-prefix "INTO P2: "
 
iptables -N INTO-P3
iptables -A INTO-P3 -m recent --name P2 --remove
iptables -A INTO-P3 -m recent --name P3 --set
iptables -A INTO-P3 -j LOG --log-prefix "INTO P3: "
 
iptables -N INTO-P4
iptables -A INTO-P4 -m recent --name P3 --remove
iptables -A INTO-P4 -m recent --name P4 --set
iptables -A INTO-P4 -j LOG --log-prefix "INTO P4: "
 
iptables -A INPUT -m recent --update --name P1
 
####### Definition du code secret avec le délai pour chaque phase avant expiration. 
####### Ici exemple 100 puis 200 puis 300 puis 400. Aléatoire conseillé
 
iptables -A INPUT -p tcp --dport 100 -m recent --name P1 --set
iptables -A INPUT -p tcp --dport 200 -m recent --rcheck --seconds 10 --name P1 -j INTO-P2
iptables -A INPUT -p tcp --dport 300 -m recent --rcheck --seconds 10 --name P2 -j INTO-P3
iptables -A INPUT -p tcp --dport 400 -m recent --rcheck --seconds 10 --name P3 -j INTO-P4
 
####### Une fois la P4 atteinte, la connexion port SSH dispo.
 
iptables -A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 10 --name P4 -j ACCEPT
 
####### Règle par défaut si tout ce qui est au dessus est pas respecté : port 22 fermé ########
 
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j DROP
Cette page a été vue 8367 fois