Guida alle tecnologie

Port Knocking su Ubuntu: installazione e configurazione

9 min read Sicurezza Server Aggiornato 20 Oct 2025
Port knocking su Ubuntu — guida pratica
Port knocking su Ubuntu — guida pratica

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.

Install knockd.

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.

Install iptables persistant.

IPTables persistant, part 2

Se durante l’installazione viene richiesto di salvare le regole, accetta.

/files/166eb755-3bff-4f98-9e5d-1e45c4d3ca11.png

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

Editing knockd.conf with nano.

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)

  1. Pianifica: scegli sequenza, timeout, e porte; definisci test-case.
  2. Test locale: prova knockd su una VM isolata replicando NAT/router se necessario.
  3. Deploy: applica su server di produzione durante finestra di manutenzione; mantieni accesso alternativo (console out-of-band).
  4. 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

  1. Backup delle regole iptables attuali: iptables-save > /root/iptables-before-knock.save
  2. Installa openssh-server, knockd, iptables-persistent
  3. Aggiungi regole DROP per SSH e accept per connessioni established
  4. Configura /etc/knockd.conf con sequenza e comandi iptables
  5. Abilita START_KNOCKD=1 e avvia il servizio
  6. 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.

Autore
Redazione

Materiali simili

Immagini in celle Excel: guida completa
Excel

Immagini in celle Excel: guida completa

Terminale Linux come spazio di lavoro produttivo
Produttività

Terminale Linux come spazio di lavoro produttivo

Sicurezza 2FA push: attacchi e contromisure
Sicurezza

Sicurezza 2FA push: attacchi e contromisure

Nascondere la cronologia del browser: guida pratica
Privacy web

Nascondere la cronologia del browser: guida pratica

YouTube TV su Roku: risoluzione problemi
Streaming

YouTube TV su Roku: risoluzione problemi

Tasto rapido per scaricare immagini in Windows
Windows

Tasto rapido per scaricare immagini in Windows