In breve: una address list è un elenco di indirizzi con un nome, che le regole del firewall usano al posto di un indirizzo scritto a mano. Le voci le scrivi tu (statiche) oppure le aggiunge il firewall stesso mentre il traffico passa (dinamiche, di solito con una scadenza). Su questo meccanismo si costruiscono blacklist, port knocking, allowlist della gestione e filtri sui domini.

Che cos’è una address list?

È un gruppo di indirizzi IP sotto un nome comune, che le regole di filter, NAT, mangle e raw possono controllare con un solo parametro. Invece di dieci regole, una per indirizzo, scrivi una regola che dice “tutto quello che viene dalla lista gestione“. Aggiungi o togli un indirizzo dalla lista e la regola resta com’è.

Ogni voce è una riga in /ip firewall address-list: il nome della lista (list, obbligatorio) e l’indirizzo (address).

Come aggiungo voci statiche?

Con add, indicando il nome della lista e l’indirizzo. L’indirizzo può essere un singolo IP, una subnet o un intervallo:

/ip firewall address-list
add list=gestione address=192.168.88.0/24 comment="LAN"
add list=gestione address=10.255.255.0/24 comment="VPN di gestione"
add list=blacklist address=203.0.113.10 comment="Scanner visto il 2026-10-10"
add list=stampanti address=192.168.88.200-192.168.88.210

Un intervallo che coincide con una subnet viene riscritto in forma CIDR al salvataggio: 192.168.0.0-192.168.1.255 diventa 192.168.0.0/23 (lo controlli con l’IP calculator del Dojo). Gli intervalli da IP a IP valgono solo per IPv4.

⚠️ Attenzione: gli indirizzi degli esempi sono quelli del mio laboratorio. Adattali alla tua rete.

E se al posto dell’indirizzo scrivo un nome DNS?

Il router lo accetta e lo risolve da solo: la voce col nome resta, e sotto compaiono voci dinamiche (flag D) con gli indirizzi che il nome restituisce. È il trucco su cui si regge l’howto per bloccare DNS over HTTPS e DNS over TLS: dns.google porta con sé 8.8.8.8 e 8.8.4.4. Se poi aggiungi a mano anche 8.8.8.8 nella stessa lista, il router risponde already have such entry.

C’è anche la strada opposta: una voce di /ip dns static con il parametro address-list mette nella lista gli indirizzi che il router risponde ai dispositivi per quel dominio, e li toglie quando scade il TTL della risposta.

Come nascono le voci dinamiche?

Le crea una regola del firewall con action=add-src-to-address-list (mette in lista l’indirizzo sorgente del pacchetto) o action=add-dst-to-address-list (mette la destinazione). La lista si sceglie con address-list, la durata con address-list-timeout:

/ip firewall filter
add chain=input protocol=tcp dst-port=23 in-interface-list=WAN \
    action=add-src-to-address-list address-list=blacklist address-list-timeout=1d \
    comment="Chi tocca telnet va in blacklist per un giorno"
add chain=input in-interface-list=WAN src-address-list=blacklist action=drop \
    comment="Scarta la blacklist"

Il punto che sfugge a tutti: queste due azioni lavorano in passthrough. La regola annota l’indirizzo e il pacchetto prosegue verso le regole successive, come se niente fosse. Per bloccarlo davvero serve una seconda regola che faccia drop.

Se un indirizzo già in lista colpisce di nuovo la regola, la voce non raddoppia: viene rinfrescata. Il manuale lo dice per la protezione SSH dal brute force. In laboratorio il tempo rimasto è risalito con i nuovi pacchetti, ma non sempre fino al valore pieno: per una blacklist conta che chi continua a bussare resti dentro, non il secondo esatto.

Quanto dura una voce, e cosa succede al riavvio?

Dipende dal timeout. Il riavvio è il momento in cui la differenza si vede:

Come nasce la voce Timeout Dopo un riavvio
A mano, senza timeout nessuno resta: è configurazione
A mano, con timeout=… quello scritto persa: compare già con il flag D, come una voce dinamica
Da regola, address-list-timeout=1h (o altro tempo) quello scritto persa
Da regola, address-list-timeout=none-dynamic nessuno persa: resta solo fino al riavvio
Da regola, address-list-timeout=none-static nessuno resta, ed entra in export e backup

