Port Knocking su Ubuntu: installazione e configurazione
Port knocking aggiunge una barriera nascosta al tuo server: il demone knockd apre temporaneamente la porta SSH soltanto dopo che un client ha inviato una sequenza di tentativi di connessione su porte predefinite e nell’ordine corretto. Questa guida spiega l’installazione di knockd su Ubuntu/Debian, la configurazione di iptables, il test della sequenza, il hardening e le alternative quando port knocking non è adatto.
Perché usare il port knocking
Molti attacchi mirano a servizi esposti come SSH attraverso scansioni automatiche delle porte. Cambiare la porta SSH aiuta poco perché gli scanner cercano comunque servizi attivi; il port knocking fa apparire la porta solo dopo una sequenza corretta, rendendo la superficie di attacco molto più ridotta.
Importante: port knocking è un livello di sicurezza aggiuntivo, non un sostituto dell’autenticazione a chiave pubblica o di una corretta gestione degli account.
Sommario rapido dei passaggi
- Installa openssh-server, knockd e iptables (o verifica che esistano).
- Blocca la porta SSH via iptables.
- Configura /etc/knockd.conf con una sequenza non banale e comandi per aprire/chiudere.
- Abilita e avvia knockd, salva le regole iptables.
- Testa da client e applica hardening (chiavi SSH, limitazioni, monitoraggio).
Prerequisiti e ambito
- Distribuzioni supportate: Ubuntu, Debian 8/9/10 (i comandi apt mostrati sono per Debian/Ubuntu).
- Privilegi: tutti i comandi di sistema vanno eseguiti come root o tramite sudo.
- La guida si concentra su TCP/SSH; per altri servizi la logica è analoga.
Step 1: verificare e installare i pacchetti necessari
Esegui i comandi come utente root (qui si usa una shell root per comodità):
sudo suAggiorna le liste pacchetti:
apt-get updateInstalla il server SSH (se non è già presente):
apt-get install openssh-serverInstalla il demone knockd:
apt-get install knockdEsempio di output dell’installazione (troncato) mostrato durante il processo di apt:
Get:1 http://security.debian.org wheezy/updates Release.gpg [1,554 B]
Get:2 http://security.debian.org wheezy/updates Release [102 kB]
Get:3 http://security.debian.org wheezy/updates/main amd64 Packages [336 kB]
Hit http://mirrors.digitalocean.com wheezy Release.gpg
Hit http://mirrors.digitalocean.com wheezy Release
Get:4 http://security.debian.org wheezy/updates/main Translation-en [195 kB]
Hit http://mirrors.digitalocean.com wheezy/main amd64 Packages
Hit http://mirrors.digitalocean.com wheezy/main Translation-en
Fetched 635 kB in 1s (358 kB/s)
Reading package lists... Done
root@howtoforge:~#
root@howtoforge:~# apt-get install openssh-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
openssh-client
Suggested packages:
ssh-askpass libpam-ssh keychain monkeysphere rssh molly-guard ufw
The following packages will be upgraded:
openssh-client openssh-server
2 upgraded, 0 newly installed, 0 to remove and 32 not upgraded.
Need to get 1,364 kB of archives.
After this operation, 0 B of additional disk space will be used.
Do you want to continue [Y/n]?Premi Y e Invio per continuare.

Dopo l’installazione, installa iptables se non già presente:
apt-get install iptablesStep 2: aggiungere regole a iptables
Prima di tutto svuota eventuali regole esistenti (flush) e consenti le connessioni in uscita, così non perdi la sessione corrente:
iptables --flush
iptables -t nat --flush
iptables -t mangle --flush
iptables --policy OUTPUT ACCEPTPermetti le connessioni già stabilite (importante per non chiudere la tua sessione SSH corrente):
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTNota: nella direttiva ESTABLISHED,RELATED non ci devono essere spazi intorno alla virgola.
Blocca le connessioni in entrata sulla porta 22 (SSH):
iptables -A INPUT -p tcp --destination-port 22 -j DROPSalva le regole affinché vengano ripristinate al riavvio usando il pacchetto iptables-persistent:
apt-get install iptables-persistentDuring l’installazione il sistema chiederà se vuoi salvare le regole IPv4 e IPv6: seleziona Sì per entrambi.
Se durante l’installazione viene richiesto di salvare le regole, accetta.

