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.
sudo apt-get install knockdknockd è 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 eth0Il 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 = synI 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 9000Per vedere se effettivamente si è attivato il servizio possiamo cercare di effettuare il login:
ssh nome_utente_ssh@remote_server.orgA 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 = synDal punto di vista strutturale ci sono diversi modi per utilizzare un sistema di Port Knocking:
- Singola porta e mappatura fissa (quello che abbiamo visto)
- Porta Multipla, mapping dinamico
- Mappatura con crittografia (il metodo più sicuro)
- La tecnica del port knocking – Parte 2
- Port Knocking per leggere in tail i log remoti (in arrivo)
