NAT64 映射
NAT64 映射
网络需求
将 IPv4 内部服务器,发布到 IPv6 网络之中,允许用户通过 IPv6 来对其进行访问。
网络拓扑

Client 侧为 IPv6,Server 侧为 IPv4,使用 Client 访问 Server,FortiGate 做 NAT64 转换。
配置步骤
创建 VIP,选择类型为 IPv6,“映射到”填写 IPv4 Server 真实地址,“外部 IP 地址/范围”填写 IPv6 VIP 地址,NAT64 VIP 的外部地址如果是一个范围,必须填写为一个完整的 subnet,否则 GUI 报错。

config firewall vip6 edit "NAT64" set extip 2200::64 set nat66 disable set nat64 enable set ipv4-mappedip 10.10.12.1 set add-nat64-route enable next end可以看默认存在一个 naf.root 接口,用于处理 NAT64 流量,创建 VIP 完成后,如果开启了 add-nat64-route(默认开启),针对 naf.root 接口生成去往 VIP IPv6 地址的路由,关闭 add-nat64-route 后,该路由会消失。


注意:如果是 NAT64 VIP,“外部 IP 范围”配置的不是一个完整的 subnet,或范围中包含 subnet 的广播地址,则下发时页面或 CLI 会报错,因为无法为 naf 接口下发路由。

创建 IPv4 Pool,配置地址池范围,注意不要和 port18 地址冲突,配置冲突这里并不会提示,后续会讲到为什么不能配成一样的,开启 NAT64 后,须填写为一个完整的 subnet(最小 32 位)的 IPv4 地址范围,否则 GUI 报错。

config firewall ippool edit "NAT64" set startip 10.10.200.0 set endip 10.10.200.127 set nat64 enable set add-nat64-route enable next end创建完成后,如果开启了 add-nat64-route(默认开启),可以看到生成了 IPv4 的 kernel 路由,针对 naf.root 接口生成去往 IPPool IPv4 地址的路由,IPPool 关闭 NAT64 或关闭 add-nat64-route 后,该路由会消失。
FortiGate # get router info kernel | grep naf tab=254 vf=0 scope=0 type=1 proto=11 prio=0 0.0.0.0/0.0.0.0/0->10.10.200.0/25 pref=0.0.0.0 gwy=0.0.0.0 dev=37(naf.root)开启 NAT64 后,如果 IPPool 配置的不是一个完整的 subnet,则下发时页面或 CLI 会报错,因为无法为 naf 接口下发路由。

创建防火墙策略,先在 NAT 选项中开启 NAT64,在 Source 中引用 IPv6 的 all,然后在 Destination 中引用 VIP,在 IPPool 中引用 IPPool。

config firewall policy edit 2 set name "NAT64" set srcintf "lan" set dstintf "port18" set action accept set nat64 enable set srcaddr "all" set dstaddr "all" set srcaddr6 "all" set dstaddr6 "NAT64" set schedule "always" set service "ALL" set ippool enable set poolname "NAT64" next end
结果验证与注意事项
Client 访问 FortiGate 的 NAT64 VIP 地址 2200::64,抓包查看 NAT64 过程,可以看到经过 naf.root 接口,目标地址被转换为 Server IPv4,源 IPv6 地址被转换为 IPPool 中的 IPv4 地址,返回的流量从 IPv4 被还原为 IPv6。

debug flow IPv4/IPv6,可以看到 DNAT64 整个过程都需要经过 naf.root 接口处理。

在 FortiGate 查看 IPv6 会话,可以看到源接口为物理入接口 lan,目标接口为 index 37,为 naf.root,naf 被标记为 1,IPv6 流量未被加速,会话中还包含相关的 IPv4 的相关信息。


在 FortiGate 查看 IPv4 会话,可以看到源接口为 index 37,为 naf.root,目标接口为物理出接口 port18,naf 被标记为 2,IPv4 流量未被加速,会话中还包含相关的 IPv6 会话信息。


修改 IPPool 的地址范围和 IPv4 出接口地址一致,再次测试 NAT64 转换。
config firewall ippool edit "NAT64" set startip 10.10.12.2 set endip 10.10.12.2 set nat64 enable next end查看 kernel 路由中关于 naf.root 的路由,可以看到未产生 IPPool 的路由,这样返回的流量肯定是被丢掉的,接下来验证一下。

