A real-life situation
A company has 300 policies on its FortiGate, and translations are scattered across them: some use the interface address, some an IP pool, a few have NAT off by mistake. An audit asks which public address each internal network leaves from. In central NAT mode that answer is one short table.
Policy NAT versus central NAT
| Policy NAT (default) | Central NAT | |
|---|---|---|
| Source NAT | NAT and IP pool set on each policy | Central SNAT table, top-down, separate from policies |
| Destination NAT | VIP used as the policy's destination | VIPs apply automatically; policy uses the real server address |
| Policies | Decide access and translation | Decide access only |
Enable it and write SNAT rules
config system settings
set central-nat enable
end
config firewall central-snat-map
edit 1
set srcintf "port2"
set dstintf "port1"
set orig-addr "LAN-subnet"
set dst-addr "Payment-Provider"
set nat-ippool "Payments-Pool"
next
edit 2
set srcintf "port2"
set dstintf "port1"
set orig-addr "LAN-subnet"
set dst-addr "all"
next
endRule 1 translates payment traffic to the pool; rule 2 translates everything else from the LAN to port1's address (no pool means the outgoing interface address). Like policies, the first matching rule wins, so specific rules go first. Traffic that matches no SNAT rule leaves untranslated.
Published servers in central mode
The VIP VIP-WEB1-HTTPS stays as it is, but the policy no longer names it. Because destination NAT is applied automatically before the policy check, the policy matches the real address:
config firewall policy
edit 6
set name "Internet-to-WEB1"
set srcintf "port1"
set dstintf "port3"
set srcaddr "all"
set dstaddr "WEB1"
set action accept
set schedule "always"
set service "HTTPS"
next
enddstaddr is the address object WEB1 (10.0.2.10), not the VIP. In central mode the policy has no NAT settings at all.
Why it works this way
Separating translation from access control lets each be read and changed on its own. The cost is that one session's behaviour is now spread over two tables, so troubleshooting means checking both: debug flow and the session list still show which policy allowed the session and which translation was applied.
Common mistakes
- Enabling central NAT and forgetting the SNAT rules: LAN traffic leaves with private addresses.
- Keeping the VIP as a policy destination in central mode, where policies must use the mapped address.
- Ordering a general SNAT rule above a specific one.
Key takeaways
- Central NAT moves SNAT into a separate top-down table; policies only allow or deny.
- VIPs apply automatically, and policies refer to the real server address.
- Policies must stop referencing VIPs and pools before central NAT can be enabled.
- Policy NAT is the default and suits most networks.
Check yourself
In central NAT mode, what is the destination of the policy that allows Internet users to reach WEB1?
After enabling central NAT, LAN users can't browse. Policies allow the traffic. What is missing?