DNS64/NAT64 Networks(解决IPv6审核被拒)
全文都围绕客户端和服务端之间IPv4与IPv6互转。
一、问题引出
We discovered one or more bugs in your app when reviewed on iPad running iOS 10.3.2 on Wi-Fi connected to an IPv6 network.
Specifically, tapping some buttons produced an error message.
Please see attached screenshots for details.
Next Steps
To resolve this issue, please run your app on a device while connected to an IPv6 network (all apps must support IPv6) to identify any issues, then revise and resubmit your app for review.
If we misunderstood the intended behavior of your app, please reply to this message in Resolution Center to provide information on how these features were intended to work.
For new apps, uninstall all previous versions of your app from a device, then install and follow the steps to reproduce the issue. For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue.
2.5.5 We will be reviewing on an IPv6 network, so if your app isn’t compatible with the IPv6 addressing, it may fail during review.
问题分析:我司APP没有IPv6环境服务器,且未支持NAT64+DNS64服务。导致IPv6网络下客户端找不到IPv6服务器,且无法转换连接到IPv4服务器。
1、解决方案:通过DNS64 +NAT64进行访问。
1)将域名解析出全球可达的IPv6地址。打开链接http://www.subnetonline.com/pages/converters/ipv4-to-ipv6.php,输入IPv4值如100.100.100.100,计算出来的IPv6值为6464:6464,带上固定前缀2001:67c:2b0:db32::1,组合为完整的IPv6值为2001:67c:2b0:db32::1:6464:6464。
2)在域名管理中添加一条4A记录。AAAA记录(AAAA record)是用来将域名解析到IPv6地址的DNS记录。
2、方案检测:打开链接http://ipv6-test.com/validate.php,输入域名,结果如下图,则代表操作成功。
二、IPv6、DNS64、NAT64
1、IPv6
1)IPv6是互联网协议版本6(Internet Protocol Version 6),IPv6用于替代IPv4,号称可以为全世界的每一粒沙子编上一个网址。
2)表示方法
IPv4包含4段十进制,IPv6包含8段十六进制,是IPv4地址长度的4倍。于是IPv4点分十进制格式不再适用,IPv6有3种表示方法:
冒分十六进制表示法
格式为X:X:X:X:X:X:X:X,其中每个X表示地址中的16b,以十六进制表示,每个X的前导0是可以省略的,例如:
2001:0DB8:0000:0023:0008:0800:200C:417A→ 2001:DB8:0:23:8:800:200C:417A
0位压缩表示法
如果IPv6地址中包含很长的一段0,可以把连续的一段0压缩为“::”。同时为保证地址解析的唯一性,地址中”::”只能出现一次,例如:
FF01:0:0:0:0:0:0:1101 → FF01::1101
0:0:0:0:0:0:0:1 → ::1
0:0:0:0:0:0:0:0 → ::
内嵌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位的方法依旧适用 。
2、NAT64
NAT64是一种有状态的网络地址与协议转换技术,一般只支持通过IPv6网络侧用户发起连接访问IPv4侧网络资源。但NAT64也支持通过手工配置静态映射关系,实现IPv4网络主动发起连接访问IPv6网络。NAT64可实现TCP、UDP、ICMP协议下的IPv6与IPv4网络地址和协议转换。
3、DNS64
DNS64则主要是配合NAT64工作,主要是将DNS查询信息中的A记录(IPv4地址)合成到AAAA记录(IPv6地址)中,返回合成的AAAA记录用户给IPv6侧用户。
三、为什么用IPv6?
1、IPv4地址有限正在耗尽。
2、IPv6比IPv4更有效。避免使用NAT转换网络地址,通过简化头部结构提供网络快速通道,阻止网络分裂,避免解析邻居地址。
3、4G支持IPv6网络。
4、多媒体服务(短信、语音)支持IPv6网络。
5、服务提供商承担额外的业务和管理成本,继续支持传统的IPv4网络,而行业继续迁移到IPv6。
四、DNS64/NAT64转换流
1、蜂窝网络单独提供IPv4和IPv6连接。
2、DNS64/NAT64转换工作流
理想的是,提供商放弃支持IPv4网络,然而这样阻止部分网络访问IPv4服务器。为了解决这个问题,主流网络提供商实现DNS64/NAT64转换工作流。以下就是只支持IPv6网络通过转换继续支持IPv4内容。
部署的IPv6蜂窝网络包括DNS64和NAT64
3、DNS64 server负责域名解析到IPv6
DNS64/NAT64这种部署类型下。客户端请求IPv6地址流程是:
1)DNS64服务器向DNS server发送请求IPv6地址,如果IPv6存在,立即回传到DNS64然后回传给客户端。
2)如果DNS server不存在IPv6,DNS64服务器向DNS server请求替代的IPv4地址。然后DNS64服务器用IPv6地址前缀联合IPv4地址,回传给客户端。
因此,客户端最终都能接收到到IPv6的地址。
4、NAT64负责IPv6和IPv4互转
当客户端访问某域名内容,通过DNS64 server解析成IPv6地址/IPv6合成地址。如果是IPv6地址,直接访问IPv6环境服务器。如果是IPv6合成地址,走NAT64网关,换算成IPv4地址,访问IPv4环境服务器。
五、确保IPv6 DNS64/NAT64可用
1、不建议使用底层的网络API。下图展示的蓝色部分的这些API都是不存在兼容性问题的,而我们平时自己用的包括那些第三方的网络库大部分都是用的这些API。
2、不要用IP地址。网络类中一些方法传入值不要传IP地址,而应该用域名。
3、检查不兼容IPv6的代码
工程中不能包括下面这些API,这些都是只针对IPv4做处理的。
inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()
如果用到了下面左边的这些IPv4的类型,那么它们相应的IPv6类型也需要做处理
六、IPv6网络APP测试
官网提供了通过mac共享,创建NAT64网络来搭建IPv6网络(操作教程戳iOS-不用网线搭建IPv6网络测试环境)。
个人不建议这样测,我司这样测能正常访问,但审核还是被拒。
实践表明通过第一点的方案检测,苹果官方能审核通过。
本文参考自苹果官方文档: