背景、如何开启NAT64的网络
背景是苹果要求应用支持 Supporting IPv6 DNS64/NAT64 Networks
1. Make sure your Mac is connected to the Internet, but not through Wi-Fi.
2. Launch System Preferences from your Dock, LaunchPad, or the Apple menu.
3. Press the Option key and click Sharing. Don’t release the Option key yet.
4. Select Internet Sharing in the list of sharing services.
5. Release the Option key.
上面的地址已经非常详细了,注意点:
- 要按住键盘上的
option 按钮去打开分享界面,才会看到 Create NAT64 Network 的选项。 - 需要有一个
连着网线 的 Mac 。
遇到的问题
我们的应用有一部分功能依赖了webrtc,需要用户端和服务端建立点对点的连接,在NAT64的网络下,看日志是客户端一直在send stun ping(stun ping 客户端向服务端发起的udp的请求),错误码是22(An incorrect argument was specified.) 拿到日志和错误码后,我拿着对应的ip和端口,模拟了同样的udp请求,错误码是51 (The network cannot be reached.)
观察了一下,mac+nat64+udp有如下表现:
只连接wifi,udp数据包发不出去
v4-wlan0 的子网掩码 Mask为 255.255.255.255
v4-wlan0 Link encap:UNSPEC
inet addr:192.0.0.4 P-t-P:192.0.0.4 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1472 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:1811 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 TX bytes:953375
有如下推论:
- 这意味着ipv4的数据包发不出本机,等于说ipv4的请求只能本地使用;
- 能发出去,但是不可访问,The network cannot be reached 51其实是对的;
- ipv4发不出去,等于tcp和udp都发不出去,切换到tcp也无济于事;
- wireshark抓到的少量ipv4的包,我理解是切换网络遗留的信息;
域名解析是是正常的
# 服务端
nc -l -u 5000
# 客户端
nc -u yeshen.org 5000
wireshare 抓包能看到如下信息:
fe80::8bf7->fe80::fa66==Standard query 0x5452 AAAA yeshen.org
fe80::fa66->fe80::8bf7==Standard query response 0x5452 AAAA yeshen.org AAAA
2001:2:0:1baa::7659:3597
fe80::8bf7->fe80::fa66==Standard query 0x0ab7 A yeshen.org
fe80::fa66->fe80::8bf7==Standard query response 0x0ab7 A yeshen.org A 118.89.53.151
我观察:
- 当我用ipv6的协议,去访问 2001:2:0:1baa::7659:3597,请求正常,服务端收到的ip包也是正常的ipv4的包;
- 快速开关/切换网络,会滞后出现无法连接 -> 我理解是DNS解析存在缓存。
我理解:
- 我的设备的ip是fe80::8bf7,询问 fe80::fa66 (mac上模拟网关bridge100),bridge100充当了dns解析的作用,返回了信息。
- nc询问了两次,query A、query AAAAA,我这个yeshen.org的域名是没有ipv6的,网关做了适配。我理解是如下适配:
1. ip地址16进制转化:118.89.53.151 -> 7659:3597
2. 增加网关前缀 `2001:2:0:1baa::`
部分VPN(我使用的)无法兼容
(观察到)
- 在NAT64下,开vpn有概率提示拉不到配置;
- 在NAT64下,开VPN,和没开差别不大,都是无法访问;
解决问题的方法
通过上面的观察,我理解解决方法有几种:
- 客户端兼容:通过dns查询到nat64网关的前缀+转化下ipv4,主动拼接一下。
- 服务端提供域名,弃用只提供ipv4的信息的方式,dns64 会自己做转化。
- 服务端主动 拼接方式1中可选的ipv6地址,客户端逐一尝试。
讨论
最后讨论一点,2001:2:0:1baa:: 这个前缀是不是所有苹果NAT64都公用的前缀? 目前我的两部电脑+同事的电脑+网络搜到的问题 ,基本上都是这个前缀. 不知道苹果审核是不是也是如此?
|