一个接口IPV6地址相关的信息包括:

  • global unicast address;
  • prefix length;
  • default gateway;
  • DNS server;
  • domain name;

这些信息里,有的是必须的,如ip address和prefix length, 有的是optional的,比如default gateway, dns server, 以及domain name。prefix length 为什么分开写呢? 因为dhcpv6 不提供prefix length,需要 RA 提供。

而配置ipv6 信息有三种方式:

  • 手动
  • stateful dhcpv6
  • SLAAC

我们主要看stateful dhcpv6 和 SLAAC. 系统怎么决定采取哪种方式呢?答案是通过RA的flag来判断。相关的flag 主要有:

  • M:M=1 代表有stateful 的DHCPv6 server, 可以使用DHCPv6的方法;
  • O:O=1,代表可以从dhcpv6 server获取dns server,domain name之类的信息,这个一般和SLAAC配合使用。因为SLAAC不提供这些信息。
  • A:A=1 代表使用SLAAC;用RA里的声明中的prefix的前64位,加上本机自动生成的interface identifier。这个interface identifier 一般是EUI-64,通过mac地址的再做一些转换得到的64bit的数值。

使用libvirt来配置virtual network,提供一个SLAAC的环境,或 dhcpv6 的环境,通过tcpdump 抓包,分析ipv6地址配置的过程。

使用libvirt启动一个虚拟网络,libvirt会创建一个linux bridge,并根据xml的配置信息来启动dnsmasq进程来提供dns和dhcp的服务。libvirt virtual network有多种forward的类型,根据forward类型,libvirt还会创建一些iptables的规则,来对VM的流量做一些定制。比如forward mode=nat,就可以通过网络地址转换,使VM可以与自己的私有子网以外的网络通信。

  • SLAAC 定义一个virtual network,不包含dhcpv6 range,但bridge有ipv6的地址;
<ip family='ipv6' address='fd12:3456:789a:5::1' prefix='64'/>
  • DHCPv6 定义一个virtual network,包含dhcpv6 range,dnsmasq将提供dhcp的服务;
 <ip family='ipv6' address='fd12:3456:789a:1::1' prefix='64'>
    <dhcp>
      <range start='fd12:3456:789a:1::100' end='fd12:3456:789a:1::1ff'/>
    </dhcp>
  </ip>