In breve: il matcher psd del firewall di RouterOS riconosce le scansioni di porte: somma un peso per ogni porta diversa che lo stesso indirizzo tocca a breve distanza, e quando il totale arriva alla soglia la regola scatta. Di solito mette lo scanner in una address list, e un’altra regola lo scarta. Va messo sotto le regole che accettano il traffico buono, e non vede le scansioni lente.
Che cos’è una scansione di porte, e cosa fa psd?
Una scansione di porte è un indirizzo che prova una porta dopo l’altra per scoprire quali servizi rispondono. Ogni indirizzo pubblico ne riceve di continuo, dai bot e dai motori di ricerca dei dispositivi. psd (port scan detection) è il matcher che le riconosce: guarda i pacchetti TCP e UDP che arrivano dallo stesso host verso porte di destinazione diverse, assegna a ognuno un peso e somma.
Il manuale lo descrive così: “Attempts to detect TCP and UDP scans”. Conta le porte diverse, non le connessioni: cento connessioni verso la 443 sono una porta sola. Funziona solo con IPv4: nel firewall IPv6 il matcher non c’è.
Cosa vogliono dire i quattro numeri?
Sono quattro campi separati da virgole: psd=WeightThreshold,DelayThreshold,LowPortWeight,HighPortWeight. Dal manuale MikroTik: Filter:
- WeightThreshold: il peso totale dei pacchetti verso porte diverse, dallo stesso host, oltre il quale la sequenza è considerata una scansione;
- DelayThreshold: il tempo massimo fra un pacchetto e l’altro perché contino nella stessa sequenza. Se l’host aspetta di più, il pacchetto nuovo non si aggancia a quelli prima;
- LowPortWeight: il peso di un pacchetto verso una porta privilegiata, sotto la 1024 (22, 80, 443…);
- HighPortWeight: il peso di un pacchetto verso una porta dalla 1024 in su.
Le porte basse pesano di più perché sono quelle dei servizi veri: chi le prova una dopo l’altra sta cercando cosa c’è.
Come calcolo quando scatta?
Moltiplichi le porte per il loro peso e confronti con la soglia. Il valore classico è psd=21,3s,3,1: soglia 21, al massimo 3 secondi fra un colpo e l’altro, porte basse peso 3, porte alte peso 1.
- 7 porte basse di fila: 7 × 3 = 21, sei alla soglia e la regola scatta (in laboratorio con 6 porte basse non è scattata, con 7 sì);
- 21 porte alte di fila: 21 × 1 = 21, stessa cosa;
- un misto: 4 porte basse e 9 alte fanno 12 + 9 = 21;
- una bussata di port knocking su 3 porte alte pesa 3: lontanissima da 21.
Uno scanner vero tocca centinaia di porte in pochi secondi e supera la soglia quasi subito. Un client normale tocca una o due porte e non ci arriva mai.
Come la scrivo?
Con due regole: una che annota lo scanner in una address list, una che lo scarta. L’esempio parte dal firewall in input dell’Hardening di base di un router MikroTik, con la lista di interfacce WAN e la regola finale “IN: tutto il resto”.
/ip firewall filter
add chain=input in-interface-list=WAN protocol=tcp psd=21,3s,3,1 \
action=add-src-to-address-list address-list=port-scanner address-list-timeout=1d \
comment="PSD: annota chi scansiona" place-before=[find comment="IN: tutto il resto"]
add chain=input in-interface-list=WAN src-address-list=port-scanner action=drop \
comment="PSD: scanner fuori" place-before=([find chain=input]->0)
- la prima regola sta in fondo, subito prima del drop finale: la vede solo il traffico che nessuna regola ha già accettato;
- la seconda sta in cima alla chain
input: chi è nella lista viene scartato prima di tutto, anche sulle porte che di solito il router accetta (la VPN, per esempio); address-list-timeout=1d: dopo un giorno la voce scade da sola. Mettere un timeout è importante: un falso positivo non resta chiuso fuori per sempre;in-interface-list=WAN: la regola guarda solo internet. Dalla LAN un amministratore che lancia uno scan per lavoro non si chiude fuori.
Per le scansioni UDP aggiungi una regola uguale con protocol=udp. Chi c’è nella lista lo vedi così:
/ip firewall address-list print where list=port-scanner
/ip firewall filter print stats where comment~"PSD"
Perché va sotto le regole che accettano il traffico buono?
Perché psd conta tutti i pacchetti che arrivano fino a lui, buoni o cattivi. Le regole si leggono dall’alto in basso: un pacchetto accettato da una regola sopra non arriva mai alla regola psd e non aggiunge peso.
Nel firewall dell’hardening sopra ci sono le risposte alle connessioni già aperte, il ping, la WireGuard di gestione, la LAN. Il traffico normale si ferma lì. A psd arriva solo quello che stava per essere scartato: esattamente quello da guardare.
Se la metti in cima, invece, conta anche i tuoi servizi. In laboratorio ho messo una regola con soglia 12 sopra quelle del port knocking: un client che, dopo la bussata giusta, controllava di fila 7 porte del router è finito nella lista nera.
⚠️ Attenzione: la lista nera blocca tutto il traffico di quell’indirizzo verso il router. Lavora in Safe Mode e prova la regola da un indirizzo esterno che non usi per gestire il router.
Input, forward o raw: dove la metto?
In input se vuoi proteggere il router stesso, che è il caso più comune: le scansioni sull’indirizzo pubblico del router arrivano lì. psd esiste anche nelle tabelle mangle, nat e raw, con gli stessi quattro campi.
- forward: il traffico che attraversa il router. Con
in-interface-list=LANti accorgi di un PC della LAN che scansiona internet o le altre reti, spesso un PC infetto. Qui conviene solo annotare, senza drop, e guardare la lista; - raw prerouting: la tabella raw lavora prima del connection tracking. Il manuale dice che filtrare in raw “allows saving resources if connection tracking is not required”: è il posto giusto per il drop della lista
port-scanner, se gli scanner sono tanti.
/ip firewall raw
add chain=prerouting in-interface-list=WAN src-address-list=port-scanner action=drop \
comment="PSD: scanner fuori, prima del conntrack"
Cosa non vede, e chi rischia di finirci per sbaglio?
Non vede le scansioni lente. Se fra un pacchetto e l’altro passa più del DelayThreshold, i pacchetti non vengono collegati nella stessa sequenza e il peso non sale. Uno scanner paziente, che prova una porta ogni 5 secondi, passa sotto psd=21,3s,3,1 senza farsi notare. Per quello servono altre trappole, come le porte esca del port knocking.
Dall’altra parte, i falsi positivi:
- client che aprono molte connessioni verso porte diverse: per esempio un programma di monitoraggio che controlla uno dopo l’altro tutti i servizi del router;
- il port knocking: ogni colpo è un pacchetto verso una porta diversa, e i colpi non vengono accettati, quindi arrivano fino a
psd; - le app che verificano più porte: dopo la bussata controllano se WinBox, SSH e le altre porte rispondono. Sono altre porte diverse in pochi secondi;
- un NAT condiviso: dietro un unico indirizzo pubblico (una rete mobile, un hotspot) ci sono molti utenti, e per
psdsono un host solo.
Come convivono psd e il port knocking?
Bene, se la bussata è corta o lenta. Con psd=21,3s,3,1 una bussata standard su 3 porte alte pesa 3 e non fa scattare niente: in laboratorio non è mai finita nella lista. Il problema nasce con soglie basse o con sequenze lunghe di colpi e verifiche.
La soluzione è bussare piano: lascia fra un colpo e l’altro più del DelayThreshold. Con 3 secondi di soglia, un colpo ogni 3,5 secondi fa sì che ogni pacchetto parta da zero: in laboratorio, così, psd non è scattato. Ricordati però che il timeout delle address list della bussata deve durare di più dell’attesa: con i 15 secondi dell’howto, 3,5 secondi fra i colpi vanno benissimo.
La serratura completa, con la trappola per chi bussa nell’ordine sbagliato, è nell’howto Port knocking su MikroTik. Le porte esca della trappola e psd si completano: la trappola prende chi scorre le porte in fila anche piano, psd prende chi va veloce su qualunque porta.
Il port knocking di RouterOS, con la sua lista nera contro le scansioni, è descritto anche nel manuale MikroTik: Port knocking.
Provato in laboratorio su RouterOS 7.24.5 (stable), in input con psd=21,3s,3,1 e scansioni TCP da un PC: scatta con 7 porte basse, 21 porte alte o 4 basse più 9 alte, non con 6 basse o 20 alte; una scansione di 30 porte con 3,5 secondi fra un colpo e l’altro passa senza essere vista; la bussata standard su 3 porte non scatta; con soglia 12 sopra le regole della bussata, un client che verifica 7 porte finisce in lista nera. UDP, raw e forward sono dalla documentazione.
Domande frequenti
Cosa vuol dire psd=21,3s,3,1?
Soglia di peso 21, al massimo 3 secondi fra un pacchetto e l’altro, peso 3 per le porte sotto la 1024 e peso 1 per quelle dalla 1024 in su. La regola scatta quando uno stesso host arriva a 21, per esempio con 7 porte basse o 21 porte alte di fila.
Dove metto la regola psd nel firewall?
In fondo alla chain input, subito prima del drop finale e sotto le regole che accettano il traffico legittimo. La regola che scarta la lista degli scanner va invece in cima, o in raw prerouting per risparmiare risorse.
psd vede le scansioni lente?
No. Se fra un pacchetto e l’altro passa più del DelayThreshold, i pacchetti non vengono collegati nella stessa scansione e la soglia non viene mai raggiunta.
Il port knocking fa scattare psd?
Con psd=21,3s,3,1 una bussata su 3 porte alte no: pesa 3. Con soglie basse o verifiche su molte porte sì. Bussando con più di 3 secondi fra un colpo e l’altro, ogni colpo riparte da zero e la regola non scatta.
psd funziona anche con IPv6?
No, il matcher psd c’è solo nel firewall IPv4 (/ip firewall).



