最近团队开发的APP提交到苹果APP store时被拒了,原因是不支持IPv6的访问。原来苹果App store从2016年6月开始强制新上线APP支持IPv6网络,但由于IPv6基础设施在国内的推广非常缓慢,因此导致了该问题。

IPv6介绍

为了理解IPv6需要先了解其产生的原因,就是IPv4地址资源的问题。IPv4的网络使用32位的地址空间(XX.XX.XX.XX),因此最大支持的数量是4,294,967,296(2^32个),其中还有1800多万个私有地址和2.7亿个多播地址。互联网的发展显然超出了普通的32位地址空间的容量,IPv6地址使用128位的地址空间,这意味着几乎取之不尽的地址空间。另外IPv6比IPv4还进行了很多的改进与扩充。

IPv6地址

  1. 冒分16进制表示法(XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX),每个部分中的0可以省略。比如:2001:0DB8:0000:0023:0008:0800:200C:417A 可以缩写为2001:DB8:0:23:8:800:200C:417A

  2. 0位压缩。如果地址中包含很多连续的0,可以把0压缩为”::“,并且”::“只能出现1次。 比如 FF01:0:0:0:0:0:0:1101 可以缩略为 FF01::1101

  3. 内嵌IPv4地址表示法。为了实现IPv4-IPv6互通,IPv4地址会嵌入IPv6地址中,此时地址常表示为:X:X:X:X:X:X:d.d.d.d,前96b采用冒分十六进制表示,而最后32b地址则使用IPv4的点分十进制表示,例如::192.168.0.1与::FFFF:192.168.0.1就是两个典型的例子,注意在前96b中,压缩0位的方法依旧适用。

IPv6地址分类

地址类型 IPv4 IPv6
单播(unicast) Yes Yes
组播(multicast) Yes Yes
任播(anycast) No Yes
广播 Yes No (通过组播来达到类似目的)

IPv6的地址类型通过地址的前缀进行区别

IPv6地址类型 前缀标识
Loopback (unicast) ::1128
Link local (unicast) FE80::/10
Site local (unicast) FEC0::/10
Global (unicast)
multicast FF00::/8
anycast 从单播地址空间中分配

IPv4 vs IPv6

IPv6比IPv4的优势: 1. IPv6具有更大的地址空间。IPv4中规定IP地址长度为32,最大地址个数为2^32;而IPv6中IP地址的长度为128,即最大地址个数为2^128。与32位地址空间相比,其地址空间增加了2^128-2^32个。

  1. IPv6使用更小的路由表。IPv6的地址分配一开始就遵循聚类(Aggregation)的原则,这使得路由器能在路由表中用一条记录(Entry)表示一片子网,大大减小了路由器中路由表的长度,提高了路由器转发数据包的速度。

  2. IPv6增加了增强的组播(Multicast)支持以及对流的控制(Flow Control),这使得网络上的多媒体应用有了长足发展的机会,为服务质量(QoS,Quality of Service)控制提供了良好的网络平台。

  3. IPv6加入了对自动配置(Auto Configuration)的支持。这是对DHCP协议的改进和扩展,使得网络(尤其是局域网)的管理更加方便和快捷。

  4. IPv6具有更高的安全性。在使用IPv6网络中用户可以对网络层的数据进行加密并对IP报文进行校验,在IPV6中的加密与鉴别选项提供了分组的保密性与完整性。极大的增强了网络的安全性。

  5. 允许扩充。如果新的技术或应用需要时,IPV6允许协议进行扩充。

  6. 更好的头部格式。IPV6使用新的头部格式,其选项与基本头部分开,如果需要,可将选项插入到基本头部与上层数据之间。这就简化和加速了路由选择过程,因为大多数的选项不需要由路由选择。

  7. 新的选项。IPV6有一些新的选项来实现附加的功能[14] 。

阿里ECS EIP 服务IPv6支持方法

6in4隧道方式

6in4的方法是将IPv6的数据包包裹在IPv4的数据包中在IPv4的网络上传输,并通过IPv4/IPv6的网络交界处部署的tunnel broker进行疯转转发,基本工作原理如下: * IPv6网络上的客户端对服务进行访问时发送IPv6数据包,数据包到达tunnel broker的服务器端,broker将数据包进行IPv4的封装通过隧道发送到你的IPv4服务器端,在隧道的另一端进行IPv6数据包的应用层处理。 * 你的服务器收到数据包进行应用层处理后将相应数据包进行IPv6封装,再通过隧道包裹成IPv4的数据报文进行隧道传输,当数据包抵达IPv4/IPv6的网络交界处的tunnel broker时,tunnel broker将IPv6的包解析出来在IPv6的网络上进行传递到达IPv6的客户端。

