1. 程式人生 > >Supporting IPv6 DNS64/NAT64 Networks(審核被拒)

Supporting IPv6 DNS64/NAT64 Networks(審核被拒)

when 藍色 ssi 快速 ati 路線 技術分享 避免 阻止

全文都圍繞客戶端和服務端之間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.

App Store Review Guidelines

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服務器。

解決方案:通過DNS64 +NAT64進行訪問。

1、將域名解析出全球可達的IPv6地址。打開鏈接http://www.subnetonline.com/pages/converters/ipv4-to-ipv6.php,輸入IPv4值如100.100.100.100,計算出來的IPv4值為6464:6464,帶上固定前綴2001:67c:2b0:db32::1,組合為完整的IPv6值為2001:67c:2b0:db32::1:6464:6464。

技術分享

2、在域名管理中添加一條4A記錄。AAAA記錄(AAAA record)是用來將域名解析到IPv6地址的DNS記錄。

方案檢測:打開鏈接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、理想的是,提供商放棄支持IPv4網絡,然而這樣阻止部分網絡訪問IPv4服務器。為了解決這個問題,主流網絡提供商實現DNS64/NAT64轉換工作流。以下就是只支持IPv6網絡通過轉換繼續支持IPv4內容。

部署的IPv6蜂窩網絡包括DNS64和NAT64,如圖:

技術分享

3、這種部署類型下,客戶端發送DNS請求到DNS64服務器,請求IPv6地址。如果IPv6存在,立即回傳到客戶端。然而如果IPv6不存在,DNS64服務器請求替代的IPv4地址,然後DNS64服務器用IPv6地址前綴聯合IPv4地址,回傳給客戶端。這樣,客戶端肯定接受到的是IPv6的地址。如圖:

技術分享

4、當客戶端給服務端發送請求,任何IPv6包都視為由DNS64合成地址,走NAT64網關路線。NAT64網關可以將IPv6轉換為IPv4,服務端的響應也可以將IPv4轉換為IPv6。

DNS64/NAT64工作流如圖:

技術分享

五、確保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網絡測試環境)。

個人不建議這樣測,我司這樣測能正常訪問,但審核還是被拒。

實踐表明通過第一點的方案檢測,蘋果官方能審核通過。

本文參考自蘋果官方文檔:

Supporting IPv6 DNS64/NAT64 Networks

Supporting IPv6 DNS64/NAT64 Networks(審核被拒)