IPv6 --- 动态地址配置

网络地址的配置是网络层管理的重要步骤。最直观的配置方式是静态配置IP地址,但是这增加了运维管理成本,并且没有灵活性。因此,大部分场合下,IP地址都是通过动态配置的。

DHCP

在IPv4下,IP地址的动态配置依赖于DHCP协议。DHCP全称是Dynamic Host Configuration Protocol,由RFC2131定义。DHCP由BOOTP协议(RFC951)发展而来,并且完全兼容BOOTP。

DHCP是一个client-server模式的协议,Server管理着IP地址池。一般情况下,主机作为Client,通过下图的方式与DHCP Server交互,并请求IP地址。IP地址包含在DHCP offer和ACK中。

DHCP对应的中文是动态主机配置协议。所以除了IP地址以外,同时也能配置子网掩码长度,主机名,路由,默认网关,DNS等。所以在IPv4中,DHCP协议就可以完成大部分的主机动态配置。DHCP协议已经使用了几十年,这里不做过多的介绍。

DHCPv6

对应于DHCP,IPv6协议中也有DHCPv6(RFC8415/RFC3315)。但是就像IPv6完全不兼容IPv4一样,DHCPv6除了工作模式与DHCP类似以外,与DHCP也不兼容,它的协议内容也进行了重新定义。

因为IPv6中没有广播的概念,所以不像DHCP基于广播地址255.255.255.255来发现DHCP Server,DHCPv6中,有两个保留的组播地址,用来发现网络中的DHCP Server:

  • All_DHCP_Relay_Agents_and_Servers (ff02::1:2)
    • DHCPv6 client使用这个地址将DHCP请求发送给所有的DHCPv6 relay(中继)agent和DHCPv6 server,这样可以发现网络中的DHCPv6 Server
  • All_DHCP_Servers (ff05::1:3)
    • DHCPv6 relay agent通过这个地址将DHCP请求转发给所有的DHCPv6 server

DHCPv6仍然是基于UDP协议,但是使用的是UDP的547(Server监听端口)和546(Client监听端口)。与IPv4协议不同的是,IPv6协议下,每个网卡都默认带一个link-local地址,这个地址是fe80::/10的前缀加上(一般情况下)网卡的MAC地址生成[RFC4291]。IPv6的link-local用来在一个二层链路中唯一标识一块网卡,并且可以在有限场景下在一个二层链路中用来通信。

在DHCP(IPv4)协议下,DHCP Client在发起请求的时候,因为还没有IP地址,所以源IP只能是Unspecified Address(0.0.0.0)。而DHCPv6 Client在发起请求的时候,网卡已经有IPv6地址了,所以源IPv6地址就是网卡的link-local地址,目的地址是DHCPv6保留的组播地址ff02::1:2。

上面就是DHCPv6的交互过程。DHCPv6 Server在收到请求之后,将IPv6地址在单播回给Client网卡的link-local地址。其中IPv6地址包含在Advertise和Reply中,这个过程与DHCP类似。

除了上面实现细节上的差别,DHCPv6与DHCP的区别还在于,DHCPv6不支持传输子网掩码长度,路由,和默认网关。这个区别是由IPv4迁移至IPv6容易引起错误的地方。

IPv6 动态地址配置模式

动态地址配置对于IPv6来说尤其重要,因为在IPv4场景下,地址长度,地址数量有限,静态配置还有可行性,但是如果要真正的完全使用IPv6,通过静态配置地址基本不可能。尽管IPv6下面已经有DHCPv6协议,尽管DHCPv6已经与DHCP不兼容,但是IPv6和IPv4动态地址配置的差别远比DHCPv6和DHCP的差别大。

两个协议,三种模式

--

IPv6的动态地址配置主要依赖两个协议,一个是DHCPv6(RFC8415),另一个是IPv6 Stateless Address Autoconfiguration(RFC4862)。IPv6的动态地址配置方式客观的说是合理的,并且一定程度结合了IPv4动态地址配置的经验(个人猜测)。

在现实场景中,为了让一个网络工作,除了将设备连接起来的线路,交换机,我们主要还需要两个设备,一个是DHCP Server,主要用来管理、分配地址和配置信息,另一个就是Router路由器,主要用来做三层转发,连接当前网络和其他网络。实际中,经常将DHCP Server配置在路由器上,或者路由器作为一个DHCP relay agent。另一方面,如果没有路由器,网络只是一个二层网络,作用有限。因此,这两个设备本身可以只是一个设备,并且它们之中,路由器占主导地位。基于这个背景,IPv6的动态地址配置有三种模式:

  • SLAAC,Stateless Auto Address Configuration
  • Stateless DHCPv6
  • Stateful DHCPv6

这里的Stateful,指的就是DHCP Server管理的IP地址,因为这些地址存在一个分配关系,需要一个程序去管理这个状态。Stateless Address是指这个地址就是分配给某一个确定的主机使用,没有其他状态。