none-dynamic e none-static esistono solo nelle regole (address-list-timeout): in /ip firewall address-list add il router risponde invalid time value. Il tempo massimo è 35w3d13:13:56, cioè 21474836 secondi, poco meno di 249 giorni. Con none-static la regola costruisce una lista che cresce per sempre: usalo solo se sai chi la ripulirà.

Dove uso le address list nelle regole?

Con due parametri, src-address-list e dst-address-list, presenti in filter, NAT, mangle e raw. Davanti al nome puoi mettere ! per dire “chi non è nella lista”:

/ip firewall filter
add chain=input protocol=tcp dst-port=8291,22 src-address-list=gestione action=accept \
    comment="WinBox e SSH solo dalla gestione"
add chain=input protocol=tcp dst-port=22 in-interface-list=WAN \
    src-address-list=!gestione action=drop comment="SSH da fuori, se non sei in lista"

Ogni parametro accetta una sola lista. Occhio alla trappola: src-address-list=A,B viene accettato senza errori, ma non vuol dire né “in A e in B” né “in A oppure in B”. La virgola fa parte del nome: la regola cerca una lista che si chiama proprio A,B, che di solito non esiste, e quindi non colpisce mai. Con il ! davanti è peggio: !A,B colpisce tutti. Se ti servono due gruppi, metti tutto nella stessa lista o scrivi due regole. Puoi invece usare insieme sorgente e destinazione nella stessa regola: “dalla lista A verso la lista B”.

La tabella raw è il posto giusto per le liste lunghe di indirizzi da scartare in ogni caso, perché scarta in prerouting e risparmia il lavoro del connection tracking. Il manuale la usa così per i bogon, con la lista not_global_ipv4 delle reti che su internet non possono girare:

/ip firewall raw
add chain=prerouting src-address-list=not_global_ipv4 in-interface-list=WAN action=drop \
    comment="Scarta da WAN gli indirizzi non globali"

Per IPv6 il menu è /ipv6 firewall address-list: stessa logica, accetta un indirizzo, un prefisso o un nome DNS, ma non gli intervalli da IP a IP.

Come vedo cosa c’è dentro una lista?

Con print, filtrando per nome. Le voci dinamiche hanno il flag D e mostrano il tempo che resta prima della scadenza:

/ip firewall address-list print where list=blacklist
/ip firewall address-list print where list~"^bussata"
/ip firewall address-list print count-only where list=blacklist
/ip firewall address-list export where list=gestione

~ confronta con un’espressione regolare, utile per vedere più liste insieme. count-only ti dice solo quante voci ci sono: è la prima cosa da guardare su una blacklist che gira da mesi. L’export di una sola lista c’è da RouterOS 7.13 ed esporta solo le voci statiche.

Per sapere se la lista lavora davvero guarda i contatori delle regole che la usano:

/ip firewall filter print stats where comment~"blacklist"

Per togliere un indirizzo da tutte le liste in cui è finito:

/ip firewall address-list remove [find address=203.0.113.10]

A cosa servono nella pratica?

  • Blacklist: chi tocca una porta che nessuno dovrebbe toccare (telnet, una porta esca) finisce in lista per un giorno e il router lo ignora.
  • Port knocking: tre liste in fila, con timeout di pochi secondi, spostano l’indirizzo da un colpo al successivo fino ad aprire WinBox. È l’howto del port knocking su MikroTik; la sua trappola usa la negazione ! per mettere in lista nera chi bussa fuori ordine.
  • Allowlist della gestione: le reti da cui amministri il router, in un’unica lista che usi in tutte le regole di input. Nell’hardening di base le reti sono poche e bastano le interfacce; quando i posti da cui entri diventano tanti, la lista ti evita di riscrivere le regole.
  • Reti da proteggere: nell’hotspot la lista lan-protette elenca le reti che gli ospiti non devono raggiungere, e uno script la aggiorna quando cambia la WAN (proteggere la LAN dai client hotspot). Nel bilanciamento di più linee la lista reti-wan tiene fuori dal PCC il traffico verso le reti dei modem (ECMP e PCC).
  • Bogon: gli indirizzi che da internet non possono arrivare (privati, loopback, documentazione), scartati in raw.
  • Domini: un nome DNS in lista segue gli indirizzi del servizio, come per i server DoH.

