Perché non basta mettere due gateway?
Nel 2015 si scriveva gateway=172.23.0.1,10.0.0.1 e il router alternava i pacchetti fra le due linee. Oggi quasi tutto è HTTPS, con sessioni legate all’indirizzo IP: se una sessione cambia indirizzo pubblico a metà, banche, webmail e servizi cloud la chiudono.
In RouterOS 7 l’ECMP, cioè più rotte di default con la stessa distanza, è già meglio del vecchio round robin: di serie sceglie la linea con un calcolo su indirizzo di origine e di destinazione, quindi lo stesso PC verso lo stesso sito esce sempre dalla stessa linea. Però non sai quale, non puoi dare più peso alla linea più veloce e le connessioni che arrivano da internet non hanno la garanzia di tornare indietro dalla linea giusta. Per avere il controllo serve il PCC.
Come funziona il PCC?
Il matcher per-connection-classifier del firewall calcola un hash su indirizzi e porte di ogni nuova connessione e la mette in un “secchio”. Con due linee i secchi sono due (2/0 e 2/1): ogni connessione finisce in uno dei due e ci resta fino alla fine. Il lavoro si fa in tre mosse:
- marcare le connessioni nuove con il PCC;
- trasformare il marchio della connessione in un “routing mark”;
- far uscire ogni routing mark dalla sua linea, con una tabella di routing dedicata.
Lo schema dell’esempio:
- WAN1:
ether1, indirizzo10.6.0.10/12, gateway10.0.0.1(la rete del mio laboratorio); - WAN2:
ether2, indirizzo192.168.200.2/24, gateway192.168.200.1(la seconda linea); - LAN:
bridge-lan, rete192.168.88.0/24.
⚠️ Attenzione: gli indirizzi delle due WAN sono quelli del mio laboratorio. Sostituiscili con quelli delle tue linee: indirizzo del router su ciascuna e relativo gateway (il modem o il router dell’operatore).