SLAAC

SLAAC基于协议RFC4861和RFC4862。在SLAAC的世界里,没有DHCPv6。SLAAC协议由路由器来通告配置IPv6地址所需要的信息。具体工作流程是这样:支持IPv6的网卡启动的时候会发送一条RS(Router Solicitation)消息,源IP是网卡的link-local地址,目的IP是ff02::2。ff02::2也是保留的组播地址,用来表示所有的路由器。这条消息用来查找当前网络中的路由器。

路由器收到这条消息之后,会回传一条RA(Router Advertisement)。一般情况下,RA的源IP地址是Router的link-local地址,目的地址是ff02::1。ff02::1也是一个保留的组播地址,用来表示所有的主机。也就是说任意网卡发起的RS消息,都会引起路由器将RA消息在整个网络中发送给所有的主机。除此之外,就算没有任何RS消息,路由器也应当定期向所有主机发送RA。具体流程如下图的3,4。

RA消息是SLAAC协议的核心,它的格式内容如下:

RA可以发送给网络中所有主机的基础就是,不像DHCP消息,RA是无状态的,任何主机接收到了RA消息之后,都能根据其中的信息完成IP地址配置。RA的options中通常包括:

  • MTU
    • 主机可以根据这个MTU值配置自己的MTU
  • 路由器的MAC地址
  • 0或者N个prefix(网段)

如果RA中一个prefix的auto标志位是1,那相当于告诉网卡,可以自己从这个prefix中生成一个IPv6的地址。网卡只需要使用一个局域网中唯一的标识符,再加上这个prefix,就能生成一个IPv6地址。网卡在局域网中的天然唯一标识符就是MAC地址,因此一般情况下,SLAAC协议中,网卡是通过RA中的prefix和自身的MAC地址,再根据EUI-64格式生成一个IPv6地址。SLAAC协议的基础就是IPv6地址长度足够大,能支持这样的配置。

RA消息还能带来一个潜在的配置,主机会将IPv6的默认网关,指向RA的源IP地址,也就是Router的link-local地址。生成的默认路由是有时效的,时间是Router Lifetime。所以需要路由器定时发布RA(类似于心跳),更新主机的默认路由。这个机制讲道理是合理的,默认路由只有在路由器还活着的时候才有意义。但是这个机制增加了管理的复杂度,尤其在SDN场景,虚拟路由器下定时发布RA。

SLAAC协议有两个问题,一个是IPv6的地址不可控了,一般情况下与主机的MAC地址相关;另一个是RA格式比较简单,能传递的配置有限,一些复杂的主机配置无法通过RA传递。

但是好处是简单,只用路由器,不需要DHCPv6的介入,就可以完成简单的IP地址配置;另外无状态地址能简化管理,只需要一些简单的程序就能完成Prefix分发,不需要集中的管理地址,处理多节点数据同步,这有点像分布式架构。SLAAC的配置过程如下如所示:


Stateless DHCPv6

Stateless DHCPv6就是结合了SLAAC和DHCPv6。其中IPv6地址配置通过SLAAC下发,其他配置通过DHCPv6下发。这样能弥补SLAAC模式下,RA所能传递配置有限的问题。

Stateful DHCPv6

这里就是纯纯的DHCPv6了,但是前面说过,DHCPv6不支持子网掩码长度,路由,和默认路由。这样就导致通过DHCPv6获得的IPv6地址,因为没有掩码长度,地址的掩码都是128位。而路由和默认网关,还是需要依赖RA。因为在IPv6中,动态配置路由和默认网关的唯一方式就是使用Router Advertisement消息。所以,就算使用了DHCPv6,也不能完全摆脱RA消息。只是说DHCPv6下,IPv6地址变得可控了。所以,在IPv6动态地址配置中,Router Advertisement是必不可少的,因为它控制了主机路由和默认路由。同时Router Advertisement还控制了IPv6的动态地址配置模式。在RA的数据中,有两个标志位M(Managed)和O(Other)。

  • 当M=0,O=0时,IPv6地址工作在SLAAC模式下
  • 当M=0,O=1时,IPv6地址工作在Stateless DHCPv6模式下
  • 当M=1时,IPv6地址工作在Stateful DHCPv6模式下

总的来说,Stateful DHCPv6的工作流程如下所示:

IPv6中,如果需要地址可控,那只能使用DHCPv6。如果只是需要分配一个IPv6地址,对地址无要求,那么使用Stateless地址分配方式更为合理。

发布于 2019-08-23

文章被以下专栏收录

    介绍SDN和数据中心网络的各个方面。专栏所有文章仅代表本人观点,与本人当前或之前的雇佣公司无关。本人保留自省的权利,也就是说,你看到文章时,文章内容也不一定代表本人最新的观点。