Windows下配置IPV6 tinc相关记录 - 后记

By gyakkun


本来事情算是告一段落了, 但仍然没有达到能用的水准, 一是联不通出国实在是渣, 刚好这里有路电信出口的内网机器A(Ubuntu)可以利用起来; 二是DNS问题始终是个心病, 毕竟到美国在绕回来至少200ms的DNS查询延迟还是相当明显的。

针对第一个问题, 在本机和A之间架起隧道即可, 鉴于熟悉程度与配置方便, 自然是再次选择tinc。由于Win桌面版的路由表工具不多, 不像Linux上有ipset, iproute2, iptables等稍加利用后便可实现复杂的路由策略, 所以也不多折腾。先写到A走默认网关, 再写了两个bat用于切换联通/电信默认路由, 最后再指定到do走电信线路, 即tinc套tinc, 想必是相当安全了(弥天大雾)。

第二个问题算是Win一个大坑。首先Win下若有多个网络适配器, 是可以手动设置优先级的, 并可以单独控制哪个网卡走V4/V6, 这还是昨天查过才知道的。事先知道在有V4/V6两种DNS的情况下, Win会优先向V6 DNS发起查询, 超时回落。但是这在单网卡(适配器)的情况下。多网卡的情况变得复杂得多。

当前的情况是:有两个适配器LAN/TINC, 略过折腾的过程直奔结论的话, 当且仅当TINC上配置有V6 DNS的时候, 域名解析结果中含有A/AAAA两种记录的域名才能ping通其V6地址, 如果域名中仅有AAAA记录, 则实验过程中曾出现过一种双栈域名无法ping其V6地址, 纯V6网站得以解析(ping通)的情况, 该情况因疏忽未予以重视导致后来难以复现。

经查, ping和nslookup的内部实现并不相同, ping倾向使用系统的DNS Client Service服务, 而nslookup则单独开socket来发起DNS查询。本机的情况是, 在不设置任何V6 DNS的情况下, nslookup总是能返回纯V6/双栈网站的AAAA记录, 但是ping时总提示“Ping request could not find host wolfman. Please check the name and try again.”, 令人无比郁闷, 暂时得到的结论是这是DNS Client Service的锅。

由于本机V6链路要经过遥远的太平洋, V6 DNS的延迟可想而知, 对上网体验影响极大, 但若使用V4 DNS则之前的努力意义全无。一度列了一张6变量真值表想来逐一排查各种请何况, 后因工作量太大放弃。退而求其次: 能否在本机架设一个DNS代理, 这样V6 DNS指定为本机[::1]即可。

Linux上这类轮子不胜枚举, 但鲜有听闻在Win下做类似的事情。好在开源软件造福人类, DNS服务器在开源界的事实标准BIND亦有官方编译的Windows版本, 坊间(?)称之为ntbind。只需要稍加设置, 下载了根服务器的证书信息之后, 便可以做DNS转发, 从而在本机架起了DNS服务器。具体方法见参考链接, 注意在named.conf里面allow-query需要写上V6的本机地址::1, 或者干脆写上”::/0”不限制查询, 上层DNS服务器我选的是大清的DNS666(101.6.6.6)。如果遇到系统错误1067(System error 1067 has occurred )导致named服务启动不成功, 建议写成vbs脚本使之后台运行, 大概长这样

Set ws = CreateObject("Wscript.Shell")
ws.run "named.exe -f -g -d 1",vbhide

具体架设方法见参考链接。之后只需要把所有网卡的DNS清掉, 只留TINC上的::1即可。

大概就这么多。生命在于折腾, 共勉。

Ref:

  1. 双栈下Win的DNS解析: IPv6 for the Windows Administrator: How Name Resolution Works in a Dual IPv4/IPv6 Scenario
  2. Win的DNS API: DNS WMI Classes)
  3. 多网卡时DNS设置: How to configure DNS on Windows with multiple NICs?
  4. Configure a split DNS system on Windows Server 2003 (Archive)
  5. 更改网卡/网络协议优先级: How can I change the binding order of network adapters in Windows 7?
  6. 使用ntbind架设Windows下的DNS服务器