由于之前的工作原因接触到了 Citrix 设备的 IPv6 to IPv4 配置,得空找了一天时间把相同效果也在 F5 设备上重现一次,比较异同。

实验目的

利用业务现有的 IPv4 DNS 服务器和 F5,把 IPv6 客户端的请求负载到业务现有的 IPv4 服务器上,有两点要求:

  • 不改动现有业务服务器的架构,兼容已有 IPv4 应用;
  • 新上线 IPv4 应用,能自动完成 IPv6 部署,不需额外配置;

实验原理

IPv6地址

IPv6 地址共有 128 位,最后 32 位通过进制转换可以用来代表一个完整的 IPv4 地址,如:

IPv6地址 2408:bb25:3585:649b:1:0:c0a8:b6e 最后 32 位为 c0a8:b6e

十六进制c0a80b6e
十进制19216811110

即最后32位可以代表 IPv4 地址 192.168.11.110 。

DNS64

F5 收到 DNS 请求后,向后端的 DNS 服务器请求对应 A 记录;收到 A 记录后,将其中的 IPv4 地址加上 96 位 IPv6 前缀,形成 AAAA 记录返回给客户端。

NAT64

F5 收到目的地址为特定前缀的 IPv6 地址的请求时,取该地址最后 32 位为负载后的 IPv4 目的地址,处理请求。

实验拓扑

图中央的 IPv6 客户端通过域名,telnet 到左边 IPv4 Server 区域的路由器 R1 和 R2

具体过程如下:

  1. IPv6 客户端发起 DNS 请求,请求解析 r2.yangbin64test.com
  2. F5 收到 DNS 请求,向 DNS 服务器请求 A 记录
  3. DNS 服务器返回 A 记录 172.28.1.2
    F5 使用预配置的 96 位地址前缀 2408:bb25:3585:649b:1::/96 ,拼接成 AAAA 记录 2408:bb25:3585:649b:1:0:ac1c:102 返回给客户端
  4. 客户端收到域名 r2.yangbin64test.com 的 AAAA 记录,向该地址发起连接
  5. F5 收到连接请求,将 IPv6 地址最后 32 位取出作为负载后目的地址
  6. F5 将该连接后续返回的 IPv4 数据包再转换成 IPv6 返回给客户端;

环境配置

F5 VE

本实验使用 F5 VE V16 版本,配置 DNS64 和 NAT64 必要的功能 license 有:

  • DNS(GTM)
  • CGNAT

导入 F5 VE 的 ovf 模版时,建议:

  • 选择 8G 及以上内存配置
  • 虚拟机第一张网卡选仅主机模式,该网卡会作为管理口
  • 虚拟机其他网卡按需选择模式,按顺序为 1.1,1.2,1.3 接口

Vlan 和 Self IP 配置

Vlan:

  • outside_6
    绑定接口 1.1
  • inside_4
    绑定接口 1.2

Self IP:

  • outside
    2408:bb25:3585:649b:0:0:0:2/64
  • outside-linklocal
    fe80:0:0:0:20c:29ff:fe84:eadc/64
  • inside
    192.168.11.232/24

F5 路由

default_v6

  • ::/0
  • 2408:bb25:3585:649b:0:0:0:1

default_v4

  • 0.0.0.0/0
  • 192.168.11.1

inside_route

  • 172.28.0.0/16
  • 192.168.11.108

路由器配置

IP为图上所示,这里主要说一下各设备路由条目

R1:
ip route 0.0.0.0 0.0.0.0 192.168.11.1   #IPv4网关不是F5
ip route 192.168.12.0 255.255.255.0 192.168.11.232 #LSN pool
R2:
ip route 0.0.0.0 0.0.0.0 172.28.1.1

R3 默认路由指向公网出口

DNS64 配置

这部分完全依照官方文档 Configuring DNS64
本实验 F5 DNS Listener VIP 为 2408:bb25:3585:649b:0:0:0:4

NAT64 配置

这部分参考官方文档 Using NAT64 to Map IPv6 Addresses to IPv4 Destinations

文档中一些步骤需要作如下补充:

  • Creating a NAT64 LSN pool
    LSN pool 用来负责 NAT64 之后与服务端的连接,在 F5 V16 版本中,要先在 CGNAT的 Option 中,勾选 Legacy LSN Pools Editor,才能配置 LSN pool
    本实验中 LSN pool 使用 192.168.12.0/24
  • Creating a NAT64 virtual server for an LSN pool
    该步骤中第五点,Destination Address,即 VS 的目的地址,在V16中不能直接配置 Network
    需要在 Shared Objects > Address Lists 中,预先定义好网段
    本实验中 NAT64 VS 入口网段为 2408:bb25:3585:649b:1::/96

测试域名准备

测试域名使用yangbin64test.com
新建如下A记录

  • r1.yangbin64test.com 172.28.1.1
  • r2.yangbin64test.com 172.28.1.2
  • r2new.yangbin64test.com 172.28.1.3
    确保使用公众 DNS 能正常解析

测试过程

  • 在纯 IPv6 客户端上,将系统 DNS 设置为 2408:bb25:3585:649b:0:0:0:4 ,解析两个测试域名,结果如下:
  • 继续分别 telnet 两个域名,查看是否能够登陆路由器,结果如下:
  • 将 R2 的 Gi0/0 接口地址改为 172.28.1.3, 在纯 IPv6 客户端上 telnet r2new.yangbin64test.com ,结果如下:

总结

至此, F5 BIG-IP 上 DNS64 和 NAT64 的配置与测试完成。

实际业务场景下,还需要注意:

  • 对现有域名系统的 NS 记录作变更(指向 F5 Listener VIP),如此便不需要客户端再指定LDNS;
  • 原有业务逻辑涉及SSL的部分仍然需要单独处理,这里不再展开。

DNS64 和 NAT64 依然比不上原生单/双栈的性能 (参考 RFC 6145),从应用角度出发,IPv6 不仅仅是简单扩展了地址空间,还能给开发和基础架构带来全新的设计思路。

扩展阅读

Large Scale NAT64

闲谈IPv6系列文章集锦