当前环境使用IPv6的完全解决方案 |
发布: 2014-05-25 10:21 |
目前IPv6已经有小范围的应用。 但国内除了几所高校有IPv6网络之外,互联网上的使用范围还非常少。 现在的操作系统都已经支持IPv6协议,可以使用标准的6over4协议, 实现现在就用IPv6的功能。 现在的网络软件也大多数支持IPv6协议,不过优先支持使用IPv4地址。 除了操作系统之外,还需要DNS的支持,服务器的支持。 这里讨论一种可尽量使用 IPv6协议的客户端系统配置。 这一配置包括以下几项: 1、查看当前的操作系统是否支持IPv6并开启IPv6 2、6over4 隧道的实现程序安装 3、支持IPv6的公用DNS服务器 4、本地DNS缓存服务器,dnsmasq 5、本地DNS劫持服务器,kdns 6、软件的IPv6参数 7、测试与测试工具 8、注意事项 注:后续说明都是在Linux操作系统环境下的演示说明, 其他Unix类系统操作使用类似,包括Mac OS X。 Windows下除了kdns之外,也有相应的软件和类似的配置。 1、查看当前的操作系统是否支持IPv6并开启IPv6 /sbin/ifconfig 查看是否有类似一行输出: inet6 fe80::6ef0:49ff:fe64:349 prefixlen 64 scopeid 0x20<link> 2、6over4的 miredo teredo协议就是指的IPv6 over IPv4协议。 在linux上的实现软件名称为miredo。 miredo使用linux的tun内核模块创建一个虚拟网络接口teredo, 所有的IPv6协议的访问将首先经过这个虚拟网络接口。 teredo协议的详细说明请参考相关文档。 安装miredo非常简单,像在Archlinux上, pacman -S miredo 启动miredo, systemctl start miredo 查询miredo服务进程的启动情况, systemctl status -l miredo 查询虚拟网络接口miredo状态,/sbin/ifconfig, inet6 2001:0:53aa:64c:1c68:bed:2db1:76d5 prefixlen 32 scopeid 0x0<global>teredo: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1280 inet6 fe80::ffff:ffff:ffff prefixlen 64 scopeid 0x20<link> unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC) RX packets 16217 bytes 12112456 (11.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 32753 bytes 2967255 (2.8 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 这样表示miredo服务正常启动。 如果全部使用IP而不是使用域名的话,现在已经能够连接公网上的IPv6服务器了。 这里可以简单测试一下,测试命令可以参考“测试与测试工具一节”。 3、支持IPv6的公用DNS服务器 cat /etc/resolv.conf.ipv6 nameserver 2002:5968:c28e::53 nameserver 2a00:1508:0:4::9 nameserver 2620:0:ccc::2 nameserver 2620:0:ccd::2 nameserver 2001:4860:4860::8888 注意这里使用的是另一个resolv.conf.ipv6,这是为了后面的本地dns配置, 另外,单独把支持IPv6的DNS服务器摘出来,也方便管理。 即使后面不再使用也不影响当前的系统。 这些是收集的公共DNS服务器,因为如果不用支持IPv6的DNS的话, 即使一个域名已经提供IPv6地址,DNS也会忽略掉这IPv6地址,只返回IPv4地址。 而IPv6的DNS则是向前兼容的,如果没有查到域名的IPv6地址,还会查是否有IPv4地址。 4、本地DNS缓存服务器,dnsmasq dnsmasq是一个DNS代理服务器,并且具有缓存DNS结果的功能。 本地使用这个程序带来DNS解析的速度提升。 另外,这个程序的配置非常可控,可以防止DNS解析受影响的问题。 安装, pacman -S dnsmasq 配置,cat /etc/dnsmasq.conf port=5353 # 注,这里没有使用DNS默认的53端口,53端口给后面的程序使用。 resolv-file=/etc/resolv.conf.ipv6 # 默认指向自定义的resolv文件,而不是系统的默认/etc/resolv.conf 其他的配置项在这里不是非常重要,不再一一描述。 启动dnsmasq, systemctl start dnsmasq systemctl status -l dnsmasq 使用netstat -anu,看是否有:5353端口的监听。 5、本地DNS劫持服务器,kdns 这个程序的功能是什么呢? 在文章一开始提到,要整个系统优先使用IPv6,而在目前的情况下, 有些服务器同时支持IPv4和IPv6, 很多程序都是优先使用IPv4的,IPv4不通的情况下才会考虑IPv6。 可以根据这个现实情况的特点,把域名解析出来的IPv4劫持, 替换成一个不可访问的地址上,像127.0.0.1, 这样期望程序在连接IPv4协议的地址时出错,从而再试用后面的IPv6地址尝试。 kdns程序的处理流程是,作为系统直接使用的DNS服务器监听在:53端口。 收到DNS解析请求时, a) 如果是IPv4解析请求,则先构造一个IPv6解析请求,转发到前面的dnsmasq:5353端口。 b) 把当前的解析请求转发到dnsmasq:5353端口。 在收到DNS解析响应时, a) 如果是一个IPv4解析响应,则查看相应请求的域名是否有IPv6地址, 如果该域名有IPv6地址,那么为什么还要IPv4地址呢。 为了不让应用程序有选择IPv4的权利,在此对这个DNS请求进行劫持。 把响应中的真实IPv4地址修改为固定的127.0.0.1地址。 然后再把修改后的响应包返回给应用程序。 b) 如果是一个IPv6响应,则记录下相应的请求的域名是有IPv6地址的,供前一步检测使用。 然后把包直接转发给应用程序。 这里能够做到有IPv6地址的域名被劫持,没有的则通过,从而不影响正常使用。 当然也有可能会对某些程序造成困扰,就是这程序没有尝试其他的IPv6地址就报错了。 比如使用浏览器访问某网站,支持IPv6,那么浏览器解析域名时得到了两个IP地址, 127.0.0.1和另一个IPv6地址。 如果优先使用了被劫持的127.0.0.1地址访问不了网站就放弃了,则这次DNS劫持失败。 因为在没有劫持的情况下,浏览器能够正常使用。 当然这也可以看作是浏览器程序实现的不完善了,实际情况是现在的浏览器在这种情况下都能正常使用。 kdns是我用了1天时间仓促开发的小程序,可能还有不完善的地方,可以后续再完善。 需要安装的请下载kdns代码:https://github.com/kitech/toxsh/tree/master/kdns 有什么改进意见或者疑问也可直接在项目上留言。 启动这个程序,监听在:53标准DNS协议端口上, 并且在/etc/resolv.conf中只设置这一个nameserver即可,如, cat /etc/resolv.conf nameserver ::1 这样,整个系统的所有域名解析都会按照以前流程处理, client -> kdns -> dnsmasq -> public dns 6、软件的IPv6参数 在过渡到IPv6协议的过程中,有些程序需要根据参数决定使用的协议类型, 如果不使用参数,即使给其传了IPv6地址,程序也可能当作IPv4地址使用, 从而程序无法正确识别IP地址会报错。 像traceroute有-6参数, curl 有-6参数, host有-6参数, dig有-6参数, ping有对应的ping6命令, chromium有--enable-ipv6参数, firefox有ipv6.disable配置, 7、测试与测试工具 域名解析测试程序,dig, host, nslookup, 例子,dig @::1 ipv6.google.com host -d www.facebook.com ::1 curl -v www.facebook.com,可以看到使用的真实连接IP是IPv4的还是IPv6的。 ping6 ::1,查看本地IPv6协议的回环网络是否能通。 还可以使用浏览器访问一些测试站点来测试,如, test-ipv6.com he.net 等。 如果使用chromium的话,可以实时监控到dns使用状态, chrome://dns-internals 8、注意事项 请仔细阅读并理解后再尝试,并且最好有两台电脑,因为改动配置过程可能上不了网。 有些家庭宽带网络环境,即使安装了这些也可能还是用不了。 |
原文: http://qtchina.tk/?q=node/812 |
Powered by zexport
|