NAT64+DNS64上网
组网需求
内网用户为IPv6网络,Internet网络为IPv4网络,内部IPv6用户通过NAT64+DNS64访问IPv4的Internet网络。
网络拓扑
- Client侧为IPv6,Server侧为IPv4,FortiGate做NAT64+DNS64转换,内部IPv6用户通过NAT64+DNS64访问IPv4的Internet网络。
- 配置IPv6 Client的IPv6为2100::2/64,IPv6网关配置为2100::1,FortiGate内网口lan的IPv6为2100::1/64。
- 配置FortiGate外网口wan1的IP为10.10.12.2/24,默认路由指向IPv4 Internet 10.10.12.1。
配置步骤
NAT64配置
创建VIP,选择类型为IPv6,“外部IP地址/范围”填写IPv6 VIP地址,“映射到”选择Use Embedded,这里填写的IPv6地址范围要写96位的IPv6前缀(注意不要配置和接口IPv6地址相同的网段),最后32位范围为0.0.0.0~255.255.255.255的16进制格式,用于映射所有的IPv4地址。
config firewall vip6 edit "NAT64_DNS64" set uuid f913176c-48aa-51ee-62dd-5d5b772dede2 set extip 2200::-2200::ffff:ffff set nat66 disable set nat64 enable set embedded-ipv4-address enable next end
可以看默认存在一个naf.root接口,用于处理NAT64流量,创建VIP完成后,如果开启了add-nat64-route(默认开启),针对naf.root接口生成去往VIP IPv6地址的路由,关闭add-nat64-route后,该路由会消失。
创建IPv4 Pool,配置地址池范围,配置地址池范围,注意不要和wan1地址冲突,开启NAT64后,须填写为一个完整的subnet(最小32位)的IPv4地址范围。
config firewall ippool edit "NAT64_DNS64" set startip 10.10.12.128 set endip 10.10.12.255 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.12.128/25 pref=0.0.0.0 gwy=0.0.0.0 dev=37(naf.root)
创建防火墙策略,先在NAT选项中开启NAT64,在源地址中引用IPv6的all,然后在目标地址中引用VIP,在IP池配置中引用IPPool。
config firewall policy edit 9 set name "NAT64_DNS64" set srcintf "lan" set dstintf "wan1" set action accept set nat64 enable set srcaddr "all" set dstaddr "all" set srcaddr6 "all" set dstaddr6 "NAT64_DNS64" set schedule "always" set service "ALL" set ippool enable set poolname "NAT64_DNS64" next end
DNS64配置
在CLI下开启DNS64,配置dns64-prefix为NAT64 VIP的前96位2200::/96,确认always-synthesize-aaaa-record为开启状态(默认开启)。
config system dns64 set status enable set dns64-prefix 2200::/96 set always-synthesize-aaaa-record enable end
always-synthesize-aaaa-record:
- enable:默认配置,所有从IPv6客户端发送的DNS AAAA Record请求会被FortiGate无条件转换为A Record请求,通过IPv4 DNS发送至系统配置的DNS服务器(不会发送AAAA请求),IPv4 DNS服务器返回A Record后,将A Record中的IPv4地址嵌入dns64-prefix的后32位中,然后封装为IPv6的AAAA Record回应,返回给IPv6客户端。
- disable:所有从IPv6客户端发送的DNS AAAA Record请求首先会被FortiGate封装在IPv4的DNS报文中发送至系统配置的DNS服务器:
- 如果DNS服务器返回了AAAA Record,FortiGate将此AAAA Record回应封装为IPv6 DNS返回给IPv6客户端(这里返回的AAAA Record为原服务器响应的IPv6,FortiGate不做任何修改)。
- 如果DNS服务器返回的DNS报文中没有AAAA Record的IPv6地址或没有响应DNS请求,FortiGate会执行always-synthesize-aaaa-record enable时相同的操作,向DNS服务器发送A Record请求的IPv4 DNS报文,IPv4 DNS服务器返回A Record后,将A Record中的IPv4地址嵌入dns64-prefix的后32位中,然后封装为IPv6的AAAA Record回应,返回给IPv6客户端。
- 当always-synthesize-aaaa-record配置为disable时,DNS服务器返回的AAAA Record会被FortiGate不经修改直接返回给IPv6客户端,客户端访问此IPv6时,可能不在NAT64 VIP的IPv6地址范围中,导致被FortiGate丢弃,所以建议always-synthesize-aaaa-record的配置保持默认开启,不要关闭。
- 关于always-synthesize-aaaa-record的说明请参考官方文档:https://docs.fortinet.com/document/fortigate/7.99.99/administration-guide/443324/nat64-policy-and-dns64-dns-proxy 。
在lan口上开启DNS服务器,IPv6网络侧用户发起AAAA Record查询,FortiGate的DNS64代理请求IPv4网络中对应FQDN的A Record,得到A Record响应后,DNS64服务器将A Record响应中的IPv4地址嵌入dns64-prefix的后32位中,然后封装为IPv6的AAAA Record回应,返回给IPv6客户端。
config system dns-server edit "lan" next end
为系统配置IPv4 DNS服务器(也可以使用默认服务器)。
config system dns set primary 223.5.5.5 end
结果验证
IPv6 Client访问IPv4 Internet域名,抓包查看DNS64过程,客户端发出IPv6的AAAA请求,请求域名www.fortinet.com 的AAAA Record。
FortiGate将此AAAA Record请求转换为A Record请求封装在IPv4 DNS中,发送给DNS服务器223.5.5.5。
DNS服务器使用IPv4 DNS返回该域名的A Record IPv4地址52.220.222.172。
FortiGate收到DNS返回的该域名的A Record IPv4地址52.220.222.172转换为16进制后将其嵌入dns64-prefix 2100::/96的后32位中,变为2200::34dc:deac,将其转换为AAAA Record,并封装在IPv6 DNS报文中返回给IPv6 Client。
客户端收到FortiGate发送的AAAA Record回应后,解析到www.fortinet.com 的IPv6 IP为2200::34dc:deac,所以直接访问该IPv6地址,FortiGate从lan口收到该IPv6请求包。
该IPv6请求包经由FortiGate的naf接口,执行NAT64转换。
经由FortiGate的naf接口进行NAT64后,转换为IPv4报文,源地址为NAT64的地址池中的IPv4地址,目标地址为原IPv6请求包目标IPv6地址2200::34dc:deac的最后32位转换为10进制后的IPv4地址52.220.222.172。
最终由wan1接口发出送往Internet上的目的IPv4地址。
服务器Reply的IPv4报文从FortiGate的wan1收到,经由naf接口做NAT64还原后,从lan口返回IPv6 Client。
查看IPv6会话,如下所示,会话没有被NP加速,流量均经过naf接口处理,naf标记为1。
FortiGate # diagnose sys session6 list session6 info: proto=58 proto_state=00 duration=110 expire=59 timeout=0 flags=00000000 sockport=0 socktype=0 use=3 origin-shaper= reply-shaper= per_ip_shaper= class_id=0 ha_id=0 policy_dir=0 tunnel=/ vlan_cos=0/0 state=may_dirty npu npd statistic(bytes/packets/allow_err): org=6160/110/0 reply=6160/110/0 tuples=2 tx speed(Bps/kbps): 54/0 rx speed(Bps/kbps): 56/0 orgin->sink: org pre->post, reply pre->post dev=45->37/37->45 hook=pre dir=org act=noop 2100::2:33956->2200::34dc:deac:128(:::0) hook=post dir=reply act=noop 2200::34dc:deac:33956->2100::2:129(:::0) peer=10.10.12.130:30184->52.220.222.172:8 naf=1 hook=pre dir=org act=noop 10.10.12.130:30184->52.220.222.172:8(0.0.0.0:0) hook=post dir=reply act=noop 52.220.222.172:30184->10.10.12.130:0(0.0.0.0:0) src_mac=0c:37:96:06:d7:5d misc=0 policy_id=9 pol_uuid_idx=587 auth_info=0 chk_client_info=0 vd=0 serial=0000a1d7 tos=ff/ff ips_view=0 app_list=0 app=0 url_cat=0 rpdb_link_id=00000000 ngfwid=n/a npu_state=0x4040000 npu info: flag=0x81/0x00, offload=0/0, ips_offload=0/0, epid=0/0, ipid=95/0, vlan=0x0000/0x0000 vlifid=0/0, vtag_in=0x0000/0x0000 in_npu=0/0, out_npu=0/0, fwd_en=0/0, qid=0/0 no_ofld_reason: offload-denied FortiGate # diagnose netlink interface list | grep naf if=naf.root family=00 type=65535 index=37 mtu=1500 link=0 master=0
查看IPv4会话,如下所示,会话没有被NP加速,流量均经过naf接口处理,naf标记为2。
FortiGate # diagnose sys session list session info: proto=1 proto_state=00 duration=1 expire=59 timeout=0 flags=00000000 socktype=0 sockport=0 av_idx=0 use=3 origin-shaper= reply-shaper= per_ip_shaper= class_id=0 ha_id=0 policy_dir=0 tunnel=/ vlan_cos=0/255 state=may_dirty npu statistic(bytes/packets/allow_err): org=72/2/1 reply=72/2/1 tuples=2 tx speed(Bps/kbps): 57/0 rx speed(Bps/kbps): 57/0 orgin->sink: org pre->post, reply pre->post dev=37->7/7->37 gwy=10.10.12.1/10.10.12.130 hook=pre dir=org act=noop 10.10.12.130:30184->52.220.222.172:8(0.0.0.0:0) hook=post dir=reply act=noop 52.220.222.172:30184->10.10.12.130:0(0.0.0.0:0) peer=2200::34dc:deac:33956->2100::2:129 naf=2 hook=pre dir=org act=noop 2100::2:33956->2200::34dc:deac:128(:::0) hook=post dir=reply act=noop 2200::34dc:deac:33956->2100::2:129(:::0) misc=0 policy_id=9 pol_uuid_idx=587 auth_info=0 chk_client_info=0 vd=0 serial=000ecb4f tos=ff/ff app_list=0 app=0 url_cat=0 rpdb_link_id=00000000 ngfwid=n/a npu_state=0x4040000 npu info: flag=0x00/0x00, offload=0/0, ips_offload=0/0, epid=0/0, ipid=0/0, vlan=0x0000/0x0000 vlifid=0/0, vtag_in=0x0000/0x0000 in_npu=0/0, out_npu=0/0, fwd_en=0/0, qid=0/0 no_ofld_reason: FortiGate # diagnose netlink interface list | grep naf if=naf.root family=00 type=65535 index=37 mtu=1500 link=0 master=0
IPv6客户端可以正常访问IPv6的服务器。
附件
附NAT64+DNS64过程抓取的报文:dns64.pcapng。