Che cos’è il port knocking?

È una porta segreta come nei film: la porta di gestione del router resta chiusa a tutti, e si apre solo a chi “bussa” nel modo giusto, cioè tocca alcune porte in una sequenza che conosci solo tu. Per chi scansiona internet il router è un muro: WinBox e SSH non rispondono nemmeno. Tu bussi tre volte, e per un’ora la porta è aperta, ma solo per il tuo indirizzo.

Lo uso quando serve entrare in un router da remoto e una VPN non c’è, o non c’è ancora. Non sostituisce la VPN né una password robusta: è una serratura in più davanti alla porta.

Schema: un PC bussa su tre porte in sequenza, il MikroTik mette il suo indirizzo nelle address list bussata-1, bussata-2 e winbox-aperto
Tre colpi nell’ordine giusto spostano l’indirizzo del PC da una address list all’altra: alla terza, WinBox e SSH si aprono per un’ora.

Passo 1: da dove parto?

Da un router con il firewall in input dell’Hardening di base di un router MikroTik: la lista di interfacce WAN e, in fondo alla chain input, la regola che scarta tutto quello che arriva da internet. Le regole di questo howto vanno prima di quella regola di drop.

Scegli tre porte a caso, sopra la 1024 e non in ordine crescente. Nell’esempio sono 37112, 21983 e 44021: inventa le tue. Il motivo dell’ordine sparso lo vediamo al passo 5.

Passo 2: come costruisco la serratura?

Tre regole, una per ogni colpo. Ogni colpo giusto mette il tuo indirizzo in una address list che dura pochi secondi; il colpo successivo vale solo se sei già nella lista del colpo prima.

/ip firewall filter
add chain=input protocol=tcp dst-port=37112 in-interface-list=WAN action=add-src-to-address-list \
    address-list=bussata-1 address-list-timeout=15s comment="Knock 1"
add chain=input protocol=tcp dst-port=21983 in-interface-list=WAN src-address-list=bussata-1 \
    action=add-src-to-address-list address-list=bussata-2 address-list-timeout=15s comment="Knock 2"
add chain=input protocol=tcp dst-port=44021 in-interface-list=WAN src-address-list=bussata-2 \
    action=add-src-to-address-list address-list=winbox-aperto address-list-timeout=1h comment="Knock 3: porta aperta"
add chain=input protocol=tcp dst-port=8291,22 in-interface-list=WAN src-address-list=winbox-aperto \
    action=accept comment="WinBox e SSH dopo la bussata"
  • i colpi non ricevono risposta: dopo averti annotato, il pacchetto prosegue e finisce nella regola di drop finale. Da fuori sembrano porte chiuse come tutte le altre;
  • address-list-timeout=15s: hai 15 secondi fra un colpo e l’altro, poi la sequenza va ricominciata;
  • winbox-aperto dura un’ora: in quell’ora WinBox (8291) e SSH (22) rispondono solo al tuo indirizzo.

Le regole devono stare sopra la regola che scarta il traffico da internet. Controlla l’ordine:

/ip firewall filter print where chain=input

Come funzionano le address list con il timeout lo trovi nel manuale MikroTik: Address-lists.

Passo 3: come busso da Linux?

Il modo più comodo è il comando knock, che su Debian e Ubuntu sta nel pacchetto knockd:

sudo apt install knockd
knock -d 300 IP-DEL-ROUTER 37112 21983 44021

-d 300 aspetta 300 millisecondi fra un colpo e l’altro. Subito dopo apri WinBox o SSH verso il router.

Non vuoi installare niente? Basta nc, che c’è quasi ovunque:

for p in 37112 21983 44021; do nc -z -w1 IP-DEL-ROUTER $p; sleep 0.3; done

Oppure solo bash, senza nessun programma in più:

for p in 37112 21983 44021; do timeout 1 bash -c "echo > /dev/tcp/IP-DEL-ROUTER/$p" 2>/dev/null; done

Mettilo in un piccolo script, per esempio ~/bin/bussa-ufficio, così non devi ricordare le porte:

#!/bin/bash
# bussa al router dell'ufficio e apre WinBox/SSH per un'ora
knock -d 300 IP-DEL-ROUTER 37112 21983 44021 && ssh admin@IP-DEL-ROUTER

Passo 4: come verifico che funzioni?

In laboratorio ho provato da un PC Linux esterno:

  • prima di bussare, la porta 8291 è chiusa: nessuna risposta;
  • dopo knock, oppure dopo il ciclo con nc o con bash, la porta 8291 risponde;
  • bussando nell’ordine sbagliato (44021 21983 37112) la porta resta chiusa.

Sul router vedi chi ha bussato e quanto tempo gli resta:

/ip firewall address-list print where list~"bussata|winbox-aperto"
/ip firewall filter print stats where comment~"Knock|bussata"

Ogni colpo giusto fa salire di uno il contatore della sua regola.

Passo 5: quanto è sicuro?

Più di una porta aperta, meno di una VPN. Tre cose da sapere:

  • l’ordine sparso conta: molti scanner provano le porte in ordine crescente. Con una sequenza crescente, prima o poi uno scanner “busserebbe” per caso nel modo giusto. Con 37112, poi 21983, poi 44021 no;
  • chi vede il tuo traffico vede la sequenza: i colpi viaggiano in chiaro. Dal Wi-Fi di un albergo, chi ascolta la rete potrebbe ripeterli. Per questo dietro la porta servono comunque utente e password robusti, o meglio le chiavi SSH;
  • la porta si apre per un indirizzo: se sei dietro un NAT condiviso (un hotspot, una rete mobile), si apre per tutti quelli che escono con il tuo stesso indirizzo pubblico, per un’ora.

