# Port knocking

In informatica, il port knocking è un sistema per aprire delle porte su un firewall dall'esterno inviando tentativi di connessione ad una sequenza prestabilita di porte chiuse; una volta che ciò sia stato fatto le regole del firewall vengono aggiornate dinamicamente per consentire all'host che ha inviato la giusta sequenza di connettersi alla porta voluta.
Questo scopo viene ottenuto principalmente impiegando un demone che controlli continuamente i log del firewall in cerca della sequenza corretta e in tal caso ne modifichi la configurazione, ma si può usare anche uno sniffer che esamini direttamente i pacchetti ricevuti, usando in questo caso delle porte già aperte su cui ricevere la bussata. L'utente invece utilizzerà un piccolo programma, che può essere un semplice script netcat o un ping modificato sino ad un generatore di hash, da lanciare prima della normale connessione alla macchina di destinazione.
Il port knocking viene frequentemente impiegato per consentire l'accesso sulla porta TCP 22, usata da SSH, in quanto questo servizio è spesso l'obiettivo di attacchi a forza bruta in seguito a port scan. La bussata è analoga ad una stretta di mano segreta e può consistere in qualsiasi quantità di pacchetti TCP, UDP, ICMP diretti a porte numerate sulla macchina di destinazione. La complessità della bussata può variare da una semplice lista di porte da contattare sequenzialmente ad uno schema temporizzato che discrimini l'indirizzo IP e impieghi tecniche crittografiche.
Molte implementazioni sono vere e proprie macchine a stati che consentono di non rivelare alcuna informazione circa lo stato attuale, in altre parole se la parte iniziale della bussata è stata ricevuta correttamente, mentre quella finale no, l'utente non ha nessun modo di saperlo in quanto l'unico effetto osservabile è l'eventuale apertura della porta a cui si vuole connettere quando la sequenza inviata è corretta.

## Come funziona in teoria

* Il client non è in grado di connettersi all'applicazione in ascolto sulla porta n.
* Il client tenta di connettersi ad un insieme predefinito di porte inviando un'opportuna sequenza di pacchetti, sa dell'esistenza del demone che gestisce il port knocking e conosce la sua configurazione, ma non riceve alcuna risposta in questa fase in quanto il firewall lo impedisce.
* Un processo sul server (il demone che gestisce il port knocking) intercetta ed interpreta i tentativi di connessione, secondo la bussata ricevuta eseguirà un certo genere di azione, come aprire la porta n al client.
* Il client si connette alla porta n e si autentica secondo i normali metodi.

## Benefici

Se un malintenzionato non conosce la corretta bussata, scoprire una sequenza anche molto semplice richiede un attacco a forza bruta piuttosto impegnativo. Ad esempio una bussata su tre porte richiederebbe all'attaccante di provare ogni loro possibile combinazione nell'intervallo che va da 1 a 65535 e quindi controllare se per caso si sia aperta la porta desiderata; questo equivale approssimativamente all'invio di 65535$^4$ (18.445.618.199.572.250.625 o 18 milioni di miliardi circa) pacchetti per una singola porta, statisticamente ne sarebbero necessari 9 milioni di miliardi. Generalmente, quando una bussata ha successo, le regole del firewall sono modificate in modo da consentire l'accesso solo all'indirizzo IP da cui è stata generata; in questo modo diversi utenti potranno effettuare la procedura senza che questa venga influenzata da altri e possono anche essere definite distinte bussate per ogni IP. Questo approccio è paragonabile ad una sorta di whitelist dinamica: la porta potrà essere chiusa dall'utilizzatore, senza l'intervento di un amministratore di sistema, con un'altra bussata, oppure sarà previsto un timeout.
Le prime implementazioni del port knocking consistevano in semplici liste di porte a cui connettersi in sequenza, questa semplicità ha ingenerato un certo sospetto nella comunità di esperti di sicurezza informatica, soprattutto a causa dell'inefficacia di questo approccio verso i replay attack, ma l'introduzione di primitive crittografiche (quali ad esempio gli hash) ha consentito di superare anche questa limitazione. Ad ogni modo, anche se un malintenzionato venisse a conoscenza della corretta bussata, il servizio sotto attacco avrebbe ancora a sua difesa i suoi usuali meccanismi di autenticazione.
Il port knocking può essere utilizzato anche per scopi che esulano dall'apertura porte; in effetti una bussata potrebbe fare partire una qualsiasi azione sulla macchina, ad esempio il lancio di un programma.