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

Client 侧为 IPv4,Server 侧为 IPv6,使用 Client 访问 Server,FortiGate 做 NAT46 转换。
配置步骤
创建 VIP,选择类型为 IPv4,“映射到”填写 IPv6 Server 真实地址, “外部 IP 地址/范围”填写 IPv4 VIP 地址,如果是一个范围,必须填写为一个完整的 subnet(最小 31 位)的单播地址范围,不能填写广播和网络号,否则 GUI 报错。

config firewall vip edit "NAT46" set extip 192.168.200.99 set nat44 disable set nat46 enable set extintf "lan" set ipv6-mappedip 2100::2 set add-nat46-route enable next end可以看默认存在一个 naf.root 接口,用于处理 NAT46 流量,创建 VIP 完成后,如果开启了 add-nat46-route(默认开启),针对 naf.root 接口生成去往 VIP IPv4 地址的路由,关闭 add-nat46-route 后,该路由会消失。


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

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

config firewall ippool6 edit "NAT46" set startip 2200:: set endip 2200::ffff set nat46 enable set add-nat46-route enable next end创建完成后,如果开启了 add-nat46-route(默认开启),可以看到生成了 IPv6 的 kernel 路由,针对 naf.root 接口生成去往 IPPool IPv6 地址的路由,IPPool6 关闭 NAT46 或关闭 add-nat46-route 后,该路由会消失。

开启 NAT46 后,如果 IPPool6 配置的不是一个完整的 subnet,则下发时页面或 CLI 会报错,因为无法为 naf 接口下发路由。

创建防火墙策略,,然后源地址引用 IPv4 的 all,然后在目标地址中引用 NAT46 VIP,在 IPPool 中引用 IPPool6。

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

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

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


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


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

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

8.
config system interface
edit "port18"
config ipv6
set ip6-address 2100::1/64
config ip6-extra-addr
edit 2100::3/64
end
end
end还原 IPPool6 的配置,这次修改 VIP 的 External IP 和物理入接口 IP 一致。
config firewall vip edit "NAT46" set extip 192.168.100.99 set nat44 disable set nat46 enable set extintf "lan" set ipv6-mappedip 2100::2 next end查看 kernel 路由中关于 naf.root 的路由,可以看到未产生 naf.root 接口的 VIP 的路由,这样 NAT46 的 Client 发起方流量应该是无法进入 NAT46 流程的,接下来验证一下。

debug flow IPv4 & IPv6 可以看到,Client 到 Server 方向的 NAT46 流量被 FortiGate 路由到 root 接口,未进入 naf.root 接口,由 FortiGate 直接返回了 reply 报文,没有 IPv6 的 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 endNAT46 也支持 Virtual Server,开启 NAT46 后,RS 必须配置为 IPv6 地址,实现的 NAT 过程和普通的 NAT46 是一样的。
config firewall vip edit "vip_svr" set type server-load-balance set extip 30.0.0.130 set extintf "port3" set arp-reply disable set server-type http set monitor "ping-mon-l" set nat46 enable set extport 80 config realservers edit 1 set ip 2040::20 <------- server ip must be ipv6 when nat46 is enabled set port 80 next end 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 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
NAT46 Firewall Policy。
config firewall policy edit 1 set srcintf "port3" set dstintf "port2" set srcaddr "all" set dstaddr "vip1" <-- vip with nat46 enabled set srcaddr6 "all" set dstaddr6 "all" <--- both ipv4 and ipv6 addresses are required when nat46 enable set action accept set schedule "always" set service "ALL" set dnsfilter-profile "default" set ippool enable set poolname6 "ipv6_po1" <---- ipv6 pool with nat46 enabled set nat46 enable <----- new option to enable nat46 next endNAT46 Central SNAT。
config firewall central-snat-map edit 2 set srcintf "any" set dstintf "any" set orig-addr "all" set dst-addr "all" set nat46 enable <----- new option for ipv4 rule set nat-ippool6 "ipv6_po1" <---- available when nat46 is enabled, ipv6 pool with nat46 enabled next end