当前环境使用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,
teredo: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1280
        inet6 2001:0:53aa:64c:1c68:bed:2db1:76d5  prefixlen 32  scopeid 0x0<global>
        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