Come funzionano nel dettaglio lo trovi anche nel manuale MikroTik: Address-lists.

Quali sono gli errori tipici?

  • Il nome scritto diverso. Blacklist nella regola e blacklist nella lista sono due liste diverse. Il router accetta la regola senza protestare, e la regola non trova mai nessuno. Se il contatore di print stats resta a zero, confronta i nomi lettera per lettera.
  • La lista senza il drop. add-src-to-address-list annota e lascia passare. Senza una regola che scarta chi è in lista, la blacklist si riempie e non blocca niente.
  • L’ordine delle regole. La regola che mette in lista deve stare sopra quella che scarta tutto, altrimenti il pacchetto non ci arriva mai. Nelle sequenze a più stadi (knocking, brute force) l’ordine è parte della logica: il manuale scrive le regole SSH dall’ultimo stadio al primo proprio per questo.
  • Il timeout troppo corto. Con stadi da un minuto, la protezione SSH del manuale lascia passare 27 tentativi di password al minuto. Il timeout decide quanto pesa la regola: troppo corto non ferma nessuno, troppo lungo chiude fuori anche te.
  • Il bogon che ti taglia fuori. In laboratorio la WAN è in 10.6.x.x/12 con gateway 10.0.0.1: se in raw scarti dalla WAN la lista con 10.0.0.0/8, perdi il gateway. Togli dalla lista dei bogon le reti private che usi davvero sulla WAN.
  • La lista che cresce senza controllo. Una blacklist dinamica su internet raccoglie migliaia di indirizzi al giorno. Tienila sotto controllo con count-only e preferisci timeout finiti a none-static.

⚠️ Attenzione: una blacklist che mette in lista per connessioni, non per errori, può bloccare anche te. Metti la tua allowlist di gestione prima delle regole che contano, come fa il manuale nella protezione SSH.

Provato in laboratorio su una routerboard con RouterOS 7.24.5 (stable): IP, subnet, intervallo convertito in CIDR e intervallo non allineato che resta tale; nome DNS risolto in voci dinamiche e already have such entry per un indirizzo già presente; voci da add-src-to-address-list con timeout, none-dynamic e none-static (flag ed export); tempo massimo; regola con il nome della lista sbagliato accettata senza errore; virgola nel nome della lista (A,B è un nome solo); count-only, export e remove [find address=…]; intervallo IPv6 rifiutato. Il comportamento al riavvio e la raw con i bogon sono dalla documentazione.

Domande frequenti

Che cos’è una address list su MikroTik?

È un elenco di indirizzi IP con un nome, in /ip firewall address-list. Le regole di filter, NAT, mangle e raw la controllano con src-address-list o dst-address-list, così aggiungi o togli indirizzi senza toccare le regole.

Le voci di una address list sopravvivono al riavvio?

Quelle scritte a mano senza timeout sì. Quelle con un timeout, e quelle create da una regola con un tempo o con none-dynamic, hanno il flag D, non entrano nell’export e secondo il manuale si perdono. Fra quelle create dalle regole restano solo le none-static, che sono statiche ed entrano nell’export.

Posso mettere un nome di dominio in una address list?

Sì: il router risolve il nome e aggiunge sotto di esso voci dinamiche con gli indirizzi restituiti. Non aggiungere a mano anche gli stessi indirizzi nella stessa lista: il router li rifiuta come doppioni.

Perché la regola con add-src-to-address-list non blocca niente?

Perché lavora in passthrough: mette l’indirizzo in lista e lascia proseguire il pacchetto. Per bloccare serve una seconda regola con src-address-list= e action=drop.

Posso usare due address list nella stessa regola?

Una per la sorgente e una per la destinazione sì. Due nello stesso parametro no: src-address-list=A,B è accettato, ma RouterOS lo legge come il nome di una lista sola, A,B, e la regola non colpisce mai. Unisci gli indirizzi in una lista o scrivi due regole.