Per la gestione di tutti i giorni la strada giusta resta la VPN WireGuard dell’hardening. Il port knocking è la chiave di riserva sotto lo zerbino: comoda, ma da usare sapendo che c’è.

Passo 6: come metto una trappola per chi tira a indovinare?

La serratura del passo 2 ha un difetto: chi sbaglia può riprovare quante volte vuole. Uno scanner paziente, che tocca migliaia di porte, prima o poi può pescare la sequenza giusta. La trappola chiude questa strada: chi bussa nell’ordine sbagliato, o tocca una porta accanto a quelle giuste, finisce in una lista nera e per 10 minuti il router lo ignora del tutto, anche se poi bussa bene.

Quattro regole in più, sulla stessa sequenza del passo 2:

/ip firewall filter
add chain=input in-interface-list=WAN src-address-list=bussata-blocco action=drop \
    comment="Trappola: chi ha sbagliato resta fuori" place-before=[find comment="Knock 1"]
add chain=input protocol=tcp dst-port=21983 in-interface-list=WAN src-address-list=!bussata-1 \
    action=add-src-to-address-list address-list=bussata-blocco address-list-timeout=10m \
    comment="Trappola: colpo 2 fuori ordine" place-before=[find comment="WinBox e SSH dopo la bussata"]
add chain=input protocol=tcp dst-port=44021 in-interface-list=WAN src-address-list=!bussata-2 \
    action=add-src-to-address-list address-list=bussata-blocco address-list-timeout=10m \
    comment="Trappola: colpo 3 fuori ordine" place-before=[find comment="WinBox e SSH dopo la bussata"]
add chain=input protocol=tcp dst-port=37111,37113,21982,21984,44020,44022 in-interface-list=WAN \
    src-address-list=!winbox-aperto action=add-src-to-address-list address-list=bussata-blocco \
    address-list-timeout=10m comment="Trappola: porte accanto" place-before=[find comment="WinBox e SSH dopo la bussata"]
  • chi ha sbagliato resta fuori: è la prima regola della serratura (place-before la mette sopra “Knock 1”). Chi è in bussata-blocco viene scartato prima ancora di arrivare ai colpi, quindi non può riprovare finché la voce non scade;
  • colpo fuori ordine: se arriva il secondo colpo da qualcuno che non ha fatto il primo, o il terzo senza il secondo, quell’indirizzo va in lista nera. È proprio quello che fa uno scanner che prova le porte in fila;
  • porte accanto: le porte subito sopra e subito sotto quelle giuste (37111 e 37113 per la 37112, e così via). Chi bussa davvero non le tocca mai; chi scorre le porte una dopo l’altra ci passa per forza;
  • le regole della trappola stanno sotto quelle dei colpi e sopra l’accept di WinBox e SSH: così un colpo giusto ti mette prima nella lista del colpo, e la trappola lo trova già lì e ti lascia stare.

Le porte accanto cambiano con la tua sequenza: per ogni porta scrivi quella con un numero in meno e quella con uno in più. Chi è finito nella trappola lo vedi così:

/ip firewall address-list print where list=bussata-blocco
/ip firewall filter print stats where comment~"Trappola"

⚠️ Attenzione: la lista nera blocca tutto il traffico di quell’indirizzo verso il router, non solo WinBox. Se sbagli la sequenza da un posto da cui gestisci anche altro, aspetti 10 minuti. Per lo stesso motivo bussa con un programma che manda un colpo per porta: knock va benissimo; con nc e con bash tieni il timeout a 1 secondo come negli esempi del passo 3.

Come funziona dentro, nella Knowledge base del Dojo: le address list, le interface list, l’ordine delle regole nella chain input, il rilevamento delle scansioni con psd, il Safe Mode.

Provato in laboratorio su PNETLab con CHR RouterOS 7.24.5 (stable) e un client Debian 12: porta chiusa prima della bussata, aperta dopo con knock, con nc e con bash puro, chiusa con la sequenza nell’ordine sbagliato, address list con timeout. Trappola provata su RouterOS 7.24.5 (stable) con una routerboard e un client esterno: ordine sbagliato e porta accanto mandano l’indirizzo in lista nera e la sequenza giusta subito dopo non apre più; la bussata corretta continua ad aprire.

Domande frequenti

Che cos’è il port knocking su MikroTik?

È una sequenza di regole del firewall che apre una porta, per esempio quella di WinBox, solo all’indirizzo che ha toccato prima alcune porte in un ordine preciso. Su RouterOS si fa con regole add-src-to-address-list e address list con timeout.

Come busso al router da Linux?

Con il comando knock del pacchetto knockd (knock -d 300 IP porta1 porta2 porta3), oppure con un ciclo di nc -z o con bash usando /dev/tcp, senza installare niente.

Perché le porte non devono essere in ordine crescente?

Perché molti scanner provano le porte in ordine crescente: con una sequenza crescente potrebbero completarla per caso. Una sequenza sparsa evita il problema.

Il port knocking sostituisce la VPN?

No. I colpi viaggiano in chiaro e possono essere osservati e ripetuti. È una protezione in più davanti a WinBox e SSH; per la gestione remota di tutti i giorni la soluzione giusta resta una VPN come WireGuard.

Cos’è la trappola del port knocking?

Sono regole in più che mettono in lista nera, per 10 minuti, chi bussa nell’ordine sbagliato o tocca le porte accanto a quelle della sequenza. Uno scanner che prova le porte in fila ci cade subito e non può più indovinare la sequenza a forza di tentativi. Come si configura.