Guida MikroTik
Firewall e QoSBase

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.

srcnat — configurazioni comuni
# 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

dstnat — port forwarding e redirect
# 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.

Hairpin NAT — configurazione completa
# 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]
Sicurezza: il port forwarding espone servizi interni su Internet. Limitare sempre il traffico in entrata con regole firewall filter aggiuntive (es. src-address-list per IP autorizzati). Non esporre mai RDP (3389), Winbox (8291) o SSH (22) direttamente su Internet senza restrizioni di IP sorgente o VPN.
IMPORTANTE — il port-forward NON è bloccato dal firewall filter automaticamente, ma nemmeno bypassato: dopo il dstnat in prerouting il pacchetto attraversa comunque la chain 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.
Filter che accetta il traffico port-forwardato (necessario col drop WAN→LAN)
# 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).

CGNAT — masquerade del pool clienti verso IP pubblici
# 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)"
Limiti del CGNAT da spiegare ai clienti: non funzionano le porte in entrata (no port-forward dal lato cliente, niente server self-hosted, alcuni giochi P2P/console e telecamere DDNS faticano). Il vero rimedio è l'IPv6 nativo (assegna /56 o /64 a ogni cliente e i servizi in entrata tornano a funzionare senza NAT). Tieni d'occhio l'esaurimento delle porte: un singolo IPv4 pubblico regge ~64.000 sessioni, quindi pianifica 1 IP pubblico ogni poche decine di clienti CGNAT attivi.

Tabella: quale azione NAT usare

AzioneChainModificaCaso d'uso WISP
masqueradesrcnatIP sorgente = IP dinamico interfacciaUscita clienti con WAN DHCP/PPPoE (IP variabile)
src-natsrcnatIP sorgente = IP fisso sceltoUscita clienti con IP pubblico statico (più veloce)
dst-natdstnatIP+porta destinazionePort-forward verso server interni del cliente
netmapsrcnat/dstnatMappatura 1:1 di interi rangeAssegnazione blocco pubblico↔privato 1:1
redirectdstnatDestinazione = router stessoForzare il DNS dei clienti sul resolver del router
Azioni della chain nat e quando sceglierle.
NATsrcnatdstnatmasqueradeport forwardinghairpin NATnetmap1:1 NATredirectnat loopback

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