启用ipv6

我的网络知识比较陈旧,面对着ipv6无奈的抓耳挠腮。

首先,我新买的vps支持ipv6,但是默认它没有帮我配置。
一边查文档一边写我知道的

ipv4的长度是32位,ipv6的长度是128位
ipv4的header size是192位,ipv6是320位(但是支持压缩)
IPSec其实是为ipv6设计的
特殊的移动(mobile ipv6)以及自动配置支持
支持flows
头部可以压缩,也可以扩展

关于地址:
ipv6的地址可以分为这么三类:provider based、provider independent或for local use。
provider based Global Unicast Address都是以001开始,也就是说,第一个数字要么是2(0010)要么是3(0011)。最前面48位是provider id,中间16位是子网ID(Subnet ID,or Site ID),最后64是主机ID(Host ID)。
Private ULA Unicast Address是FC00开始。
Link-Local Unicast Address是FE80开始。
在使用IPv4的时候,大多数情况下,一个网卡只用一个IP。但是ipv6的时候,可能会同时配置三种IP,global、 link local和 site local每样一个。以我的个人服务器的网卡为例:
# ifconfig -a
eth0 Link encap:Ethernet HWaddr aa:00:00:f5:49:b6
inet addr:173.245.73.182 Bcast:173.245.73.255 Mask:255.255.255.0
inet6 addr: fe80::a800:ff:fef5:49b6/64 Scope:Link
inet6 addr: 2001:470:21:31::adf5:49b6/64 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
它配置了两个IPv6,fe80::a800:ff:fef5:49b6,2001:470:21:31::adf5:49b6,后面的/64和ipv4的时候含义类似(类似于192.168.0.1/24),代表它的前64位是给路由器查路由表用的。

一般来讲,分到的公网IP都是2001开头的。2002开头的是专用于部署6to4的。具体可见这里:http://www.iana.org/assignments/ipv6-unicast-address-assignments/ipv6-unicast-address-assignments.xml
我的路由器虽然支持ipv6,但是isp貌似还不支持,所以采用的是6to4的方式部署。所以它的IP是这样的: 2002:76c6:1906::76c6:1906。其中76c6:1906就是把ipv4的地址118.198.25.6直接翻译过来而已。
在ipv4到ipv6的过渡阶段,发展出了很多种不同的tunnel手段用于把这两种网连接起来
手动配置的tunnel:在RFC 2893中定义。要求两端都有ipv4和ipv6地址。
GRE(Generic Routing Encapsulation) tunnel:不清楚
IPv4-compatible (6over4) tunnels:也是在RFC 2893中定义,地址是这样::的格式
6to4 tunnel:RFC 3065中定义。
ISATAP(Intra-site Automatic Tunnel Addressing Protocol) tunnels:不清楚。类似于6to4.
6to4 tunnel的地址以2002开头,然后是32位的IPv4地址,后面和2001开头的格式一样:接着16位是子网ID(Subnet ID,or Site ID),最后64是主机ID(Host ID)。
而ISATAP的格式是,最前面64位是子网前缀,然后32位是0005EFE,最后32位是ipv4地址。

获取IPv6地址的方式总体分为手动配置和自动配置。自动配置又分为有状态自动配置和无状态自动配置。有状态自动配置就是走DHCP。

尽管ipv6能自动发现邻居和路由,但是设计DHCPv6依然是必要的,因为 :
1、无状态自动配置需要使用多播,而不是所有的网络都支持多播。
2、小型的ipv6网络可能没有路由。所以ipv6的自动配置就不能进行
3、如果网络管理员希望自己来控制IP分配等等,而不是由它们自由协商……
所以就有了DHCPv6。
无状态自动配置下,HostId是机器自己根据MAC计算出来的一个64位无符号数。

我的服务器采用的是手动配置。它所在的网络支持ICMPv6路由发现协议。
安装ndisc6这个包,然后里面有个工具rdisc6。用法很简单,后面直接跟网卡名就行了。
# rdisc6 eth0
Soliciting ff02::2 (ff02::2) on eth0...

Hop limit : 64 ( 0x40)
Stateful address conf. : No
Stateful other conf. : No
Router preference : medium
Router lifetime : 0 (0x00000000) seconds
Reachable time : unspecified (0x00000000)
Retransmit time : unspecified (0x00000000)
Prefix : 2001:470:21:31::/64
Valid time : 0 (0x00000000) seconds
Pref. time : 0 (0x00000000) seconds
Source link-layer address: 00:30:48:9E:54:16
from fe80::230:48ff:fe9e:5416
得到的2001:470:21:31就是我的ipv6地址的前64位。然后把中间空出来,把ipv4的地址填到最后Host Id部分。173.245.73.182:173256256256+245256256+73256+182=0xADF549B6,就是我的ipv6 IP了。如果你也和我用的是同一个主机托管商,那么可以。否则,这可不是通用做法。

我家的路由器提供6to4服务。我的理解大概是这样,我本机有ipv6地址,它把包发给我家的路由。然后该路由器把ipv6的包封装成ipv4的包,目的地址写192.88.99.1,然后这个包走到合适的地方,即跨到ipv4/ipv6的边界处时,再解成ipv6的包。可惜我现在所处的环境下,traceroute不好使。据我查看,HE.net这样的大IDC它内部的ipv6都是通的,走到那里就开始解。
反正我觉得6to4是个很不错的方案,让我可以直接访问ipv6.google.com,搜索任意关键字。

但是我现在还是不明白,像我自己的域名这样,既提供ipv4又提供ipv6(AAAA record)的时候,firefox/ie是如何选择的?我感觉它仿佛走的是IPv4-compatible (6over4) tunnels这样的方式出去的,不是我想要的。我在服务器上用netstat看,它的地址是::ipv4这样的格式,而不是2002开头的。

接下来,把我手机的ipv6网络配置好吧。也不枉费了它这么贵却一直无用武之地(刚给配上了3G)

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