Passo 1: come configuro le due WAN?
Un indirizzo per ciascuna linea e il DNS. Le rotte di default le mettiamo al passo 5, perché servono anche alle tabelle del PCC.
/ip address add address=10.6.0.10/12 interface=ether1 comment="WAN1"
/ip address add address=192.168.200.2/24 interface=ether2 comment="WAN2"
/ip dns set servers=10.0.0.1
Per controllare gli indirizzi delle due linee c’è l’IP calculator del Dojo, per la WAN1 e per la WAN2: verifica che ogni gateway stia nella stessa rete dell’indirizzo del router.
Prima di andare avanti, controlla che entrambi i gateway rispondano:
/ping 10.0.0.1 count=3
/ping 192.168.200.1 count=3
Passo 2: come creo le tabelle di routing?
In RouterOS 7 ogni routing mark corrisponde a una tabella, che va creata prima di usarla. Una per linea:
/routing table add name=via-wan1 fib
/routing table add name=via-wan2 fib
Passo 3: come marco le connessioni con il PCC?
Questo è il cuore. Le regole di mangle, con il loro significato subito sotto:
/ip firewall mangle
add chain=prerouting in-interface=ether1 connection-mark=no-mark action=mark-connection new-connection-mark=wan1-conn passthrough=yes comment="Entrate da WAN1"
add chain=prerouting in-interface=ether2 connection-mark=no-mark action=mark-connection new-connection-mark=wan2-conn passthrough=yes comment="Entrate da WAN2"
add chain=prerouting in-interface=bridge-lan dst-address-type=!local connection-mark=no-mark \
per-connection-classifier=both-addresses-and-ports:2/0 action=mark-connection new-connection-mark=wan1-conn passthrough=yes comment="PCC secchio 0"
add chain=prerouting in-interface=bridge-lan dst-address-type=!local connection-mark=no-mark \
per-connection-classifier=both-addresses-and-ports:2/1 action=mark-connection new-connection-mark=wan2-conn passthrough=yes comment="PCC secchio 1"
add chain=prerouting in-interface=bridge-lan connection-mark=wan1-conn action=mark-routing new-routing-mark=via-wan1 passthrough=no
add chain=prerouting in-interface=bridge-lan connection-mark=wan2-conn action=mark-routing new-routing-mark=via-wan2 passthrough=no
add chain=output connection-mark=wan1-conn action=mark-routing new-routing-mark=via-wan1 passthrough=no
add chain=output connection-mark=wan2-conn action=mark-routing new-routing-mark=via-wan2 passthrough=no
- le prime due regole fanno tornare dalla stessa linea le connessioni che arrivano da internet (per esempio un accesso remoto al router);
- la terza e la quarta dividono fra i due secchi le connessioni nate in LAN;
dst-address-type=!localesclude il traffico diretto al router stesso; - le ultime quattro trasformano il marchio della connessione in un routing mark, per il traffico della LAN e per quello generato dal router.
Tutte le varianti del classificatore (solo indirizzi, solo porte, più secchi) sono nel manuale MikroTik: Per connection classifier.
Passo 4: come lascio fuori dal PCC le reti delle WAN?
C’è una trappola che i vecchi tutorial non dicono. Dalla LAN apri la pagina del modem della linea 2, 192.168.200.1: il PCC tira i dadi anche per quella connessione, e in metà dei casi la manda verso il gateway della linea 1, dove il modem 2 non c’è. In laboratorio, su dieci tentativi, la pagina si è aperta cinque volte.
La soluzione: una regola che fa saltare il PCC al traffico diretto alle reti delle WAN, messa prima dei due secchi.
/ip firewall address-list add list=reti-wan address=10.0.0.0/12 comment="Rete WAN1"
/ip firewall address-list add list=reti-wan address=192.168.200.0/24 comment="Rete WAN2"
/ip firewall mangle add chain=prerouting in-interface=bridge-lan dst-address-list=reti-wan \
action=accept comment="Reti delle WAN: niente PCC" place-before=[find comment="PCC secchio 0"]
Con questa regola, dieci tentativi su dieci.
Passo 5: come metto le rotte?
Una rotta di default per ogni tabella, più quelle della tabella principale come riserva:
/ip route
add dst-address=0.0.0.0/0 gateway=10.0.0.1 routing-table=via-wan1 check-gateway=ping comment="PCC WAN1"
add dst-address=0.0.0.0/0 gateway=192.168.200.1 routing-table=via-wan2 check-gateway=ping comment="PCC WAN2"
add dst-address=0.0.0.0/0 gateway=10.0.0.1 distance=1 check-gateway=ping comment="Principale WAN1"
add dst-address=0.0.0.0/0 gateway=192.168.200.1 distance=2 check-gateway=ping comment="Riserva WAN2"
Passo 6: come configuro il NAT?
Gli utenti della LAN devono uscire con l’indirizzo della linea che stanno usando: un masquerade per ciascuna WAN.
/ip firewall nat
add chain=srcnat out-interface=ether1 action=masquerade comment="NAT WAN1"
add chain=srcnat out-interface=ether2 action=masquerade comment="NAT WAN2"
Passo 7: come verifico che le connessioni si dividano?
Dalla LAN apri un po’ di siti, poi sul router guarda i contatori delle regole PCC e le connessioni marcate:
/ip firewall mangle print stats where comment~"PCC"
/ip firewall connection print count-only where connection-mark=wan1-conn
/ip firewall connection print count-only where connection-mark=wan2-conn
In laboratorio, con venti connessioni da un PC della LAN, i secchi si sono divisi 11 e 9: il PCC non fa parti uguali al millimetro, ma su tante connessioni si avvicina molto. Una prova ancora più diretta: da due PC diversi apri un sito che mostra l’indirizzo pubblico; spesso usciranno da linee diverse.
Passo 8: che cosa succede se una linea cade?
check-gateway=ping fa controllare al router il gateway ogni 10 secondi: se non risponde, la rotta viene disattivata. Le connessioni marcate per quella linea non trovano più una rotta nella loro tabella e ricadono sulla tabella principale, quindi sull’altra linea.
L’ho provato spegnendo la linea 2: dopo una ventina di secondi le rotte della WAN2 sono diventate inattive e tutte le nuove connessioni, anche quelle del secchio della linea 2, sono uscite dalla linea 1. Dodici richieste su dodici, nessun errore.
Il limite è che check-gateway controlla solo il primo salto: se il modem risponde ma l’operatore è fuori servizio, il router non se ne accorge. Per un controllo vero serve verificare un indirizzo su internet, con le rotte ricorsive o con Netwatch: è un argomento a sé, che merita un howto dedicato. Per gli schemi di base c’è il manuale MikroTik: Load Balancing.
E se le linee hanno lo stesso gateway?
È il caso tipico di un WISP con più CPE verso lo stesso PPPoE server: tre pppoe-out con lo stesso gateway remoto. Usa il nome dell’interfaccia come gateway, perché sono collegamenti punto-punto:
/ip route add dst-address=0.0.0.0/0 gateway=pppoe-out1 routing-table=via-wan1
/ip route add dst-address=0.0.0.0/0 gateway=pppoe-out2 routing-table=via-wan2
Cosa controllo prima di metterlo in produzione?
Due linee vogliono dire due porte aperte su internet. Prima di collegarle, segui l’Hardening di base di un router MikroTik e metti tutte e due le WAN nella lista delle interfacce WAN del firewall.
Provato in laboratorio su PNETLab con CHR RouterOS 7.24.5 (stable), due linee (la seconda tramite un altro CHR) e un client Linux: divisione delle connessioni, accesso al modem della seconda linea con e senza esclusione delle reti WAN, caduta della seconda linea con check-gateway.
Domande frequenti
Che differenza c’è fra ECMP e PCC su MikroTik?
L’ECMP distribuisce il traffico fra più rotte di default con la stessa distanza, scegliendo la linea con un calcolo sugli indirizzi; il PCC assegna ogni connessione a una linea con il firewall mangle e la tiene lì fino alla fine, con il controllo completo su secchi, pesi e ritorno delle connessioni in ingresso.
Il PCC somma la velocità delle linee?
Il PCC somma la capacità complessiva: tante connessioni insieme usano tutte le linee. Una singola connessione, per esempio un download, resta su una linea sola e non va più veloce di quella.
Perché non riesco ad aprire la pagina del modem con il PCC attivo?
Perché il PCC manda una parte di quelle connessioni verso il gateway dell’altra linea. Una regola di mangle con action=accept per le reti delle WAN, messa prima dei secchi, risolve il problema.
Perché in RouterOS 7 devo creare le tabelle di routing?
In RouterOS 7 un routing mark corrisponde a una tabella di routing, che va creata prima con /routing table add name=... fib; in RouterOS 6 bastava scrivere il nome del mark nella rotta.
Come si dà più peso a una linea più veloce?
Con più secchi del PCC: con tre secchi (3/0, 3/1, 3/2) se ne assegnano due alla linea veloce e uno all’altra, ottenendo una divisione delle connessioni di circa due a uno.
Questo howto aggiorna a RouterOS 7 un articolo del 2015 sul mio vecchio blog wirelessguru.it, ormai offline.



