NAT64+DNS64上网

网络需求

内网用户为IPv6网络,Internet网络为IPv4网络,内部IPv6用户通过NAT64+DNS64访问IPv4的Internet网络。

网络拓扑

image-20230904094527306

  1. Client侧为IPv6,Server侧为IPv4,FortiGate做NAT64+DNS64转换,内部IPv6用户通过NAT64+DNS64访问IPv4的Internet网络。
  2. 配置IPv6 Client的IPv6为2100::2/64,IPv6网关配置为2100::1,FortiGate内网口lan的IPv6为2100::1/64。
  3. 配置FortiGate外网口wan1的IP为10.10.12.2/24,默认路由指向IPv4 Internet 10.10.12.1。

配置步骤

NAT64配置

  1. 创建VIP,选择类型为IPv6,“外部IP地址/范围”填写IPv6 VIP地址,“映射到”选择Use Embedded,这里填写的IPv6地址范围要写96位的IPv6前缀(注意不要配置和接口IPv6地址相同的网段),最后32位范围为0.0.0.0~255.255.255.255的16进制格式,用于映射所有的IPv4地址。

    image-20230901173501916

    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
    
  2. 可以看默认存在一个naf.root接口,用于处理NAT64流量,创建VIP完成后,如果开启了add-nat64-route(默认开启),针对naf.root接口生成去往VIP IPv6地址的路由,关闭add-nat64-route后,该路由会消失。

    image-20230106150223599

    image-20230901173808955

  3. 创建IPv4 Pool,配置地址池范围,配置地址池范围,注意不要和wan1地址冲突,开启NAT64后,须填写为一个完整的subnet(最小32位)的IPv4地址范围。

    image-20230901173952920

    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
    
  4. 创建完成后,如果开启了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)
    
  5. 创建防火墙策略,先在NAT选项中开启NAT64,在源地址中引用IPv6的all,然后在目标地址中引用VIP,在IP池配置中引用IPPool。

    image-20230901174228776

    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配置

  1. 在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
    
    • 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
  2. 在lan口上开启DNS服务器,IPv6网络侧用户发起AAAA Record查询,FortiGate的DNS64代理请求IPv4网络中对应FQDN的A Record,得到A Record响应后,DNS64服务器将A Record响应中的IPv4地址嵌入dns64-prefix的后32位中,然后封装为IPv6的AAAA Record回应,返回给IPv6客户端。

    image-20230901181511230

    config system dns-server
        edit "lan"
        next
    end
    
  3. 为系统配置IPv4 DNS服务器(也可以使用默认服务器)。

    image-20230901181626132

    config system dns
        set primary 223.5.5.5
    end
    

结果验证

  1. IPv6 Client访问IPv4 Internet域名,抓包查看DNS64过程,客户端发出IPv6的AAAA请求,请求域名www.fortinet.com 的AAAA Record。

    image-20230901192542429

  2. FortiGate将此AAAA Record请求转换为A Record请求封装在IPv4 DNS中,发送给DNS服务器223.5.5.5。

    image-20230901192635971

  3. DNS服务器使用IPv4 DNS返回该域名的A Record IPv4地址52.220.222.172。

    image-20230901192823624

  4. FortiGate收到DNS返回的该域名的A Record IPv4地址52.220.222.172转换为16进制后将其嵌入dns64-prefix 2100::/96的后32位中,变为2200::34dc:deac,将其转换为AAAA Record,并封装在IPv6 DNS报文中返回给IPv6 Client。

    image-20230901193109543

  5. 客户端收到FortiGate发送的AAAA Record回应后,解析到www.fortinet.com 的IPv6 IP为2200::34dc:deac,所以直接访问该IPv6地址,FortiGate从lan口收到该IPv6请求包。

    image-20230901194042402

  6. 该IPv6请求包经由FortiGate的naf接口,执行NAT64转换。

    image-20230901194152876

  7. 经由FortiGate的naf接口进行NAT64后,转换为IPv4报文,源地址为NAT64的地址池中的IPv4地址,目标地址为原IPv6请求包目标IPv6地址2200::34dc:deac的最后32位转换为10进制后的IPv4地址52.220.222.172。

    image-20230901194407505

  8. 最终由wan1接口发出送往Internet上的目的IPv4地址。

    image-20230901194529638

  9. 服务器Reply的IPv4报文从FortiGate的wan1收到,经由naf接口做NAT64还原后,从lan口返回IPv6 Client。

    image-20230901194737774

  10. 查看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
    
  11. 查看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
    
  12. IPv6客户端可以正常访问IPv6的服务器。

    image-20230901194915159

    image-20230901195039438

附件

附NAT64+DNS64过程抓取的报文:dns64.pcapng

Copyright © 2024 Fortinet Inc. All rights reserved. Powered by Fortinet TAC Team.
📲扫描下方二维码分享此页面👇
该页面修订于: 2024-03-14 11:23:55

results matching ""

    No results matching ""