下面我们以6in4的方式对阿里云ECS服务器上使用EIP的服务进行IPv6改造。

1. 创建tunnel

tunnelbroker注册账号,并且创建一个新的常规(Regular) tunnel。创建时候需要在’IPv4 Endpoint’栏填入服务器的公网IPv4地址,并在’Available Tunnel Servers’中选择一个适合自己的服务器区域,过程如下图: 创建tunnel

创建完成后的tunnel包含了几个重要的信息: * Server IPv4 Address: 这个是tunnel服务端的IPv4地址,创建tunnel的时候需要用到。 * Server IPv6 Address: 这个是tunnel的服务端IPv6地址。 * Client IPv4 Address: 这个是tunnel客户端的IPv4地址。 * Client IPv6 Address: 这个地址需要设置在CentOS服务器的tunnel上面,也是后面DNS服务器需要设置的AAAA记录对应的地址。 tunnel详情

2. 解除阿里云主机IPv6限制

阿里云的CentOS主机默认状态下是把IPv6给禁掉的,可以使用下面的脚本先把系统的IPv6功能打开。

 1#!/bin/sh
 2
 3mkdir ipv6
 4mv /etc/modprobe.d/disable_ipv6.conf ipv6/
 5modprobe ipv6
 6
 7cp /etc/sysctl.conf ipv6/
 8cat /etc/sysctl.conf | sed -e 's/disable_ipv6 = 1/disable_ipv6 = 0/' >
 9/etc/.sysctl.conf.bak
10mv -f /etc/.sysctl.conf.bak /etc/sysctl.conf
11sysctl -p /etc/sysctl.conf

完成上面配置后可以用’ifconfig’检验一下网络接口,如果出现’inet6’类型的信息说明配置已经生效。

3. 配置CentOS服务器端tunnel

这里顺带介绍一下Linux支持的几种隧道: * IP隧道:通过将IPv4数据包封装进另一个IPv4数据包中进行发送,实现两个互不连通的IP网络之间的连接。但是不能通过隧道进行广播或者IPv6数据包的发送。 * SIT隧道:将IPv6数据包封装进IPv4数据包中,对应6in4的场景。 * GRE隧道:最初是由cisco开发的隧道协议,能够进行多播及IPv6数据包的发送。

这次主要介绍”SIT”隧道的方案。现在需要用到上面创建tunnel时的’Server IPv4 Address’/‘Client IPv4 Address’/‘Client IPv6 Address’,在你的ECS主机上面运行下面的命令:

1ip tunnel add he-ipv6 mode sit remote [Server IPv4 Address] local [Client IPv4 Address] ttl 255
2ip link set he-ipv6 up
3ip addr add [Client IPv6 Address]/64 dev he-ipv6
4ip route add ::/0 dev he-ipv6
5ip -f inet6 addr

完成这一步后已经可以对’[Client IPv6 Address]‘进行访问了,可以通过’ping6’或者’curl’进行验证。

1# ping6 [Client IPv6 Address]
2# curl --globoff -6 [Client IPv6 Address]

4. 设置DNS AAAA记录

大家熟悉的A记录是DNS中IPv4的对应地址,相应的IPv6地址叫AAAA记录。设置成功后就可以直接用DNS进行访问了。

1# ping6 [Client IPv6 DNS name]
2# curl --globoff -6 [Client IPv6 DNS name]

附录

IPv4私有地址

RFC1918 规定区块名 IP地址区段 IP数量 分类网络说明 最大CIDR区块(子网络遮罩) 主机端位长
24位区块 10.0.0.0 – 10.255.255.255 16,777,216 单个A类网络 10.0.0.0/8(255.0.0.0) 24位
Shared Address Space 100.64.0.0 - 100.127.255.255 4,194,304 64个连续B类网络 100.64.0.0/10 (255.192.0.0) 22位
20位区块 172.16.0.0 – 172.31.255.255 1,048,576 16个连续B类网络 172.16.0.0/12(255.240.0.0) 20位
16位区块 192.168.0.0 – 192.168.255.255 65,536 256个连续C类网络 192.168.0.0/16(255.255.0.0) 16位

参考资料