Guida MikroTik
RoutingAvanzato

Route Filters in RouterOS v7: sintassi if/then, matcher e azioni avanzate

Padroneggia il sistema di route filter in RouterOS v7 con la sintassi script-like if/then/else, i matcher disponibili (dst, protocol, bgp-as-path, ecc.) e le azioni (accept, reject, set distance, set bgp-local-pref).

Architettura dei route filter in v7

I route filter in RouterOS v7 usano una sintassi script-like molto più potente della v6. Ogni regola appartiene a una chain (catena) identificata da un nome; le regole si valutano in ordine. Le chain sono referenziate dai protocolli (BGP, OSPF) tramite i parametri input.filter e output.filter. Sono lo strumento con cui decidi cosa accettare/annunciare e come manipolare gli attributi (distance, local-pref, MED, community).

Comportamento di default: in una chain di route filter, se NESSUNA regola fa accept o reject su una rotta, il default è REJECT. Aggiungi sempre una regola finale 'accept' nelle chain che devono lasciar passare ciò che non hai filtrato esplicitamente, altrimenti perdi tutte le rotte inaspettatamente.

Struttura di una regola

La forma generale è: if ( <condizione> ) { <azioni> } else { <azioni> }. Le condizioni usano operatori logici && (AND), || (OR), ! (NOT). Le azioni possono modificare attributi prima di accept/reject. Si può anche fare jump a un'altra chain e return per tornare indietro.

Esempi di route filter in /routing/filter/rule
# 1. Accettare solo prefissi esattamente /24
/routing/filter/rule/add chain=accept-only-24 \
  rule="if (dst-len == 24) { accept } else { reject }"

# 2. Sanity check: scartare prefissi troppo aggregati o troppo specifici da BGP
/routing/filter/rule/add chain=bgp-prefix-sanity \
  rule="if (dst-len < 8 || dst-len > 24) { reject } else { accept }"

# 3. Aumentare la distance delle rotte OSPF esterne (tipo E2)
/routing/filter/rule/add chain=ospf-in \
  rule="if (ospf-type ext2) { set distance 150; accept } else { accept }"

# 4. Impostare local-preference per rendere preferito un upstream (iBGP)
/routing/filter/rule/add chain=bgp-in-primary \
  rule="set bgp-local-pref 200; accept"

# 5. Rifiutare AS path che contiene un AS bogon
/routing/filter/rule/add chain=bgp-in-clean \
  rule="if (bgp-as-path ~\"65535\") { reject } else { accept }"

# 6. Saltare a un'altra chain (jump) e poi tornare
/routing/filter/rule/add chain=main-in \
  rule="if (protocol bgp) { jump bgp-prefix-sanity }"

Filtro bogon: la prima cosa da fare su ogni eBGP

Su ogni sessione eBGP devi filtrare i bogon (prefissi privati/riservati che non dovrebbero mai apparire in BGP pubblico): RFC1918, loopback, link-local, documentazione. Accettarli espone a leak e dirottamenti. È un filtro che ogni operatore serio applica sia in input sia in output.

Chain anti-bogon in input eBGP
/routing/filter/rule/add chain=bgp-bogon \
  rule="if (dst in 10.0.0.0/8 || dst in 172.16.0.0/12 || dst in 192.168.0.0/16 || \
            dst in 127.0.0.0/8 || dst in 169.254.0.0/16 || dst in 0.0.0.0/8 || \
            dst in 100.64.0.0/10 || dst in 192.0.2.0/24 || dst in 224.0.0.0/4) \
        { reject } else { accept }"

# Applica sia in input sia in output sulla sessione eBGP
/routing/bgp/connection/set [find name=peer-upstream] input.filter=bgp-bogon

Matcher principali disponibili

  • dst / dst-len: prefisso destinazione e lunghezza maschera (dst in 192.168.0.0/16, dst-len == 24)
  • protocol: sorgente della rotta (bgp, ospf, static, connected, rip)
  • bgp-as-path: regexp sull'AS path (es. ~"^65001" = inizia con AS 65001)
  • bgp-communities: presenza di una community (es. 65000:100)
  • bgp-input-remote-as / bgp-input-local-as: AS del peer
  • ospf-type: tipo LSA OSPF (ext1, ext2, inter-area, intra-area, nssa)
  • afi: address family (ipv4, ipv6, vpnv4, vpnv6)
  • routing-mark / rtab: routing mark o tabella di provenienza
  • rpki: stato validazione RPKI (valid, invalid, unknown)

Azioni principali disponibili

AzioneEffetto
acceptAccetta la rotta, ferma la valutazione della chain
rejectRifiuta la rotta (non entra nel RIB / non viene annunciata)
returnTorna alla chain chiamante (usato con jump)
set distance NImposta la distance amministrativa
set bgp-local-pref NImposta la local preference (iBGP, per scegliere l'uscita)
set bgp-med NImposta il MED (suggerisce all'eBGP quale ingresso preferire)
set bgp-weight NPeso locale Cisco-like (solo selezione locale, non annunciato)
append bgp-communities X:YAggiunge una community BGP
set gw addressForza il gateway/next-hop della rotta
Azioni dei route filter v7
Per influenzare quale upstream usi in USCITA, agisci sulla local-pref delle rotte ricevute (più alta = preferita). Per influenzare da quale link gli altri ti raggiungono in INGRESSO, usa il MED verso lo stesso upstream, o il prepend dell'AS-path (annunci con AS ripetuto più volte = path più lungo = meno preferito) verso il backup.
route filterrouting filterfilter ruleif thenacceptrejectbgp communitiesas-pathprefix filterdistancelocal-prefpolicybogonprefix-list

Configura senza fatica con l'AI

In WispOS l'agente AI genera la configurazione RouterOS dalle tue parole e un tutor ti guida passo passo.

Prova WispOS