You can use either Source NAT (SNAT) or Destination NAT (DNAT) for traffic passing through a FortiGate. There are two ways to configure Source NAT and Destination NAT:
- Firewall Policy NAT
- Central NAT
NAT via a Virtual IP (VIP)
Virtual IP (VIP) are used to translate an external or public IP address (Internet) to an internal or private IP address.
A VIP is a Destination NAT (DNAT), which you can only select in a Firewall Policy destination address field.
To create a VIP, go to Policy & Objects > Virtual IPs > Create New > Virtual IP.
Type a Name: FTP_SERVER_VIP > optionally type a Comment > select Interface: port1 > leave default Type: Static NAT > type External IP address/range: 192.168.1.200 > type Mapped IP address/range: 172.16.1.100 > click OK.
Create a Firewall Policy using the VIP created as destination address.
Go to Firewall Policy > Create New.
Type a Name: FTP_ACCESS > select Incoming Interface: port1 > select Outgoing Interface: port2 > select Source: all (from Internet) > select/search Destination: FTP_SERVER_VIP (under VIRTUAL IP/SERVER).
Leave default Schedule: Always > select Service: HTTP > leave default Action: ACCEPT > leave default Inspection Mode: Flow based > disable NAT
Select Log Allowed Traffic: All Sessions > leave the other settings in default > click OK.
I was able to FTP from 192.168.1.100 (Windows 10) to 192.168.1.200 (NAT VIP for Windows 7 VM).
To view the FortiGate NAT session entries, use the get system session list command.
Notice the 192.168.1.200 was translated (DESTINATION-NAT) to 172.16.1.100.
FG-1 # get system session
list List the current VDOM IPv4 sessions.
status List the current VDOM IPv4 session count.
FG-1 # get system session list
PROTO EXPIRE SOURCE SOURCE-NAT DESTINATION DESTINATION-NAT
tcp 3599 192.168.1.100:53070 - 192.168.1.160:80 -
tcp 3600 192.168.1.100:53068 - 192.168.1.160:22 -
tcp 3512 192.168.1.100:53045 - 192.168.1.200:21 172.16.1.100:21
udp 179 192.168.1.160:1772 - 208.91.112.52:53 -
udp 179 192.168.1.160:1772 - 208.91.112.53:53 -
tcp 3599 192.168.1.100:53069 - 192.168.1.160:80 -
tcp 0 192.168.1.160:6686 - 173.243.132.27:443 -
Use the diagnose sys session clear command to clear all existing sessions (including the SSH session).
FG-1 # diagnose sys session
sync List session sync.
list List session.
clear Clear the sessions defined by filter.
stat Stat session.
full-stat Fully stat session.
exp-stat Expectation session statistics.
ttl TTL session.
filter List session with filters.
help Session help.
FG-1 # diagnose sys session clear
Notice the previous FTP session was cleared.
FG-1 # get system session list
PROTO EXPIRE SOURCE SOURCE-NAT DESTINATION DESTINATION-NAT
tcp 3599 192.168.1.100:53099 - 192.168.1.160:22 -
tcp 3595 192.168.1.100:53101 - 192.168.1.160:80 -
I tested Source NAT from 172.16.1.100 (Windows 7 VM). All egress or outgoing connections used the VIP 192.168.1.200.
Notice the 172.16.1.100 (Windows 7 VM) uses the VIP 192.168.1.200 for Source NAT instead of the IP address on egress/port1 (192.168.1.160).
FG-1 # get system session list
PROTO EXPIRE SOURCE SOURCE-NAT DESTINATION DESTINATION-NAT
tcp 3600 192.168.1.100:53099 - 192.168.1.160:22 -
udp
134 172.16.1.100:54959
192.168.1.200:54959 172.217.160.14:443 -
udp 146 172.16.1.100:54973 192.168.1.200:54973 74.125.24.95:443 -
udp 146 172.16.1.100:54955 192.168.1.200:54955 8.8.8.8:443 -
udp 133 172.16.1.100:54963 192.168.1.200:54963 157.240.7.26:443 -
udp 103 172.16.1.100:54954 192.168.1.200:54954 8.8.8.8:53 -
udp 108 172.16.1.100:54958 192.168.1.200:54958 157.240.13.35:443 -
udp 17 172.16.1.100:59660 192.168.1.200:59660 8.8.8.8:53 -
udp 160 192.168.1.160:1772 - 208.91.112.52:53 -
udp 173 192.168.1.160:1772 - 208.91.112.53:53 -
udp 136 172.16.1.100:54956 192.168.1.200:54956 172.217.160.36:443 -
Dynamic NAT with IP Pools
IP Pools are used to translate the source address to an address from that pool, rather than the FortiGate egress interface IP address.
To create an IP pool, go to Policy & Objects > IP Pools > Create New.
Type a Name: IP_POOL_1 > leave default Type: Overload > type External IP address/range: 192.168.1.201-192.168.1.201 > leave the default ARP Reply enabled > click OK.
Edit the Firewall Policy to use the IP pool, go to Policy & Objects > Firewall Policy.
I temporarily disabled the Firewall Policies: FTP_ACCESS and DENY_PING_DNS by doing a right-click > Set Status > Disable.
Select the Firewall Policy: FG_LAN_INTERNET > click Edit (or just double-click it).
Select IP Pool Configuration > Use Dynamic IP Pool > select IP_POOL_1 created earlier > click Close.
Click OK.
I can access support.fortinet.com from 172.16.1.100 (Windows 7 VM).
To view the FortiGate NAT session table, use the get system session list command.
Notice the SOURCE-NAT is using the IP address 192.168.1.201 instead of the FortiGate egress interface IP address 192.168.1.160.
FG-1 # get system session list
PROTO EXPIRE SOURCE SOURCE-NAT DESTINATION DESTINATION-NAT
tcp 3594 172.16.1.100:56543 192.168.1.201:56543 63.137.229.1:443 -
tcp 3594 172.16.1.100:56542 192.168.1.201:56542 63.137.229.1:443 -
udp 168 172.16.1.100:64393 192.168.1.201:64393 8.8.8.8:53 -
udp 173 172.16.1.100:64394 192.168.1.201:64394 8.8.4.4:443 -
tcp 3594 172.16.1.100:56541 192.168.1.201:56541 63.137.229.1:443 -
tcp 3600 192.168.1.100:57481 - 192.168.1.160:22 -
udp 174 172.16.1.100:64395 192.168.1.201:64395 74.125.24.103:443 -
udp 145 192.168.1.160:1940 - 208.91.112.52:53 -
udp 150 192.168.1.160:1940 - 208.91.112.53:53 -
Central Source NAT (SNAT)
A Central Source NAT (SNAT) policy is applied to multiple firewall policies, based on a configured central rule. You use the set central-nat enable command to enable Central SNAT in FortiGate.
When enabling Central SNAT, make sure to remove first the VIP and IP pool references from the existing Firewall Policies. Notice an error was prompted due to a VIP used in policy ID 3 even though it's currently disabled.
FG-1 # config sys setting
FG-1 (settings) # set central-nat enable
Cannot enable central-nat with firewall policy using vip (id=3).
I removed all the configured Firewall Policy except for Implicit Deny.
I was able to issue the set central-nat enable command afterwards.
FG-1 # config sys setting
FG-1 (settings) # set central-nat enable
FG-1 (settings) # end
I logout and re-login the FortiGate GUI in order to display the Central SNAT option.
Go to Policy & Objects > Central SNAT > Create New.
Select Incoming Interface: any > select Outgoing Interface: any > select Source Address: all > select Destination Address: all.
Leave the NAT option enabled > IP Pool Configuration > Use Dynamic IP Pool > select IP_POOL_1 (192.168.1.201) > select Protocol: any > click OK.
Create a Firewall Policy to allow LAN traffic to the Internet. Go to Policy & Objects > Firewall Policy > Create New.
Type a Name: LAN_TO_INTERNET > select Incoming Interface: port2 > select Outgoing Interface: port1 > select Source: all > select Destination: all > select Service: ALL > leave the Action: Accept > leave the Inspection Mode: Flow based.
Notice there's no option to enable NAT within the Firewall Policy.
Select Log Allowed Traffic: All Sessions > leave the other settings in default > click OK.
To test the Central SNAT policy, I tried to go to docs.fortinet.com from 172.16.1.100 (Windows 7 VM).
To view the FortiGate NAT session table, issue a get system session list command.
Notice the IP 172.16.1.100 (Windows 7 VM) was translated using the SOURCE-NAT address 192.168.1.201 (IP_POOL_1).
FG-1 # get system session list
PROTO EXPIRE SOURCE SOURCE-NAT DESTINATION DESTINATION-NAT
tcp 3595 192.168.1.100:60902 - 192.168.1.160:80 -
tcp 3600 192.168.1.100:60899 - 192.168.1.160:22 -
udp 148 172.16.1.100:53737 192.168.1.201:53737 74.125.24.139:443 -
udp 138 172.16.1.100:55522 192.168.1.201:55522 8.8.8.8:53 -
tcp 3595 192.168.1.100:60903 - 192.168.1.160:80 -
tcp 3595 192.168.1.100:60900 - 192.168.1.160:80 -
tcp 4 192.168.1.100:60904 - 192.168.1.160:80 -
udp 137 172.16.1.100:53739 192.168.1.201:53739 172.253.118.102:443 -
udp 139 172.16.1.100:55524 192.168.1.201:55524 8.8.8.8:53 -
tcp 3 192.168.1.100:60901 - 192.168.1.160:80 -
udp 159 172.16.1.100:55538 192.168.1.201:55538 74.125.68.95:443 -
udp 151 172.16.1.100:53734 192.168.1.201:53734 74.125.24.103:443 -
udp 139 172.16.1.100:55523 192.168.1.201:55523 8.8.8.8:53 -
udp 159 172.16.1.100:53736 192.168.1.201:53736 8.8.4.4:443 -
udp 176 192.168.1.160:4301 - 208.91.112.53:53 -
udp 161 192.168.1.160:4301 - 208.91.112.52:53 -
Create a second IP Pool to be used for the second Central SNAT policy. Go to Policy & Objects > IP Pools > Create New.
Type a Name: IP_POOL_2 > leave default Type: Overload > type External IP address/range: 192.168.1.202-192.168.1.202 > click OK.
Create a second Central SNAT policy, go to Policy & Objects > Central SNAT > Create New.
Select Incoming Interface: port2 > select Outgoing Interface: port1 > select Source Address: all > select Destination Address: PUBLIC_DNS (4.2.2.2)
Leave NAT enabled > IP Pool Configuration > Use Dynamic IP Pool > select IP_POOL_2 > select Protocol: any > click OK.
Like the Firewall Policy, a Central SNAT policy is processed from top to bottom. Re-order the newly created Central SNAT policy (ID 2) and move it to the top.
I tried to ping the pubic DNS 4.2.2.2 from 172.16.1.100 (Windows 7 VM).
Notice the ICMP session was translated using the IP_POOL_2 (192.168.1.202).
FG-1 # get system session list
PROTO EXPIRE SOURCE SOURCE-NAT DESTINATION DESTINATION-NAT
tcp 3599 192.168.1.100:61282 - 192.168.1.160:80 -
tcp 0 192.168.1.160:7767 - 173.243.132.27:443 -
tcp 3599 192.168.1.100:61280 - 192.168.1.160:80 -
tcp 3599 192.168.1.100:61281 - 192.168.1.160:80 -
tcp 3599 192.168.1.100:61270 - 192.168.1.160:22 -
icmp 46 172.16.1.100:1 192.168.1.202:60417 4.2.2.2:8 -
udp 163 192.168.1.160:1289 - 208.91.112.53:53 -
udp 179 192.168.1.160:1289 - 208.91.112.52:53 -
Central Destination NAT (DNAT) and VIP
In Firewall Policy NAT, a Virtual IP (VIP) is selected in the Firewall Policy as the destination address. In Central NAT, as soon as DNAT & Virtual IPs is configured, the FortiGate automatically creates a rule in the kernel to allow DNAT to occur with no additional configuration.
To create DNAT and VIP, go to Policy & Objects > DNAT & Virtual IPs.
Notice the previous DNAT configured: FTP_SERVER_VIP, which mapped the External IP address: 192.168.1.200 to Internal IP: 172.16.1.100 (Windows 7 VM).
Create an Egress-to-Ingress Firewall Policy, go to Policy & Objects > Firewall Policy > Create New.
Type a Name: DNAT_FTP_VIP > select Incoming Interface: port1 > select Outgoing Interface: port2 > select Source: all.
Notice you can't select the FTP_SERVER_VIP as the Destination since the FortiGate automatically creates a rule in the kernel for DNAT to occur.
Select Destination: all > select Service: FTP > leave default Action: Accept.
Select Log Allowed Traffic: All Sessions > click OK.
I tried to FTP from 192.168.1.100 (Windows 10) to 192.168.1.200 (NAT for Windows 7 VM).
To view the FortiGate NAT session table, issue a get system session list command.
Notice the 192.168.1.100 (Windows 10) was translated using DESTINATION_NAT 192.168.1.200 (VIP) to 172.16.1.100 (Windows 7 VM) without creating a DNAT policy.
FG-1 # get system session list
PROTO EXPIRE SOURCE SOURCE-NAT DESTINATION DESTINATION-NAT
tcp 3595 192.168.1.100:49166 - 192.168.1.160:80 -
tcp 3571 192.168.1.100:49155 192.168.1.201:49155 192.168.1.200:21 172.16.1.100:21
tcp 3595 192.168.1.100:49167 - 192.168.1.160:80 -
tcp 3595 192.168.1.100:49164 - 192.168.1.160:80 -
udp 143 192.168.1.160:2896 - 208.91.112.52:53 -
udp 176 192.168.1.160:2896 - 208.91.112.53:53 -
tcp 3595 192.168.1.100:49165 - 192.168.1.160:80 -
tcp 3599 192.168.1.100:65529 - 192.168.1.160:22 -
I
tried to access fortinet.com from 172.16.1.100 (Windows 7 VM).
View the NAT table again. Notice the 172.16.1.100 used the Central SNAT IP_POOL_1 (192.168.1.201).
FG-1 # get system session list
PROTO EXPIRE SOURCE SOURCE-NAT DESTINATION DESTINATION-NAT
udp 92 172.16.1.100:53315 192.168.1.201:53315 172.217.194.103:443 -
udp 167 172.16.1.100:53329 192.168.1.201:53329 74.125.200.95:443 -
udp 179 172.16.1.100:61271 192.168.1.201:61271 172.217.194.95:443 -
tcp 4 192.168.1.100:49226 - 192.168.1.160:80 -
tcp 3593 172.16.1.100:56672 192.168.1.201:56672 91.199.212.52:80 -
tcp 3342 192.168.1.100:49155 192.168.1.201:49155 192.168.1.200:21 172.16.1.100:21
udp 164 172.16.1.100:53337 192.168.1.201:53337 74.125.24.155:443 -
udp 163 172.16.1.100:53333 192.168.1.201:53333 74.125.24.100:443 -
tcp 3599 172.16.1.100:56677 192.168.1.201:56677 52.84.224.40:443 -
tcp 3598 172.16.1.100:56673 192.168.1.201:56673 52.84.224.58:443 -
udp 167 172.16.1.100:49759 192.168.1.201:49759 157.240.13.35:443 -
udp 166 172.16.1.100:53343 192.168.1.201:53343 8.8.4.4:443 -
tcp 3599 172.16.1.100:56675 192.168.1.201:56675 50.16.7.188:443 -
udp 173 172.16.1.100:54230 192.168.1.201:54230 8.8.8.8:53 -
udp 167 172.16.1.100:49758 192.168.1.201:49758 172.217.194.157:443 -
tcp 3598 172.16.1.100:56671 192.168.1.201:56671 13.107.4.50:80 -
tcp 3599 172.16.1.100:56676 192.168.1.201:56676 18.141.80.142:443 -
udp 179 172.16.1.100:61272 192.168.1.201:61272 74.125.24.94:443 -
tcp 4 172.16.1.100:56668 192.168.1.201:56668 50.116.239.150:443 -
udp 92 172.16.1.100:53314 192.168.1.201:53314 8.8.4.4:443 -
udp 50 172.16.1.100:56677 192.168.1.201:56677 8.8.8.8:53 -