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 接口优先级设定命令解决问题。

10 条评论:

  1. 怀着非常大的期望尝试了一下,还是没有成功,也许是我的操作系统的问题吧。

    回复删除
  2. @Ocean Ban: 你先ping6 google.com一下,发起一个ipv6连接再试试可不可以用。

    回复删除
  3. Thanks for an idea, you sparked at thought from a angle I hadn’t given thoguht to yet. Now lets see if I can do something with it.

    回复删除
  4. 是::1/128还是::1/1288 ?你前后有点不同。

    回复删除
  5. @Brucelee YQ:
    抱歉,是/128,是我写错了。

    回复删除
  6. Hi there, I found your blog via Google while searching for a related topic, your site came up, it looks good.

    回复删除
  7. 作为一个小白,有一个问题问大大,怎么恢复默认呢?

    回复删除
  8. @Risenh Blogger:
    抱歉這麼晚才回覆你。
    如果你變更了系統默認設定,可以執行
    netsh int ipv6 reset
    來把所有設定重置。
    特別地,你還可以直接把teredo禁用掉
    netsh int ipv6 set teredo disabled
    這樣就不用考慮IPv4和IPv6的優先級問題了。

    回复删除
  9. @Risenh Blogger:
    抱歉,剛剛第二個寫錯了,應該是
    netsh int ipv6 set teredo disable

    回复删除
  10. @Chen Ma:多谢多谢,本来以为收到回复gmail会有邮件提示,没想到没有,今天才过来看看,发现已经有回复了,十分感谢~

    回复删除

请勿张贴商业广告。评论可能需要审核。
No advertisement. Comment review enabled.