Guida MikroTik
Firewall e QoSBase

Connection Tracking — Firewall stateful in RouterOS

Il connection tracking permette a RouterOS di tenere traccia dello stato di ogni connessione di rete, abilitando un firewall stateful efficiente che distingue traffico legittimo da intrusioni.

Il connection tracking è il motore stateful di RouterOS. Mantiene una tabella di tutte le connessioni attive e assegna a ogni pacchetto uno dei cinque stati di connessione. Questo consente al firewall di accettare in modo efficiente il traffico di risposta senza dover aprire porte aggiuntive.

Gli stati di connessione

  • new — primo pacchetto di una nuova connessione (es. TCP SYN) o pacchetto UDP senza entry nella tabella. È il traffico da esaminare con più attenzione.
  • established — pacchetto appartenente a una connessione già vista in entrambe le direzioni. Il traffico di risposta legittimo. Da accettare quasi sempre.
  • related — pacchetto correlato a una connessione esistente ma non parte di essa (es. messaggi ICMP di errore, connessione dati FTP in modalità passiva). Anch'esso legittimo.
  • invalid — pacchetto che non corrisponde a nessuna connessione nota e non è new. Tipicamente traffico malformato o attacchi. Da scartare sempre.
  • untracked — stato speciale per pacchetti esclusi dal conntrack tramite regole RAW con azione notrack. Utile per traffico ad altissimo volume (es. DDoS mitigation).

Timeout di default per protocollo

  • TCP SYN (handshake): 5 secondi
  • TCP established: 1 giorno
  • TCP close/fin-wait/time-wait: 10 secondi
  • UDP (una direzione): 30 secondi
  • UDP (bidirezionale): 3 minuti
  • ICMP: 10 secondi
  • Generico: 10 minuti
Configurazione connection tracking e timeout personalizzati
# Visualizza la configurazione corrente del conntrack
/ip firewall connection tracking print

# Il parametro "enabled=auto" attiva il conntrack solo se esistono
# regole firewall che lo richiedono (ottimale per router base).
# Forzarlo a "yes" o "no" se necessario:
/ip firewall connection tracking set enabled=yes

# Ridurre i timeout in ambienti con molte connessioni (es. server PPPoE)
# per liberare più rapidamente le entry scadute:
/ip firewall connection tracking set   tcp-established-timeout=8h   udp-timeout=30s   udp-stream-timeout=2m   generic-timeout=5m

# Abilitare il liberal TCP tracking (raccomandato su link WAN instabili):
# Fa sì che solo i segmenti RST fuori finestra vengano marcati INVALID
# invece di scartare pacchetti legittimi su connessioni asimmetriche.
/ip firewall connection tracking set liberal-tcp-tracking=yes

# Visualizzare la tabella connessioni con colonne utili
/ip firewall connection print detail

Stati TCP interni

Oltre agli stati di connessione del firewall, RouterOS traccia lo stato interno TCP: syn-sent, syn-recv, established, fin-wait, close-wait, last-ack, time-wait, close. Questi sono visibili nella tabella /ip firewall connection e utili per il debugging.

Best practice: inserisci SEMPRE come prime regole del firewall accept connection-state=established,related e drop connection-state=invalid. Questo garantisce massima performance (il traffico legittimo viene accettato immediatamente) e massima sicurezza (il traffico malformato viene scartato subito). Dopo aver modificato le regole NAT, svuota la tabella connessioni con /ip firewall connection remove [find] per evitare comportamenti inattesi.
Regole firewall base con connection-state
# Pattern fondamentale da inserire come PRIME regole in ogni chain:

# Chain INPUT - protegge il router
/ip firewall filter add   chain=input connection-state=established,related,untracked   action=accept comment="Accetta traffico di risposta stabilito"

/ip firewall filter add   chain=input connection-state=invalid   action=drop comment="Scarta pacchetti non validi"

# Chain FORWARD - protegge i clienti
/ip firewall filter add   chain=forward connection-state=established,related   action=fasttrack-connection hw-offload=yes   comment="FastTrack - accelerazione hardware traffico stabilito"

/ip firewall filter add   chain=forward connection-state=invalid   action=drop comment="Scarta pacchetti forward non validi"

Perché lo stato 'invalid' va sempre scartato

Un pacchetto invalid è un pacchetto che il conntrack non riesce ad associare a nessuna connessione nota e che non è un legittimo new. Cause tipiche: pacchetti che arrivano dopo che il router ha già chiuso la connessione, segmenti TCP fuori finestra, frammenti riassemblati male, oppure traffico di attacco/scan. Accettarli non porta alcun beneficio (non c'è una sessione utile a cui appartengano) e apre la porta a tecniche di evasione del firewall. Per questo drop connection-state=invalid è una delle prime regole sia in input sia in forward.

ATTENZIONE su link asimmetrici/multi-WAN: se il traffico di andata e ritorno passa per percorsi diversi (es. load balancing PCC mal configurato), pacchetti legittimi possono apparire invalid. In quel caso non rimuovere la regola: correggi il routing o abilita liberal-tcp-tracking=yes. Su un WISP con doppia uscita Internet questo è l'errore più comune che 'rompe' siti random.

Dimensionare il conntrack su un router WISP

Ogni connessione attiva occupa una entry nella tabella conntrack (circa 300 byte). Un router gateway con centinaia di clienti P2P/streaming può arrivare facilmente a centinaia di migliaia di entry. Se la tabella si riempie, le nuove connessioni vengono scartate e i clienti 'non navigano'. Monitora il valore e, se serve, riduci i timeout o usa notrack (vedi articolo RAW) sul traffico che non necessita di stato.

Monitoraggio e tuning del conntrack su gateway WISP
# Numero totale di connessioni tracciate in questo momento
/ip firewall connection print count-only

# Conteggio per stato (per capire dove si accumulano le entry)
:put [/ip firewall connection print count-only where connection-state=established]
:put [/ip firewall connection print count-only where connection-state=new]

# Le entry UDP (DNS, VoIP, gaming) sono spesso la maggioranza:
# ridurre udp-timeout libera memoria più in fretta
/ip firewall connection tracking set udp-timeout=15s udp-stream-timeout=1m

# Su gateway con tanto P2P: abbassare il timeout TCP established
# da 1 giorno (default) a qualche ora riduce drasticamente le entry stale
/ip firewall connection tracking set tcp-established-timeout=4h

# Verificare l'uso CPU del conntrack durante un picco
/system resource print
/tool profile duration=5s
Best practice WISP: NON impostare timeout troppo aggressivi sul TCP established (sotto i 15 minuti) o chiuderai connessioni VPN/SSH dei clienti durante le pause. Il punto debole è quasi sempre l'UDP e le connessioni new mai completate. La regola drop invalid + timeout UDP ragionevoli risolve il 90% dei problemi di tabella piena.
connection trackingstateful firewallnewestablishedrelatedinvaliduntrackedconntracktimeouttcp state

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