Port knocking – Parte 1 (archivio storico)

Articolo storico del 2012 sulla tecnica del port knocking con knockd/iptables, mantenuto per valore didattico con una nota moderna su limiti e alternative.

Archivio storico: articolo del 2012

Questo articolo viene conservato per valore storico e didattico. Il port knocking nasconde normalmente la porta finché non viene osservata una sequenza di pacchetti, ma non sostituisce autenticazione forte, VPN o ACL di rete. Le sequenze tradizionali non sono un segreto crittografico robusto, possono essere osservate/riprodotte e aggiungono stato dinamico al firewall. Gli esempi sottostanti usano inoltre iptables e configurazioni knockd dell’epoca.

Per un accesso amministrativo moderno preferiamo una VPN o rete di Gestione, SSH con chiavi forti e policy firewall esplicite. Vedi Hardening SSH e segmentazione con OpenWrt. Il testo storico originale segue senza essere trasformato retroattivamente in una guida 2026.

La tecnica del Port Knocking Il Port Knocking è una semplice ma al tempo stesso efficace politica di sicurezza per modificare da remoto ed in modo dinamico, le regole di firewalling di un server. Configurando un Port Knocking daemon sul proprio server, si può decidere di rendere accessibili le porte di alcuni demoni esclusivamente previa una precisa sequenza di pacchetti mandati dal client al server su determinate porte. In parole semplici, il Port Knocking consente di aprire un determinato servizio solo “bussando” a delle porte specifiche (chiuse) con una sequenza precisa e in un certo periodo di tempo. E’ bene evitare infatti di mostrare al “mondo” alcune porte tcp/udp di un server che deve fornire un determinato servizio in rete “on demand” e di lasciarle sempre attive. Vediamo come attuare questa tecnica con Linux. Per prima cosa dobbiamo installare il demone nel nostro sistema. Su Ubuntu, ma in generale su sistemi Debian possiamo usare il comando:
sudo apt-get install knockd
knockd è il port-knock server. Esso intercetta tutto il traffico di una interfaccia ethernet (o PPP), alla ricerca di speciali sequenze dette “knock” su particolari porte. knockd è in grado di rilevare tutto il traffico in ingresso, anche quello destinato a porte in stato closed. Quando il server rileva la sequenza esatta, manda in esecuzione un comando definito nel proprio file di configurazione, attraverso il quale il server può cambiare dinamicamente la configurazione del proprio firewall e consentire per esempio l’attivazione e l’accesso al servizio SSH. I file di configurazione del demone sono due: /etc/default/knock e /etc/knock.conf. Il primo file si presenta in questo modo:
################################################ # # knockd’s default file, for generic sys config # ################################################ # control if we start knockd at init or not # 1 = start # anything else = don’t start START_KNOCKD=0 # command line options #KNOCKD_OPTS=-i eth0
Il parametro START_KNOCKD definisce l’attivazione del demone. Impostato a zero il demone non è in ascolto. Il secondo parametro, KNOCKD_OPTS identifica l’interfaccia sulla quale il demone è in ascolto (eth0, ppp0, wlan0…). Il secondo file invece è qualcosa di simile a questo:
[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
I pacchetti di tipo “syn” identificano la richiesta di connessione. Il comando command viene lanciato solo se viene rilevata una sequenza sulle porte 7000 8000 9000 in questo ordine, in un tempo non superiore a 5 secondi. Il comando modifica iptables aprendo la porta 22, quella di SSH appunto. Come è facilmente intuibile, il file di configurazione ci dice che per richiudere la porte dovremo “bussare” sulle porte 9000 8000 7000 in quest’ordine, sempre entro 5 secondi. Ma come effettuiamo le “bussate”? Supponendo che l’indirizzo del server remoto sia 10.0.0.1, possiamo effettuare le “bussate” con il comando:
knock -v 10.0.0.1 7000 8000 9000
Per vedere se effettivamente si è attivato il servizio possiamo cercare di effettuare il login:
ssh nome_utente_ssh@remote_server.org
A questo punto dovrebbe venirci richiesta la password e avremo accesso alla nostra shell. E’ inoltre possibile specificare se la porta su cui bussare sia TCP o UDP (per complicare la sequenza) ed è anche possibile verificare la presenza/assenza di determinati flag tcp. In modo analogo è possibile per esempio aprire la porta FTP. Al file di configurazione possiamo aggiungere queste righe:
[openFTP] sequence    = 10000,11000,12000 seq_timeout = 5 command     = /sbin/iptables -A INPUT -s %IP% -p tcp –dport 20:21 -j ACCEPT tcpflags    = syn [closeFTP] sequence    = 12000,11000,10000 seq_timeout = 5 command     = /sbin/iptables -D INPUT -s %IP% -p tcp –dport 20:21 -j ACCEPT tcpflags    = syn
Dal punto di vista strutturale ci sono diversi modi per utilizzare un sistema di Port Knocking:
  1. Singola porta e mappatura fissa (quello che abbiamo visto)
  2. Porta Multipla, mapping dinamico
  3. Mappatura con crittografia (il metodo più sicuro)
Ulteriori articoli: