2010年6月15日星期二

“Making IPv6 access available” 文章补遗,解决 IPv4 解析优先于 IPv6 问题

两个月之前我写了一篇关于用 IPv6 浏览 Google 被封服务的文章,文中提到一种安装 IPv6 协议、启用 Teredo Interface 并修改 C:\WINDOWS\system32\drivers\etc\hosts 文件的方法;但是这个方法我在 Windows XP 系统上(Windows 2003 应该也有此类问题)从来没有使用成功过,即便是在 hosts 文件中添加了所有的 IPv6 记录。
这个问题到底出在了哪里呢?今天终于又在查找资料时被 GFW 所困扰,索性花了半个多小时来找这个问题的解决方案,以便能在 XP 系统上开启 IPv6,随意浏览 Web Cache,解决找资料难的问题。

好在 Google 到了个相当靠谱的帖子:苍天哪,大地啊,列祖列宗啊…我终于也突破重围了
别看这个帖子的标题很是搞怪,可其中的内容真是十分丰富。我上面说到的这个设置了 hosts 中的 IPv6 地址却依然解析出 IPv4 地址的问题迎刃而解。
Teredo 作为一个能够使用基于 IPv4 内网地址通过 NAT 直接 tunnel 到 IPv6 网络的接口,却奇怪地把解析 IPv6 的优先级搞得比 IPv4 要低,这样也就被系统抢先一步从 IPv4 访问所有网站,而直接无视 hosts 里面的任何 IPv6 设置了。
在 cmd 中输入以下命令:
netsh
int
ipv6
set prefix ::1/128 50 0
set prefix ::/0 40 1
set prefix 2002::/16 30 1
set prefix ::/96 20 3
set prefix ::ffff:0:0/96 10 4
set prefix 2001::/32 5 1

以上完成了 Teredo 接口的 IPv6 地址解析的优先级设定。
>netsh int ipv6 set prefix ?

用法:  set prefixpolicy [prefix=]<IPv6 address>/<integer> [precedence=]<integer> [label=]<integer> [[store=]active|persistent]

参数:

        标记                值
        prefix            - 添加到策略的前缀。
        precedence        - 排序的优先顺序值。
        label             - 匹配的标签值。
        store             - 下列值之一:
                            active: 更改只持续到下一次重新启动。
                            persistent: 更改持久有效(默认值)。

说明: 修改给定前缀的源和目标地址选择策略。

示例:

        set prefixpolicy ::/96 3 4
要查看当前的策略优先级设定,可以输入:
>netsh int ipv6 sh prefixpolicy (Windows 7 请使用 prefixpolies 关键字)
正在查询活动状态...

优先顺序    标签   前缀
----------  -----  --------------------------------
         5      1  2001::/32
        10      4  ::ffff:0:0/96
        20      3  ::/96
        30      1  2002::/16
        40      1  ::/0
        50      0  ::1/128
要重现这个问题,你可以随便在 hosts 里创建一个虚构的地址,如 2404:6800:8007::63 test。这时在 cmd 中 ping test 得到的就是 IPv6 地址,因为此时 test 没有对应 IPv4 地址可以解析到。这个奇怪的问题被网友 jimb 称为“The Teredo Behavior”:
That sounds like a side affect "The Teredo Behavior". I think that's a bug, because the behavior is supposed to only prefer IPv4 if you have only a Teredo address. But it appears to require that a non-teredo IPv6 address appear on the interface that your DNS server lives on, even if you have a native IPv6 interface on a different interface.
- via tunnelbroker.net
如果你也遇到了以上问题,可以尝试执行上面的 Teredo 接口优先级设定命令解决问题。