debug flow IPv4 & IPv6 可以看到,Client 到 Server 方向的 NAT46 的 DNAT 和 SNAT 均正常工作,但返回的 IPv6 流量未匹配到 naf.root 接口的路由,而 gw 查找到的是 root 接口,返回的流量无法到达 Client。

8.
还原 IPPool 的配置,这次修改 VIP6 的 External IP 和物理入接口 IP 一致。
config firewall vip6 edit "NAT64" set extip 2100::1 set nat66 disable set nat64 enable set ipv4-mappedip 10.10.12.1 next end查看 kernel 路由中关于 naf.root 的路由,可以看到未产生 naf.root 接口的 VIP6 的路由,这样 NAT64 的 Client 发起方流量应该是无法进入 NAT64 流程的,接下来验证一下。

debug flow IPv4 & IPv6 可以看到,Client 到 Server 方向的 NAT64 流量被 FortiGate 路由到 root 接口,未进入 naf.root 接口,由 FortiGate 直接返回了 reply 报文,没有 IPv4 的 debug flow 产生。

12.
CLI 相关
VIP CLI
IPv4 类型的 VIP 支持三种组合,NAT44、NAT46、NAT44 + NAT46。
config firewall vip edit "vip1" set extip 30.0.0.110-30.0.0.120 set extintf "port3" set arp-reply disable set portforward enable set srcintf-filter "port3" set nat44 disable <------- new option enabled by default set nat46 enable <------- new option disabled by default set ipv6-mappedip 2040::20-2040::30 <------- new option available when nat46 enabled set extport 10 set ipv6-mappedport 100 <------- new option available when nat46 enabled next endIPv6 类型的 VIP 支持三种组合,NAT66、NAT64、NAT66 + NAT64。
config firewall vip6 edit "vip3" set extip 2002::100-2002::200 set portforward enable set nat66 disable <---- new option enabled by default set nat64 enable <---- new option disabled by default set ipv4-mappedip 8.8.8.8-8.8.8.108 <----- new option available when nat64 is enabled set ipv4-mappedport 1000 <--- new option available when nat64 is enabled set extport 100 next endNAT64 也支持 Virtual Server,开启 NAT64 后,RS 必须配置为 IPv4 地址,实现的 NAT 过程和普通的 NAT64 是一样的。
config firewall vip6 edit "vip2" set type server-load-balance set extip 2002::2 set server-type udp set monitor "ping-mon-l" set nat64 enable set extport 53 config realservers edit 1 set ip 8.8.8.8 <----- server ip must be ipv4 when nat64 is abled set port 53 next edit 2 set ip 8.8.4.4 set port 53 next end next end
IPPool CLI
IPv4 类型的 IPPool,类型为 NAT64,地址池范围必须是一个 subnet 的范围,默认会开启 add-nat64-route。
config firewall ippool edit "pol64" set startip 10.0.0.0 <--- ip range must be a subnet if nat64 enabled set endip 10.0.255.255 set nat64 enable <--- new option set add-nat64-route enable <---- new option available when nat64 enabled (by default enable) next endIPv6 类型的 IPPool,类型为 NAT46,地址池范围必须是一个 subnet 的范围,默认会开启 add-nat46-route。
config firewall ippool6 edit "pol46" set startip 2002:: <---- ip range must be a subnet if nat46 enabled set endip 2002::ffff set nat46 enable set add-nat46-route enable <---- new option available when nat46 enabled (by default enable) next end
Firewall Policy & Central SNAT CLI
NAT64 Firewall Policy。
config firewall policy edit 3 set srcintf "port2" set dstintf "port3" set srcaddr "all" set dstaddr "all" <---- both ipv4 and ipv6 addresses are required when nat64 enable set srcaddr6 "all" set dstaddr6 "vip3" <--- vip6 with nat64 enabled set action accept set schedule "always" set service "ALL" set ippool enable set poolname "po1" <---- ipv4 pool with nat64 enabled set nat64 enable <--- new option to enable nat64 next endNAT64 Central SNAT。
config firewall central-snat-map edit 3 set type ipv6 set srcintf "any" set dstintf "any" set orig-addr6 "all" set dst-addr6 "all" set nat64 enable <---- new option for ipv6 rule set nat-ippool "po1" <---- available when nat64 is enabled, ipv4 pool with nat64 enabled next end