单位提供的拨号连接,本身是提供 IPv6 地址的,这一点在 Windows 上得以证实,拨号即可自动配置 IPv6。但是将网线连接到 Mac 上进行拨号连接时,却无论如何也无法获取 IPv6 地址。
在使用 Wireshark 进行检查后,确认 macOS 是可以正确无误地收到 IPv6 路由通告数据包的,数据包中也提供了 64 位前缀,但是不知为何 macOS 从上古时代至今一直没有处理好拨号连接的 IPv6 配置问题。在网上搜索还可以搜到 10 年前相同的问题。
在苹果官网社区中找到了此问题的讨论,有位用户提供了一个相当有用的脚本。这个脚本做的事情就是监听 PPPoE 连接中的 ICMPv6 数据包,并从中提取出通告的前缀,构造一个合法的 IPv6 地址,手动配置到 PPPoE 连接上,并添加一条 IPv6 默认路由。
经过测试,在我的网络环境下,在建立 PPPoE 连接时,只接收到了一个 ICMPv6 数据包,原本的脚本设置监听两个数据包,在我的网络环境中不适用,所以略作修改,只监听一个,修改后测试通过。同时我额外增加了过滤条件,限定只监听路由通告数据包,这样可以避免其他数据包的干扰。
#!/bin/sh
PREFIXINFO=`/usr/sbin/tcpdump -v -i $IFNAME -c 1 icmp6 and 'ip6[40] = 134' | grep prefix`
PREFIX=`echo $PREFIXINFO|cut -f2- -d:|cut -f1 -d/|cut -c2-`
PREFIXLEN=`echo $PREFIXINFO|cut -f2 -d/|cut -f1 -d,`
ADDR="cafe"
/sbin/ifconfig $IFNAME inet6 ${PREFIX}${ADDR}/$PREFIXLEN
/sbin/route add -inet6 default -interface $IFNAME
将以上脚本放置在 /etc/ppp/
目录下,并命名为 ip-up
,之后不要忘记添加可执行权限 sudo chmod +x /etc/ppp/ip-up
。再次测试 PPPoE 连接,由于第一个路由通告包在 tcpdump
运行之前已经发送过了,所以需要耐心等到第二个路由通告包发来才能将 IPv6 配置成功,此过程可能需要 1-10 分钟不等时间,具体时长取决于你的运营商的配置。
PS:目前在获取到 IPv6 地址之后仍有一个问题,macOS 并没有为该网络添加 IPv6 标识,以致系统并不会去解析域名的 IPv6 地址,目前还暂未找到好的解决办法,考虑到目前可用的 IPv6 网站并不多,可暂时使用本地 hosts 的方法使用 IPv6 网站。
参考链接:https://discussions.apple.com/thread/4294034?answerId=23474747022#23474747022