Salva lo stato corrente con iptables-save (utile come backup o per ripristinare a mano con iptables-restore):
iptables-saveEsempio di output di iptables-save:
# Generated by iptables-save v1.4.14 on Tue Feb 23 04:59:28 2016
*filter
:INPUT ACCEPT [1:40]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [17:1976]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j DROP
COMMIT
# Completed on Tue Feb 23 04:59:28 2016A questo punto la porta SSH è bloccata per chiunque, tranne per le connessioni già stabilite.
Step 3: configurare knockd
Modifica il file di configurazione di knockd:
nano /etc/knockd.conf
Un esempio di configurazione tipica:
[options]
UseSyslog
[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 = synSpiegazione dei campi principali:
- UseSyslog: abilita il logging su syslog.
- sequence: la lista di porte e l’ordine richiesto; cambia le porte predefinite con numeri non ovvi.
- seq_timeout: tempo in secondi entro il quale la sequenza deve essere completata.
- command: il comando eseguito quando la sequenza è corretta; %IP% viene sostituito dall’IP che ha effettuato il knock.
- tcpflags: limita i pacchetti considerati (es. syn); knockd ignorerà pacchetti che non corrispondono a questi flag.
Consiglio pratico: scegli porte poco usate, una sequenza di 3–4 porte e un timeout adeguato (es. 5–10 s). Evita sequenze e porte comuni (quelle presenti negli esempi pubblici).
Abilitare knockd all’avvio
Modifica il file /etc/default/knockd e imposta l’avvio automatico:
nano /etc/default/knockdCambia:
START_KNOCKD=0in:
START_KNOCKD=1Se hai più interfacce di rete, puoi specificare KNOCKD_OPTS per limitare l’interfaccia di ascolto.
Avvia il servizio:
service knockd startA questo punto knockd ascolta le porte configurate e, quando una sequenza valida arriva da un client, esegue il comando iptables per aprire la porta SSH verso quell’IP.
Step 4: accedere al server quando knockd è attivo
Se la porta SSH è bloccata, il client SSH non riceverà risposta e la connessione verrà scartata o andrà in timeout. Termina l’operazione con Ctrl-C se necessario.
Testare il knock usando telnet (o netcat)
Su Linux puoi usare telnet o netcat; su Windows abilita il client Telnet nelle funzionalità di sistema.
Esempio con telnet (sostituisci youripaddress con l’IP del server):
telnet youripaddress 7000
telnet youripaddress 8000
telnet youripaddress 9000Devi inviare tutte le tre richieste entro il valore di seq_timeout impostato in knockd.conf (nell’esempio 5 secondi). A questo punto prova a connetterti via SSH:
ssh user@youripaddressPer chiudere l’accesso, esegui la sequenza inversa (come configurato nella sezione closeSSH):
telnet youripaddress 9000
telnet youripaddress 8000
telnet youripaddress 7000Nota: come alternativa a telnet puoi usare netcat (nc) per inviare semplici SYN o pacchetti TCP.
Buone pratiche e hardening
- Autenticazione con chiave pubblica: disabilita l’autenticazione tramite password per SSH quando possibile.
- Limitare gli IP che possono eseguire knock (se hai un set di IP noto).
- Combine port knocking con fail2ban per bloccare tentativi ripetuti falliti su altri servizi.
- Monitoraggio: logga i knock su syslog e analizza i pattern sospetti.
- Rotazione delle sequenze: cambia periodicamente le porte e l’ordine se un uso prolungato è previsto.
- Proteggi knockd dietro NAT con attenzione: se il server è dietro NAT, assicurati che il router inoltri correttamente i pacchetti di knock (vedi sezione compatibilità).
Quando il port knocking fallisce o non è consigliato
- Ambienti con NAT simmetrici: il server potrebbe ricevere l’IP del gateway e non quello reale del client, rendendo %IP% inutile.
- Client con IP dinamici molto frequentemente: utenti che cambiano IP spesso potrebbero non riuscire ad aprire la porta.
- Reti mobili o instabili: perdita di pacchetti può interrompere la sequenza.
- Scenari ad alta disponibilità: se più nodi devono condividere lo stesso stato di knock, occorre sincronizzazione delle regole (es. centralizzare il controllo firewall).
In questi casi valuta soluzioni alternative come fwknop (single-packet authorization) o VPNs.
Alternative e approcci correlati
- fwknop (Single Packet Authorization): invia un pacchetto singolo cifrato che apre una regola firewall; più silenzioso e resistente a perdite di pacchetti.
- VPN (OpenVPN, WireGuard): soluzione robusta per esporre servizi internamente a client autenticati.
- Port knocking dinamico con API: chiudere/aprire regole via API centralizzata per ambienti multi-host.
Mini-metodologia di rollout (plan->test->deploy->monitor)
- Pianifica: scegli sequenza, timeout, e porte; definisci test-case.
- Test locale: prova knockd su una VM isolata replicando NAT/router se necessario.
- Deploy: applica su server di produzione durante finestra di manutenzione; mantieni accesso alternativo (console out-of-band).
- Monitor: verifica i log, controlla eventuali falsi positivi/negativi.
Checklist per ruoli (ruoli: Amministratore, Operatore, Utente)
Amministratore:
- Scegli e configura sequenza non banale.
- Assicura backup delle regole iptables.
- Abilita logging di knockd e integra con SIEM.
Operatore:
- Testa la sequenza da diverse reti (LAN, mobile).
- Verifica che le regole persistere dopo reboot.
- Documenta la procedura di emergenza per aprire manualmente la porta via console.
Utente avanzato (chi effettua il knock):
- Conserva la sequenza in posto sicuro.
- Automatizza il knock tramite script (es. usare knock o netcat).
Esempi di comandi client
Usare il pacchetto knock client (se disponibile):
knock youripaddress 7000 8000 9000
ssh user@youripaddressOppure con netcat per simulare una connessione TCP SYN (opzione e sintassi variano a seconda di netcat):
# esempio generico
nc -zv youripaddress 7000
nc -zv youripaddress 8000
nc -zv youripaddress 9000Troubleshooting comune
- Non si apre la porta dopo il knock: verifica i log di knockd (/var/log/syslog) e che knockd ascolti sulle interfacce giuste.
- Knock riconosciuto ma SSH ancora bloccato: controlla che il comando iptables generato sia corretto e che non vi siano altra regole in conflitto.
- Knock non raggiunge il server: problemi NAT o firewall intermedio possono bloccare i pacchetti.
- Timeout seq_timeout troppo basso o troppo alto: aggiustalo in base alla rete e allo strumento client.
Compatibilità e suggerimenti per reti con NAT
Se il server è dietro NAT, il router potrebbe modificare l’IP sorgente o bloccare le porte: assicurati che il port forwarding inoltri i tentativi e che %IP% sia l’IP pubblico del client. Per scenari complessi valuta l’uso di fwknop o VPN.
Decisione rapida (diagramma)
flowchart TD
A[Hai bisogno di nascondere SSH da scansioni?] --> B{Hai controllo sul router/NAT?}
B -- Sì --> C[Valuta port knocking]
B -- No --> D[Valuta fwknop o VPN]
C --> E{Client su reti mobili o instabili?}
E -- Sì --> D
E -- No --> F[Implementa knockd + hardening]Glossario (1 riga ciascuno)
- Port knocking: tecnica che apre porte solo dopo una sequenza di connessioni a porte specifiche.
- knockd: demone che gestisce le sequenze di port knocking e esegue comandi (es. iptables).
- seq_timeout: intervallo in secondi entro cui completare la sequenza.
- %IP%: segnaposto in knockd che viene sostituito dall’indirizzo IP del client che ha effettuato il knock.
Casi d’uso e quando evitarlo
Adatto per: server esposti pubblicamente senza VPN, amministrazione remota da IP conosciuti o scriptabili.
Sconsigliato per: ambienti dove i client cambiano IP costantemente, servizi che richiedono alta affidabilità in termini di accesso continuo, o dove il NAT impedisce il riconoscimento degli IP sorgente.
Esempio di playbook rapido (SOP) per implementazione
- Backup delle regole iptables attuali: iptables-save > /root/iptables-before-knock.save
- Installa openssh-server, knockd, iptables-persistent
- Aggiungi regole DROP per SSH e accept per connessioni established
- Configura /etc/knockd.conf con sequenza e comandi iptables
- Abilita START_KNOCKD=1 e avvia il servizio
- Testa da un client, salva le regole e monitora i log le prime 72 ore
Esempi di script client (bozza)
Script di esempio che usa netcat per inviare knock:
#!/bin/sh
# knock-ssh.sh
HOST=$1
PORTS="7000 8000 9000"
for p in $PORTS; do
nc -z -w1 $HOST $p
done
ssh user@$HOSTAdattalo al tuo ambiente e assicurati che netcat supporti le opzioni usate.
Riepilogo finale
Port knocking è una tecnica efficace per ridurre la visibilità del servizio SSH, ma richiede attenzione a configurazione, test e hardening. In scenari complessi è spesso preferibile usare Single Packet Authorization (fwknop) o una VPN. Integra port knocking con autenticazione a chiave, logging e monitoraggio per ottenere il miglior risultato di sicurezza.
Note importanti:
- Conserva un accesso alternativo (console o out-of-band) prima di modificare le regole firewall.
- Non affidarti esclusivamente al port knocking: trattalo come parte di una strategia difensiva a più livelli.
Fine della guida.