NAT in RouterOS — Masquerade, Port Forwarding e Hairpin
Network Address Translation permette a una rete privata di condividere un singolo IP pubblico (srcnat/masquerade) e di esporre servizi interni su Internet (dstnat/port-forward), con la variante hairpin per i client LAN.
Il NAT in RouterOS opera nella chain nat con due sotto-chain: srcnat (modifica l'indirizzo sorgente, tipicamente in postrouting) e dstnat (modifica l'indirizzo destinazione, tipicamente in prerouting, prima della decisione di routing). La scelta tra le due dipende da cosa si vuole modificare nel pacchetto.
srcnat — Masquerade vs src-nat
Masquerade usa dinamicamente l'IP corrente dell'interfaccia WAN: ideale per connessioni DHCP o PPPoE dove l'IP pubblico cambia. src-nat usa un IP statico: più efficiente (meno lookup) ma richiede un IP pubblico fisso.
# MASQUERADE — IP WAN dinamico (DHCP/PPPoE) # Tutta la rete 192.168.88.0/24 esce con l'IP corrente di ether1 /ip firewall nat add chain=srcnat src-address=192.168.88.0/24 out-interface=ether1 action=masquerade comment="Masquerade LAN -> WAN (IP dinamico)" # SRC-NAT — IP WAN statico (più performante di masquerade) /ip firewall nat add chain=srcnat src-address=192.168.88.0/24 out-interface=ether1 action=src-nat to-addresses=203.0.113.1 comment="SRC-NAT LAN -> WAN con IP fisso" # NETMAP — mappatura 1:1 tra range di indirizzi # (es. 10.0.0.0/24 privato -> 203.0.113.0/24 pubblico, stesso offset) /ip firewall nat add chain=srcnat src-address=10.0.0.0/24 out-interface=ether1 action=netmap to-addresses=203.0.113.0/24 comment="1:1 NAT tra subnet privata e pubblica"
dstnat — Port Forwarding
# PORT FORWARDING — espone un server interno su Internet # Traffico verso IP-pubblico:80 → viene inoltrato a 192.168.88.100:80 /ip firewall nat add chain=dstnat protocol=tcp dst-address=203.0.113.1 dst-port=80 action=dst-nat to-addresses=192.168.88.100 to-ports=80 comment="Port-forward HTTP -> web server interno" # PORT FORWARDING SSH esterno su porta non standard 2222 -> porta 22 interna /ip firewall nat add chain=dstnat protocol=tcp in-interface=ether1 dst-port=2222 action=dst-nat to-addresses=192.168.88.50 to-ports=22 comment="Port-forward SSH su porta alternativa" # REDIRECT locale — reindirizza tutto il traffico DNS dei client # verso il resolver locale del router (utile per DNS filtering) /ip firewall nat add chain=dstnat protocol=udp in-interface-list=LAN dst-port=53 action=redirect to-ports=53 comment="Redirect DNS: forza tutti i client a usare il DNS del router"
Hairpin NAT (NAT loopback)
Senza Hairpin NAT, un client LAN che tenta di raggiungere un server interno usando l'IP pubblico del router riceve una risposta con sorgente privata, causando un timeout. Con l'Hairpin, il router masquera anche il traffico in uscita dalla LAN verso il server interno.
# PASSO 1: regola dstnat (già presente per il port-forward) /ip firewall nat add chain=dstnat protocol=tcp dst-address=203.0.113.1 dst-port=443 action=dst-nat to-addresses=192.168.88.100 to-ports=443 comment="dstnat HTTPS -> web server interno" # PASSO 2: regola srcnat hairpin # Quando un client LAN raggiunge il server interno via IP pubblico, # masquera la sorgente con l'IP LAN del router. # Così il server risponde al router, che poi rigira la risposta al client. /ip firewall nat add chain=srcnat protocol=tcp src-address=192.168.88.0/24 dst-address=192.168.88.100 dst-port=443 out-interface=LAN action=masquerade comment="Hairpin NAT: LAN -> server interno via IP pubblico" # IMPORTANTE: dopo aver aggiunto/modificato regole NAT, svuota il conntrack /ip firewall connection remove [find]
forward. Se hai un drop WAN→LAN generico (consigliato), DEVI aggiungere una regola filter che accetti quel traffico verso l'IP interno, altrimenti il forward verrà scartato nonostante il NAT corretto. Usa connection-nat-state=dstnat per accettare solo il traffico effettivamente NATtato.# Accetta SOLO le connessioni che sono passate per una regola dstnat. # Da inserire PRIMA del drop WAN->LAN nella chain forward. /ip firewall filter add chain=forward connection-nat-state=dstnat connection-state=new in-interface-list=WAN action=accept comment="Accetta traffico port-forwardato verso server interni"
CGNAT — Carrier-Grade NAT per WISP a corto di IPv4
Molti WISP italiani non hanno IPv4 pubblici a sufficienza per ogni cliente. La soluzione è il CGNAT: si assegnano ai clienti indirizzi dello spazio dedicato 100.64.0.0/10 (RFC 6598, NON RFC 1918) e si fa masquerade verso un pool di IP pubblici sulla WAN. Lo spazio 100.64/10 è apposito per il NAT del carrier e non confligge con le LAN private dei clienti (10.x/192.168.x).
# I clienti ricevono IP nello spazio 100.64.0.0/10 (CGNAT, RFC 6598) # Masquerade verso la WAN: tutti escono dietro l'IP pubblico del router /ip firewall nat add chain=srcnat src-address=100.64.0.0/10 out-interface-list=WAN action=masquerade comment="CGNAT: pool clienti -> IP pubblico" # Con più IP pubblici disponibili: distribuisci il carico su un pool # (riduce l'esaurimento delle porte per singolo IP pubblico) /ip firewall address-list add list=cgnat-pool address=203.0.113.10-203.0.113.20 /ip firewall nat add chain=srcnat src-address=100.64.0.0/10 out-interface-list=WAN action=src-nat to-addresses=203.0.113.10-203.0.113.20 comment="CGNAT: pool clienti -> pool IP pubblici (load distribution)"
Tabella: quale azione NAT usare
| Azione | Chain | Modifica | Caso d'uso WISP |
|---|---|---|---|
| masquerade | srcnat | IP sorgente = IP dinamico interfaccia | Uscita clienti con WAN DHCP/PPPoE (IP variabile) |
| src-nat | srcnat | IP sorgente = IP fisso scelto | Uscita clienti con IP pubblico statico (più veloce) |
| dst-nat | dstnat | IP+porta destinazione | Port-forward verso server interni del cliente |
| netmap | srcnat/dstnat | Mappatura 1:1 di interi range | Assegnazione blocco pubblico↔privato 1:1 |
| redirect | dstnat | Destinazione = router stesso | Forzare il DNS dei clienti sul resolver del router |
Continua con
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