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 su
Aggiorna le liste pacchetti:
apt-get update
Installa il server SSH (se non è già presente):
apt-get install openssh-server
Installa il demone knockd:
apt-get install knockd
Esempio 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 iptables
Step 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 ACCEPT
Permetti le connessioni già stabilite (importante per non chiudere la tua sessione SSH corrente):
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Nota: 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 DROP
Salva le regole affinché vengano ripristinate al riavvio usando il pacchetto iptables-persistent:
apt-get install iptables-persistent
During 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-save
Esempio 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 2016
A 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 = syn
Spiegazione 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/knockd
Cambia:
START_KNOCKD=0
in:
START_KNOCKD=1
Se hai più interfacce di rete, puoi specificare KNOCKD_OPTS per limitare l’interfaccia di ascolto.
Avvia il servizio:
service knockd start
A 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 9000
Devi 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@youripaddress
Per chiudere l’accesso, esegui la sequenza inversa (come configurato nella sezione closeSSH):
telnet youripaddress 9000
telnet youripaddress 8000
telnet youripaddress 7000
Nota: 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@youripaddress
Oppure 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 9000
Troubleshooting 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@$HOST
Adattalo 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.
Materiali simili

Immagini in celle Excel: guida completa

Terminale Linux come spazio di lavoro produttivo

Sicurezza 2FA push: attacchi e contromisure

Nascondere la cronologia del browser: guida pratica

YouTube TV su Roku: risoluzione problemi
