内容目录

ipv6地址的配置方法,包括手动配置、无状态地址自动配置(stateless address auto configuration,slaac)、有状态dhcp配置和无状态dhcp配置等。需掌握ipv6地址配置的几种方法,并了解几种方法之间的区别,从而知道计算机存在多种或多个ipv6地址时,优选哪个ipv6地址与外界通信

节点及路由器常用的ipv6地址

ipv6网络中,节点和路由器的接口在开启ipv6协议时无须配置也会自动生成ipv6的链路本地地址。由于ipv6大量使用组播代替了广播,因此节点或路由器的接口会自动加入一些组播地址组中。

节点常用的ipv6地址

对于普通主机节点来说,一般具有以下ipv6地址。

  • 链路本地地址:以fe80::/64打头,每个接口只要启用了ipv6协议,就会有链路本地地址,是诸如自动地址配置、邻居发现等机制的基础。
  • 环回地址:即::1地址,主要用于测试本地主机上的协议是否完整安装以及是否可以正常通信
  • 所有节点组播地址:ff01::1ff02::1。前者很少用到,是节点本地作用域的所有节点地址;后者是本地链路作用域的所有节点地址。
  • 单播地址:一般是申请后分配到的地址,在2000::/3范围内
  • 被请求节点组播地址:由ff02::1:ff00:0000/104附加上单播地址的末24位组成,用于邻居发现和dad等机制
  • 主动加入的组播地址:ff00::/8地址。该地址是可选地址,在特定的组播应用中使用。

路由器常用的ipv6地址。

对于路由器而言,一般具有以下ipv6地址

  • 链路本地地址:与节点的链路本地地址一样,只要接口启用了ipv6协议,就会有链路本地地址。若链路本地地址没有通过dad,还需手动配置
  • 所有路由器组播地址:ff01::2、ff02::2、ff05::2都表示所有路由器组播地址,但表示的范围不通
  • 单播地址:一般是2000::/3范围内的全球范围单播地址,但在实验环境中可以使用任何合法的ipv6地址
  • 任播地址:与单播地址一样,加上anycast以说明是任播地址
  • 被请求节点组播地址:类似于主机节点的被请求节点组播地址。
  • 组播应用相关地址:pim、mld
  • dhcpv6相关地址:dhcpv6服务器或中继器的ff02::1:2地址,以及本地站点范围内的所有dhcpv6服务器地址ff05::1:3

DAD

ipv6ipv4一样,不管主机节点是手动配置还是自动获取地址,在地址正式生效之前,都需要判断的在网络中是否已被使用,在ipv6中通过重复地址检测(duplicated address detection,dad)来完成。只有通过了dad,地址才会生效。如果没通过dad,该地址不能被接口使用,此时必须小虹心手动配置或重新获取一个未被使用的地址。

与邻居可达性检测一样,dad使用类型为135的icmpv6报文(即ns报文)和类型为136的icmpv6报文(即na报文)来完成重复地址的检测。过程大致如下:

  • 主机节点通过静态配置或自动配置,获得包括链路本地地址和可聚合全球单播地址等在内的地址。这两种地址的dad检测过程类似。主机节点虽获得了可聚合全球单播地址,但此地址处于未生效状态。假定未生效地址是2001::1234:5678

  • 主机节点构造并发送ns报文,报文的源地址为未指定地址::,目的地址为未生效地址对应的被请求节点组播地址,即ff02::1:ff34:5678(固定的104位ff02::1:ff加被请求节点ipv6地址的末24位),源mac地址是自身接口的mac地址,目的mac地址是3333-ff34-5678(前16位固定为3333,后32位是目的地址的末32位),ns报文中的目标地址字段中的值是2001::1234:5678

  • 如果在一段时间内,链路中不存在回复ns报文的na报文,或者收到同样结构的ns报文(说明在之后还有主机节点想使用相同的未生效地址),则认为在本地链路范围内,拟使用的未生效地址还没有别的主机节点占用,未生效地址转变为有效地址,地址配置生效。对于windows系统来说,就是将未生效地址改为首选地址。这个等待的时间是由dad检测的时间和次数决定的。对于思科路由器,可以在接口下通过命令ipv6 nd dad attemptsipv6 nd dad time来更改。对于Windows主机,可以在命令提示符下输入netsh interface ipv6 set privacy maxdadattempts=3命令来设置。

  • 如果主机节点收到了na报文,则dad失败,该未生效地址转为非法地址,不能被节点使用。此时需要重新配置别的静态地址或者重新获取地址,然后再执行dad

从上面的过程可以看出,DAD就如同IPv4网络中的免费ARP一样,同样存在欺骗攻击的可能。即攻击者通过伪造NA报文对所有用于DADNS报文进行回复,或者主动发送NA报文,通告地址已被占用,这样就会导致DAD总是失败,地址也就无法生效。当然,由于IPv6地址位数较长,即便真发送NA报文进行欺骗攻击,其代价也要比IPv4大很多。

  • 实验:ipv6地址冲突的解决
    本实验主要演示dad过程,并通过抓包讲解nsna报文格式,观察ipv6地址冲突现象,解决ipv6地址冲突问题。

    • 1.基本配置。先在win10e0接口抓包,然后再配置R1

      Router>enable
      Router#conf t
      Router(config)#ipv6 unicast-routing 
      Router(config)#int e0/0
      Router(config-if)#ipv6 enable 
      Router(config-if)#ipv6 add 2001::1234:5678/64
      Router(config-if)#no shut
    • 2.分析`ns`报文。在从`win10`上捕获的数据包中找到编号为103的数据包,可以通过查找源地址`ipv6 == :: `。

file

行号1是捕获的被请求节点组播地址的报文
行号2是数据帧的目的`mac`地址,即`3333-ff34-5678`
行号3的`mac`是数据帧的源`mac`地址`aabb.cc00.0100`
行号4是网络层的源`ipv6`地址`::`
行号5是网络层的目的`ipv6`地址`ff02::1:ff34:5678`,是被请求节点的组播`ipv6`地址
行号6是目标`ipv6`地址`2001::1234:5678`,我们的目的就是查找这个`ipv6`地址是否在网络中存在

  • 3.配置冲突的`ipv6地址`。在`Win10`上使用`ipconfig`命令查看当前的`IPv6`地址,然后手动给`Win10`静态配置与路由器一样的`IPv6`地址`2001::1234:5678/64`。`Win10`的`IPv6`地址配置不像`IPv4`一样会提示地址冲突,配置完成后,可以使用`ipconfig`命令验证,若没看到这个静态配置的`ipv6`地址,说明`dad`失败

  • 4.查看收到的`na`报文。由于路由器接口已经配置了`IPv6`地址`2001::1234:5678`,所以`Win10`发出的`NS`报文会收到相应的`NA`报文。

file

编号647的`na`报文的目标`ipv6`地址是`ff02::1`(即所有节点组播地址),本地链路上的所有`ipv6`节点都能收到这个报文。当`win10`收到这个报文后,表示`dad`失败,`ipv6`地址配置失败。编号645是`ns`报文,这是由`win10`发出的。

  • 5.再次配置冲突的`ipv6`地址。手动修改`Win10`的`IPv6`地址为`2001::1234:5679`,然后把`R1`的`e0/0`接口`IPv6`地址也配置成`2001::1234:5679`。
    路由器配置界面会提示地址冲突
Router(config-if)#ipv6 address 2001::1234:5679/64
Router(config-if)#
*Feb 16 06:54:37.393: %IPV6_ND-4-DUPLICATE: Duplicate address 2001::1234:5679 on Ethernet0/0

Router#show ipv6 interface ethernet 0/0
Ethernet0/0 is up, line protocol is up
  IPv6 is enabled, link-local address is FE80::A8BB:CCFF:FE00:100
  No Virtual link-local address(es):
  Global unicast address(es):
    2001::1234:5679, subnet is 2001::/64 [DUP]
  • 6.找出重复`ipv6`地址所在的设备。开启`Winserver`设备,执行ping `2001::1234:5679`操作,发现可以`ping`通。使用`netsh interface ipv6 show neighbor`命令查看`2001::1234:5679`对应的MAC地址,然后在交换机上使用`show mac address-table`命令找到这个`MAC`所对应的交换机端口`e0/1`,将其关闭,相当于断开了`Win10`主机的网络。关闭`R1`的`e0/0`接口再打开,`IPv6`地址即可生效。

手动配置ipv6地址

由于路由器、交换机和服务器等设备经常用来提供服务,其`ipv6`地址不易频繁变动,需要使用固定的`ipv6`地址,所以需要采用手动方式为其配置固定的`ipv6`地址。路由器和三层交换机有时也被用作网关,向终端设备通告网络前缀,并提供数据转发服务,`IPv6`地址需要被固定下来。

在`ipv6`中,即便手动给`windows`主机配置了固定的`ipv6`地址,对应的网络接口往往还会通过其他方式(例如无状态自动配置、`dhcpv6`等方式)获取到其他的`ipv6`地址。`windows`主机主动访问外部网络时,系统选择的往往也不是手动配置的固定`ipv6`地址,这是因为`windows`主机默认开启了自动配置功能,会获取到其他的`ipv6`地址。由于`windows`主机默认开启了强制私密性,自动获取的`ipv6`地址比手动配置的固定`ipv6`地址有更高的私密性,会被优先使用,为了避免这种情况,可以关闭系统地址的自动配置功能。

  • 实验:禁止系统地址自动配置功能
    本实验将演示在`windows`主机上手动配置地址后,由于没有关闭地址自动配置功能,且网关路由器的路由通告功能也处于打开状态下,`windows`主机会自动获取到其他的`ipv6`地址,进而在主机上关闭地址自动配置功能,只保留手动配置的固定地址。
  1. 基本配置。路由器的配置如下:

    Router#Config terminal
    Router(config)#ipv6 unicast-routing
    Router(config)#interface ethernet 0/0
    Router(config-if)#ipv6 enable
    Router(config-if)#ipv6 address 2019::1/64
    Router(config-if)#no ipv6 nd ra suppress
    Router(config-if)#no shutdown
  2. 主机配置。验证即便手动为`win10`主机配置了地址,但它在未禁用地址自动配置功能时仍能自动获取地址。手动给`win10`主机配置`2019::abcd/64`的`ipv6`地址。

file

除了手动设置的`2019::abcd`地址以外,还有1个公用`ipv6`地址和1个临时`ipv6`地址,如果允许超过1天,则会有2个临时`ipv6`地址

file

以太网接口下有4个`ipv6`地址,第一个`2019::abcd`是手动配置的`ipv6`地址,有效寿命和首选寿命都是`infinite`(无限);
第三个`2019::f0aa:69d7:409c:d89b`是临时`IPv6`地址,有效寿命还有6天23小时多,首选寿命还有23小时多,`Windows`中临时`IPv6`地址默认的最大有效寿命是7天,默认的首选寿命是1天.

file

每个临时`IPv6`地址的首选寿命是24小时,`Windows`每隔24小时,会自动生成一个新的临时`IPv6`地址。可以在管理员命令窗口中通过下面的命令改变临时`IPv6`地址有效寿命和首选寿命:

`netsh interface ipv6 set privacy maxvalidlifetime=60m maxpreferredlifetime=30m store=active`
`maxvalidlifetime`是临时`IPv6`地址的有效寿命,`maxpreferredlifetime`是临时`IPv6`地址的首选寿命,有效寿命的值要大于首选寿命;60m中的“m”表示分钟,“d”表示天,“h”表示小时;`store=active`,表示计算机重启后失效,换成`persistent`表示永久有效

第二个`2019::8467:b31f:dbd3:6847`是公用`IPv6`地址,有效寿命还有29天23小时多,首选寿命还有6天23小时多,公用`IPv6`地址的有效寿命和首选寿命是由路由设备发出的`RA`报文指定(`RA`通告的时间也会影响临时`IPv6`地址的时间,若临时`IPv6`地址的剩余时间大于`RA`报文通告的时间,则临时`IPv6`地址显示的时间也将被`RA`报文刷新;若临时`IPv6`地址的剩余时间小于`RA`报文通告的时间,则临时`IPv6`地址显示的时间将不变)。

这个时间值是逐减的,当收到`RA`报文时,系统重新刷新这两个时间值,正常情况下这两个时间都不会减小到零,因路由设备发送`RA`报文的时间周期都比较短,例如思科路由器是200秒。正常情况下,这个公用`IPv6`地址会一直有效。这个公用`IPv6`地址的接口`ID`与链路本地地址的接口`ID`相同;

第四个`fe80:: 8467:b31f:dbd3:6847`是链路本地地址,`%4`是以太网接口的编号,这个地址的有效寿命和首选寿命都是`infinite`(无限)。

如果`win10`运行超过了一天,第三个`2019::f0aa:69d7:409c:d89b`临时`IPv6`地址,`DAD`状态为“反对”,有效寿命还有5天2小时多,首选寿命还有0秒(即已经过期),这个临时`IPv6`地址仍然有效(外部主机仍然可以访问这个临时的`IPv6`地址,有效寿命结束前一直有效,但当主机主动与外部通信时,会选择最新生成的临时`IPv6`地址,不会使用首选寿命是0的临时`IPv6`地址)。也就是说外部可以访问`Windows`中的多个临时`IPv6`地址,但`Windows`主动访问外部网络时,只会使用最新生成的临时`IPv6`地址;

在手动`IPv6`地址、公用`IPv6`地址和临时`IPv6`地址同时存在的情况下,`Windows`会优先使用最新生成的临时`IPv6`地址,可以通过在`Win10`上`ping` `2019::1`,然后开启抓包,来验证这一说法。若主机需要使用固定的`IPv6`地址,不希望使用临时`IPv6`地址,可以使用如下的命令关闭路由设备的`RA`报文通告:`ipv6 nd ra suppress`

关闭`RA`报文通告后,本网段的所有终端设备都收不到`RA`通告的`IPv6`前缀,只能手动配置`IPv6`地址和网关,工作量太大。如果只是某台终端需要使用手动的固定`IPv6`地址,可以在`RA`报文通告的情况下,配置某台终端,以禁用`IPv6`地址的自动配置功能。

  • 3.禁用临时地址。要想让`Windows`主机使用手动配置的`IPv6`地址,那么需要禁用临时`IPv6`地址。在`Win10`的命令提示符窗口执行`netsh interface ipv6 show privacy`命令,可以看到“使用临时地址”处于`enabled`状态
    要禁止`Win10`使用临时`IPv6`地址,在命令行窗口中执行命令`netsh interface ipv6 set privacy state=disable store=persistent`,其中,“`store=persistent`”表示修改永久有效(这是默认参数,可以不用输入),若仅是希望在下次重启前生效,那么可以使用参数`store=active`
    禁用临时地址后,重启计算机,或禁用网卡然后再启用(相当于网卡的重启),再执行`netsh interface ipv6 show address`命令,发现没有临时地址了。

  • 4.禁止公用地址。禁用临时地址后,除了手动你配置的地址外,还有一个地址类型是公用的`ipv6`地址。在手动`IPv6`地址和公用`IPv6`地址同时存在的情况下,`Windows`会优先使用手动`IPv6`地址。可以通过在`Win10`上`ping 2019::1`,然后开启抓包,来验证这一说法。这个公用`IPv6`既然没有用到,也可以删除,这就需要关闭主机的`IPv6`地址自动配置功能。

非手动配置的地址类型是公用,对应的接口编号是`4`。在接口`4`上关闭路由自动发现功能,即禁止接收`RA`报文,这样自然也就无法获得默认网关和`RA`报文中用于自动配置地址的前缀了,也就达到了只能手动配置地址和默认网关,不能自动获得地址和默认网关的目的。

关闭路由发现功能的命令是`netsh interface ipv6 set interface “ID号” routerdiscovery=disabled`。若要恢复自动配置地址功能,把参数`disabled`换成`enable`即可。

file

由上可知,对于`Windows`主机,即便手动设置了想要的`IPv6`地址和默认网关,但如果本网段中仍有路由器网关发送`RA`报文,主机就仍有可能通过自动获取的方式,生成一个公用地址和多个临时地址。一种非彻底的解决办法是禁止系统使用临时地址。要想彻底解决,就需要关闭对应接口的路由自动发现功能。关闭路由自动发现功能后,主机的`IPv6`地址和默认网关,甚至`DNS`地址等就必须手动配置了。

  • 5.`windows`服务器的配置。`Windows`服务器的默认配置与客户端的默认配置不同,服务器默认禁用了临时`IPv6`地址功能。

地址自动配置机制及过程

考虑到`ipv6`地址的复杂性,多数情况下,我们会选择即插即用的配置方式来获取`ipv6`地址和其他配置参数。主机自动配置`ipv6`地址的工作机制和过程与`ipv4`的不同,主机自动配置`ipv6`地址分为无状态自动配置、有状态`dhcpv6`和无状态`dhcpv6`。对于`ipv6`主机,它的地址自动配置机制及过程大致如下:

  • 接口在启用`ipv6`协议后直接使用`fe80::/64`前缀。如果禁止使用随机化接口标识符,,则使用基于`EUI-64`格式的标识符,否则随机化生成一个接口标识符。然后使用`fe80`前缀和接口标识符来构建一个临时状态的链路本地地址。

  • 通过发送`ns`报文对这个临时的链路本地地址执行`dad`,`ns`报文的目标地址设置为该临时链路本地地址。当接口标识符是随机生成的时候,通过`DAD`的可能性更大。

  • 如果主机收到响应`ns`报文的`na`报文,则该临时的链路本地地址是重复地址。主机需重新生成另一个链路本地地址,再次执行`dad`

  • 如果没有收到上述`na`报文,则说明该临时链路本地地址是唯一的。然后就可以在接口上把该地址的状态更改为首选合法状态,以正式生效

  • 发送`rs`报文,以获得网络配置信息

  • 收到路由器回应的`ra`报文后,使用`ra`报文中的前缀自动生成地址。如果一直没收到`ra`报文,则使用`dhcpv6`来配置地址,即向代表`DHCPv6`服务器或中继的组播地址`FF02::1:2`和`FF05::1:3`发送`DHCPv6`请求报文,以完成地址配置。

  • 如果收到`ra`报文,则检查`ra`报文中的路由器生存期字段,如果值不为0,则将`ra`发送方设为自己的默认网关

  • 继续检查`RA`报文中的`M`位,如果是1,且未收到携带允许自动配置的前缀信息的`RA`报文,则只采用有状态`DHCPv6`获取地址。当收到允许自动配置的前缀信息的`RA`报文时,有状态`DHCPv6`和无状态自动配置将并存,且一般情况下无状态自动配置的地址的首选优先级高于有状态`DHCPv6`配置的地址。

  • 继续检查`RA`报文中的`O`位,如果是1,则采用`DHCPv6`获取地址外的其他参数信息。

  • 无论`RA`报文中的`M`位和`O`位是什么,只要收到携带有允许自动配置的前缀信息的`RA`报文,主机都将提取`RA`报文中所有的前缀。如果前缀状态为`Off-link`,则放弃将该前缀加入前缀列表(即路由表)中,只将状态是`On-link`的前缀加入自己的前缀列表中。

  • 继续检查前缀列表中每一个前缀的自动配置字段,如果允许自动配置,则自身生成基于`EUI-64`格式的标识符或以随机方式生成接口标识符,再加上前缀列表中的前缀以构成公用`IPv6`地址。默认也生成临时`IPv6`地址。

  • 对公用`IPv6`地址和临时`IPv6`地址做`DAD`,如果通过检测,则将地址状态转成首选状态。

主机的`ipv6`地址有4种状态:临时状态、首选状态、超时状态、无效状态。临时状态通过`dad`后变为首选状态,临时状态和首选状态都存在首选寿命。超过首选寿命后,则变为超时状态,除非在超时前通过重新获取的`ra`报文或`dhcpv6`报文刷新了首选寿命时间。超时状态下,该地址不会作为主机地址与外界通信,但仍有转为首选的可能。当超过一段时间后,地址将转为无效状态,最终从主机系统中删除

SLLAC

对于需要固定地址的服务器采用手动配置的方式比较合适,该工作一般由网络或系统管理员来完成。对于普通用户来说,自动配置`IPv6`地址的方式更为常见。`IPv6`地址的自动配置主要分为无状态和有状态。

  • 所谓无状态,就是指负责地址分配的网关或服务器并不需要关心和记录客户获得的`IPv6`地址,大多数情况下只是在`RA`报文中携带前缀信息选项并通告给客户端,由客户端提取报文中的前缀信息。如果前缀信息的自动配置标志位为1,则使用该前缀结合本机接口`ID`(`EUI-64`格式或随机接口`ID`)来生成公用地址和临时地址,若通过`DAD`则正式成为有效地址。这就是`RFC 2462`中定义的无状态地址自动配置(`Stateless Address Auto Configuration,SLAAC`)的工作原理,其工作步骤大致如下:
    • 客户端主机发送`RS`报文,源地址是通过`DAD`的以`FE80`开头的链路本地地址,目的地址是`FF02::2`。

file

  • 客户端主机收到`RA`报文。值得注意的是,`RA`报文的目标`IPv6`地址并不是发送`RS`时的源地址,而是`ff02::1`(所有`IPv6`节点的组播地址)。行号为2的目的`MAC`地址是组播MAC地址,行号为3的目的`IPv6`地址是`ff02::1`。这个过程相当于有一台主机发送`RS`报文来询问网关和前缀信息。路由器在收到`RS`报文后,并不是只针对发问的主机进行回答,而是向所有的`IPv6`节点发送了一个`RA`报文。当然,发送`RS`请求的主机也能收到这个`RA`报文。

file

  • 根据`RA`报文设置跳数限制、MTU等参数信息。如果路由器生存期字段不为0,则将`RA`发送方作为默认网关。在图中可以看到`hop limit`是64(行号4),`MTU`是1500(行号8),路由器生存期(`lifetime`)字段是1800(行号7)。

  • 提取`RA`报文中的所有前缀信息,将`On-link`标志位为1的前缀加入前缀列表(即路由表)中。在图中可以看到`On-link`标志位是1(行号11)。

  • 在前缀列表中,如果自动地址配置标志位为1,则用其前缀结合接口标识符生成公用地址。接口标识符既可以基于`EUI-64`格式,也可以是随机化接口标识符。在图中可以看到`Autonomous address-configuration flag`(自动地址配置标志位)是1(行号12)。

  • 进行`DAD`检测,直到公用地址成为有效地址。当系统允许使用临时(公用)地址时,还会多生成一个通过`DAD`的临时地址,并且在通信时将该地址作为首选地址。

在`IPv6`自动地址配置中,采用`SLAAC`配置的地址是最优先的。只要允许网关发送`RA`报文,且`RA`报文携带了允许用于自动配置地址的前缀,则无论是否启用了`DHCPv6`,启用自动配置地址的客户主机都会用收到的前缀自动生成`IPv6`地址,且这个地址首选的优先级高于`DHCPv6`获得的地址。一个`RA`报文携带的前缀选项的格式如下所示:

file

类型值为3表示选项为前缀选项(图中的行号9),前缀长度一般是64(图的行号10)。
需要注意的是,如果主机获取的前缀长度+接口标识符的长度大于128,那么将不能进行地址自动配置。

`L`位表示该前缀是否可以用于判断一个地址是否在本链路上,即前缀是`On-link`还是`Off-link`(图中的行号11)。如果是默认的`On-link`,则此前缀在路由表中有相应的表项,否则路由表中不会有此前缀。

`A`位表示该前缀是否可以用于地址自动配置。在`SLAAC`中,`RA`可以通告多个前缀,但至少得有一个前缀的`A`位是1(图中行号12),才能保证主机能获得至少一个前缀用于地址的自动配置。

前缀有两个生存期:一个是有效寿命(图中的行号13,2592000秒对应的时间是30天);另一个是首选寿命(图中的行号14,604800秒对应的时间是7天),且有效寿命不小于首选寿命。
对于一个在首选寿命内使用前缀构造的地址,主机的任何应用都可以不受限制地使用该地址。
如果超过了首选寿命,但还没超过有效寿命,则老的应用还可以继续使用这个前缀构造的地址,但新的应用不允许再使用该前缀构造的地址。若前缀构造的地址超过了有效寿命,则任何应用都不再使用该地址。

`SLAAC`是最简单也是最常用的`IPv6`地址配置方式,它的优点是配置简单,支持几乎所有的网络终端。
尽管`SLAAC`很便利,但它至少有3个缺点:

  1. 路由器网关或服务器并不记录客户主机分配的`IPv6`地址信息,不利于溯源管理等;
  2. 不能为指定主机或终端分配固定的`IPv6`地址;
  3. 客户主机只能获得可通信的全局`IPv6`地址,并不能获取到其他诸如`IPv6 DNS`等信息,只能在客户主机是双栈的情况下依赖`IPv4`的`DNS`来保证与互联网的正常通信。

所以,`SLAAC`一般在`IPv6`部署早期使用。

  • 实验:`slaac`实验配置
    本实验将演示如何在路由器等三层设备上配置发送`RA`报文,以使主机进行`SLAAC`(无状态地址自动配置)。
    只要修改`RA`报文前缀选项中的`L`位和`A`位,就可以确定某些前缀是否可以用于自动配置,以及是否可以将前缀加入主机的前缀列表(即路由表)中。
    对于主机来说,只要开启地址自动配置即可。
    在本实验中,路由器接口配置了多个地址,对每个地址对应的前缀进行不同的配置,并观察在客户主机上获取`IPv6`地址的情况,以加深对`SLAAC`的理解。
  1. 基本配置。`R1`的配置如下
    Router#config terminal
    Router(config)#ipv6 unicast-routing
    Router(config)#interface eth0/0
    Router(config-if)#ipv6 enable
    Router(config-if)#ipv6 address 2017::1/64
    Router(config-if)#ipv6 address 2018::1/64
    Router(config-if)#ipv6 address 2019::1/64
    Router(config-if)#ipv6 address 2020::1/64
    Router(config-if)#ipv6 address 2021::1/64
    Router(config-if)#ipv6 nd prefix 2017::/64  no-advertise       不通告前缀
    Router(config-if)#ipv6 nd prefix 2018::/64 3600 1800 off-link  前缀处于off-link状态
    Router(config-if)#ipv6 nd prefix 2019::/64 3600 1800 no-onlink     前缀处于no-onlink状态
    Router(config-if)#ipv6 nd prefix 2020::/64 3600 1800 no-autoconfig  前缀不用于自动配置
    Router(config-if)#no shutdown

为了说明不同的前缀选项所产生的不同效果,这里给同一个接口配置了5个`IPv6`地址,同时对5个地址对应的前缀进行不同的配置处理,以观察客户主机的情况。
配置中的3600表示3600秒,是前缀的有效寿命;1800表示1800秒,是前缀的首选寿命。
在默认情况下,系统会通告每一个前缀,且`on-link`和`autoconfig`都是1,以表示此前缀用于地址的本地链路检测和地址自动配置,这也是`SLAAC`中最基本的配置要求。
本实验默认允许发送`RA`报文,但`RA`携带不同的前缀选项,具体如下。

  • 不通告`2017::/64`前缀。客户主机不能得到这个前缀的相关信息。
  • 通告`2018::/64`前缀,但该前缀处于`off-link`状态,`autoconfig`为默认值,即允许自动配置。
  • `2019::/64`与`2018::/64`一样,前缀都会被通告。`no-onlink`和`off-link`是同一个意思,表示该前缀不加入主机前缀列表(即路由表)中。
  • `2020::/64`前缀不允许自动配置,但默认处于`on-link`状态,即该前缀会加入主机的前缀列表(即路由表)中。
  • 配置中没有对前缀`2021::/64`进行额外的配置,也就是保持其默认值,该前缀会通告,也会被加入主机的前缀列表(即路由表)中。
  1. 验证。打开`Win10`主机,将网卡设置成自动获取`IPv6`地址,然后使用`ipconfig`命令查看自动获取的`IPv6`地址,

file

从图中可以看到:`2017::/64`前缀因为没有通告,所以没有用于`IPv6`地址的前缀;
`2020::/64`前缀因为指明了`no-autoconfig`(不用于自动配置),所以也没有用于`IPv6`地址的前缀;
`2018::/64、2019::/64`和`2021::/64`的`autoconfig`都是1,即允许自动配置,所以这3个前缀都用于地址的自动配置。

至于`on-link`和`off-link`的差别,就要查看主机的路由表了。可使用命令`route print -6`查看:

file

从图中可以看出,在主机的`IPv6`路由表中,由于`2018::/64`和`2019::/64`都是`off-link`状态,所以路由表中并没有这两个64位前缀,只有128位的主机路由。
有意思的是,`2020::/64`前缀虽然不允许自动配置,即主机的`IPv6`地址中没有这个前缀构成的地址,但这个前缀却加入了主机的路由表中,可以不用理会。
`2021::/64`是正常的默认值,64位前缀和128位主机路由都存在。

这个实验只是为了说明如何配置前缀选项,以及前缀选项对主机获取地址及前缀列表(路由表)的影响。
实际应用中一般只需要配置一个`IPv6`地址,且允许发送`RA`报文即可。
配置的`IPv6`地址所对应的前缀默认就会作为`RA`报文的前缀选项发送给同网段内的主机,以用于地址自动配置并加入主机的前缀列表中。

有状态dhcpv6

考虑到`sllac`的缺点,`RFC 3315`提出了`dhcpv6`的地址配置方式。在以下3种情况下,采用自动配置的客户主机将使用`DHCPv6`来获取地址。

  • 1.如果客户主机在发送`RS`报文后未收到任何`RA`报文,则客户主机默认使用`DHCPv6`来获取地址和相关参数。
  • 2.即便收到`RA`报文,但`RA`报文并没有携带用于地址自动配置的前缀信息,那么客户主机仍然也会采用`DHCPv6`来获取地址。
  • 3.如果收到的`RA`报文中携带有用于地址自动配置的前缀信息,主机也将采用`DHCPv6`来获取地址。

相对于`SLAAC`,`DHCPv6`是一种有状态地址配置协议,即`DHCPv6`服务器会`像DHCPv4`那样分配除了默认网关信息的完整的`IPv6`地址,并记录`IPv6`地址与主机的对应关系。

需要注意的是,`DHCPv6`服务器默认情况下记录的是`IPv6`地址与客户主机的身份关联标识符(`Identity Association Identifier,IAID`)和`DHCP`唯一标识符(`DHCP Unique Identifier,DUID`)的对应关系,而不是像`IPv4`网络那样记录`IP`与`MAC`地址的对应关系。大多数情况下,客户主机`DUID`的末48位为接口的物理地址,因此可以像`DHCPv4`那样做到溯源追踪。

要想使用有状态`DHCPv6`,可以在路由器网关的`RA`中设置`M`位为1,以通知客户主机使用`DHCPv6`来获取`IPv6`地址。
另外,`O`标志位设置为1时表示将通过`DHCPv6`获取`IPv6`地址外的其他参数信息,比如`IPv6 DNS`地址等。
同时必须屏蔽网络中可能导致`SLAAC`的其他`RA`报文,当网络中既有`DHCPv6`服务器(或中继),`RA`报文也携带用于地址自动配置的前缀时,主机可通过`SLAAC`获取地址,也可通过`DHCPv6`获取地址。
由于`SLAAC`获取的地址的首选优先级比`DHCPv6`获得的地址首选优先级要高,所以会导致主机无法使用通过`DHCPv6`获得的地址。为了避免这种情况的发生,在确定使用有状态`DHCPv6`时,一定要禁止`SLAAC`。

`DHCPv6`的通信过程与`DHCPv4`的一样,都是服务器和客户主机在不同的`UDP`端口上进行监听。
服务器本地监听端口为547,客户机本地监听端口为546端口。

file

上图为捕获的`DHCPv6`通告报文。
图中的行号1是`DHCPv6`客户端发送的地址查询(`Solicit`)报文,这是一个组播报文,源`IPv6`地址是链路本地地址,目的IPv6地址是`ff02::1:2`。
行号2是`DHCPv6`服务器对`DHCPv6`客户端请求的通告(`Advertise`)报文,这是一个单播报文,源`IPv6`地址是`DHCPv6`服务器的`IPv6`地址,目的`IPv6`地址是`DHCPv6`客户端的链路本地地址。
行号3是`DHCPv6`客户端的请求(`Request`)报文,这是一个组播报文,源`IPv6`地址是链路本地地址,目的`IPv6`地址是`ff02::1:2`。
行号4是`DHCPv6`服务器的回答(`Reply`)报文,这是一个单播报文,源地址是`DHCPv6`服务器的`IPv6`地址,目的`IPv6`地址是`DHCPv6`客户端的链路本地地址。

通过图中第8行可以看出,`DHCPv6`报文是`UDP`报文,服务器的端口是547,客户端的端口是546。
`DHCPv6`服务器及中继都会加入本地链路多播地址组`ff02::1:2`中。
初次通信时,客户主机会向本地链路多播地址发送`DHCPv6`查询报文,服务器会直接回应`DHCPv6`查询报文,中继则转发该报文到指定的`DHCPv6`服务器上。

DUID和IAID

在`DHCPv6`中,服务器、中继或客户主机有且只有一个`DUID`。
图中的行号16是`DHCP`服务器的`DUID`,行号25是`DHCP`客户端的`DUID`。
`DUID`用于在交换`DHCPv6`报文时彼此验证身份,即服务器使用`DUID`来识别不同的客户端,客户端则使用`DUID`来识别服务器。
客户端`DUID`和服务器`DUID`的内容分别通过`DHCPv6`报文中的`Client Identifier`(行号21)和`Server Identifier`(行号12)选项来携带。
这两个选项的格式是一样的,通过`Option`字段的取值来区分是`Client Identifier`(字段值1)还是`Server Identifier`(字段值2)选项。

`RFC3315`中规定`DUID`不允许用于其他用途,它的长度是可变的,但不能超过128字节,且一旦`DUID`固定,中途不允许更改。
`DUID`的类型主要有3种:`DUID-LL(Link-Layer address)`,最常用;`DUID-LLT(Link-Layer address plus Time)`;硬件厂商自定义的`DUID`。
通常情况下,`DUID`组成部分的末48位就是接口的`MAC`地址。

身份关联(`Identity Association,IA`)是服务器和客户主机都能识别、分组及管理的一个`IPv6`地址结构,这个地址结构包括一个`IA`的标识(即`IAID`)和相关联的配置信息。
在`DHCPv4`中,客户主机只需要携带自身的`MAC`地址就可以向服务器申请地址,而在`DHCPv6`环境下,客户主机在`DHCPv6`申请报文中携带的是一个地址结构,即`IA`。
通常情况下,请求报文的`IA`结构至少包括(`DUID,IA-TYPE,IAID`)三元组。其中`DUID`是客户主机的标识符,`IA-TYPE`是需要申请到的地址类型,主要包括非临时地址(`Non-temporary Address,IA-NA`)、临时地址(`Temporary Address,IA-TA`)和前缀分配(`Prefix Delegation,IA-PD`)。
其中`IA-NA`最常见,`IA-PD`用来标识客户主机申请的不是地址而是前缀

一个`DHCPv6`客户主机必须为每个接口至少分配一个`IA`以向服务器申请地址或前缀,`IAID`可唯一地标识一个`IA`。同一个客户主机的`IAID`不能重复出现,`IAID`也不能因主机重启等原因丢失或改变。
`IA`中的配置信息(分配给客户主机的`IA-NA`地址等)由服务器来分配,一个`IA`也可以包含多个地址信息。

简单的理解就是,`DHCPv6`客户主机的接口使用携带`IAID`标识的`IA`去向服务器申请地址或前缀(类型由`IA-TYPE`决定,以`IA-NA`最常见),服务器以`IA`为分配单元,将分配的地址或前缀等信息回复给客户主机,同时在本地记录下分配情况表。

一个客户主机只能有一个`DUID`,但每个接口至少有一个`IA`。对于`Windows`主机来说,可以使用命令`ipconfig /all`来查看`IAID`和`DUID`

file

对于支持`IPv6`的路由器/交换机等网络设备来说,可以使用命令`show ipv6 dhcp`来查看`DUID`,结果如下:

Router#show ipv6 dhcp
This device's DHCPv6 unique identifier(DUID): 00030001AABBCC000100

可以使用命令`show ipv6 dhcp interface`来查看`DUID`和接口的`IAID`,结果如下:

file

DHCPv6常见报文类型

`DHCPv6`报文封装在`UDP`中,不同类型的报文有着不同的用途。常见的报文类型如下。

  • `Solicit`报文:类型值为1,客户主机以组播形式发送该报文,用于寻找`DHCPv6`服务器。上图行号1就是`Solicit`报文,可在`Info`栏下看到Solicit字样。

  • `Advertise`报文:类型值为2,服务器用此报文回复客户主机的`Solicit`报文,此报文是单播报文。上图行号2就是`Advertise`报文,在行号10中可以看到“Message Type:AdAdvertise(2)”。此报文中包括DHCPv6服务器要分配的IPv6地址等信息。

  • `Request`报文:类型值为3,客户主机以组播方式发送此报文,选择分配`IPv6`地址等信息的服务器。行号3就是`Request`报文。
    既然是选择分配`IPv6`地址的服务器,为何不是单播报文呢?
    试想一下,如果网络中有2台`DHCPv6`服务器,它们都会收到客户主机的`Solicit`报文,都会分配`IPv6`地址,客户主机可能选择的是某一台`DHCPv6`服务器分配的`IPv6`地址,客户主机使用组播报文通告它选择了某台`DHCPv6`服务器分配的`IPv6`地址,另一台没被选择的`DHCPv6`服务器也会收到此组播报文,得知自己没有被选择,收回分配出去却没有被选择的`IPv6`地址。
    简言之,就是客户主机使用`Request`组播报文通告它选择了谁,没有选择谁。

  • `Reply`报文:类型值为7,用于回复`Request`等报文,此报文是单播报文。行号4就是`Reply`报文。

  • `Release`报文:类型值为8,客户主机用此报文通知服务器释放地址。

  • `Decline`报文:类型值为9,客户主机用此报文通知服务器分配的地址已被占用。

  • `Information-request`报文:类型值为11,客户主机使用此报文向服务器申请地址之外的其他参数,如`DNS`等信息。需要注意的是,在`DHCPv4`中,可以分配默认网关地址和`IP`掩码给客户主机,但在`DHCPv6`中,并不能分配默认网关地址,默认网关地址仍然需要`RA`报文来完成。

  • `Relay-forward`报文:类型值为12,当服务器与客户主机不在同一网段时,通信由中继代理完成。中继代理使用该报文封装客户主机的`Request`报文并转发到服务器。

  • `Relay-reply`报文:类型值为13,服务器使用此报文封装回复消息并转发到中继代理。中继代理对服务器与客户端之间的通信进行封装和拆封。

在`DHCPv6`中,地址请求报文是由类型值为3的`Request`报文来完成的,而`DNS`等参数信息则是由类型值为11的`Information-request`报文来完成的。
`Relay-forward`报文和`Relay-reply`报文用于在服务器和中继代理之间通信,与客户主机无关。
`DHCPv6`不能为客户主机分配默认网关地址,而且在客户主机上也无法看到`DHCPv6`服务器的地址,这一点与`DHCPv4`不同。

DHCPv6地址分配流程

`DHCPv6`的地址分配流程与`DHCPv4`的类似,大致流程如下:

  • `DHCPv6`客户主机向组播地址`FF02::1:2`发送查询(`Solicit`)报文,寻找`DHCPv6`服务器。客户主机也可以携带`rapid-commit`选项以快速申请地址。

  • `DHCPv6`服务器收到`Solicit`报文后,如果`Solicit`报文中携带有`rapid-commit`选项,且服务器自身支持`rapid-commit`,则直接为客户主机分配完整的`IPv6`地址,地址分配完成。否则,服务器向客户主机发送单播报文,通告(`Advertise`)报文中携带可以为客户主机提供地址和其他网络参数。

  • 客户主机向服务器发送组播`Request`报文,通告它选择了哪台`DHCPv6`服务器为其分配的`IPv6`地址。

  • 服务器发送`Reply`报文,被选中的`DHCPv6`服务器发送`Reply`报文,确认把该`IPv6`地址分配给客户主机。

  • 客户主机在获得`IPv6`地址后,仍然要进行`DAD`,通过检测后地址才能使用。

  • 实验:路由器做`dhcpv6`服务器分配
    在`IPv4`环境下,我们经常使用路由器和交换机作为`DHCP`服务器来为客户主机分配地址,并且可以通过查看`DHCP`绑定表来追踪具体的分配情况。
    在`IPv6`环境下,很多主流厂商的网络设备也已经可以作为`DHCPv6`服务器来分配地址或其他信息了。
    本实验以思科路由器通过`DHCPv6`为交换机和`Win10`分配`IPv6`地址为例,介绍如何在思科路由器上配置`DHCPv6`服务器和查看地址分配情况。
    另外,在同时开启`DHCPv6`和`SLAAC`的情况下,观察`Win10`主机获得地址的情况。

  1. 恢复`Win10`的初始配置。由于前面在`Win10`计算机上做了不少实验,难免会对后面的实验产生影响,可右键单击`Win10`,从快捷菜单中选择`Wipe`,清除`Win10`的所有配置。
    后续实验中都可以采取这种方法恢复设备的默认配置。读者可能认为把设备删除,然后再重新添加一台设备,这也算将设备恢复到默认设置。但在实验中发现并不是这样的,某个实验拓扑之前可能添加或删除过一些设备,但新添加的设备`ID`会继续使用以前删除的设备`ID`,原设备`ID`关联的临时文件可能仍然存在,这可能会导致添加的是一台路由器,但开机后却发现是一台`Windows`服务器的情况。因此,建议使用`Wipe`恢复默认配置。

  2. 基本配置。

    Router#config terminal
    Router(config)#ipv6 unicast-routing
    Router(config)#ipv6 dhcp pool dhcpv6       定义一个IPV6 DHCP分配池,名称是dhcpv6
    Router(config-dhcpv6)#address prefix 2019::/96             定义地址分配范围
    Router(config-dhcpv6)#dns-server 240c::6666             定义下发给客户主机的DNS地址
    Router(config-dhcpv6)#exit
    Router(config)#service dhcp      启用DHCP服务,思科路由器默认启用了配置,因此可以省略。
    Router(config)#interface eth0/0
    Router(config-if)#ipv6 enable
    Router(config-if)#ipv6 address 2019::1/64
    Router(config-if)#ipv6 nd managed-config-flag      设置M位,告诉客户主机使用DHCPv6分配地址
    Router(config-if)#ipv6 nd other-config-flag      设置O位,告诉客户主机使用DHCPv6分配其他信息
    Router(config-if)#ipv6 nd prefix 2019::/64 3800 1900 no-autoconfig    通告前缀,但禁止分配地址
    Router(config-if)#ipv6 dhcp server dhcpv6 rapid-commit     使用DHCPv6地址池为主机进行分配
    Router(config-if)#no shutdown

针对该步骤,需补充以下6点说明:

  • 1.本实验所使用的思科路由器暂不支持定义起始地址到终止地址范围的地址池,但是可以通过设置地址池中的前缀位数来确定范围。
    这个前缀位数的值一定要大于接口地址本身的前缀位数值。如`2019::/96`,对于128位的`IPv6`地址来说,只有128-96=32位可用来分配地址,所以可分配的地址范围就是2`019::0000:0000~2019:: FFFF:FFFF`。当然,在具体分地址时,并不一定是按照从小到大或从大到小的顺序分配。

  • 2.`DHCPv6`不能像`DHCPv4`那样下发网关地址,因此还是要依靠`RA`报文来通告网关地址信息。不能使用`ipv6 nd ra suppress`命令抑制发送`RA`报文。

  • 3.设置`M`位的目的是告知客户主机使用`DHCPv6`获取地址,设置`O`位的目的是告知客户主机使用`DHCPv6`获取地址之外的其他参数,如`DNS`等。
    这里可以省略`M`位和`O`位的设置,客户主机使用`SLAAC`获取地址时,也会使用`DHCPv6`。
    可以去掉设置`M`位和`O`位的这两条命令,验证是否影响结果。
    当然,设置`M`位和`O`位是更严谨的做法,也是为了更快地告知客户主机使用`DHCPv6`,虽然这也不能阻止客户主机在具备通过`SLAAC`获取地址条件时使用`SLAAC`来获取地址。

  • 4.为了只使用`DHCPv6`来分配地址,需要禁止路由器接口分配`IPv6`地址。
    这里不使用`ipv6 nd prefix 2019::/64 no-advertise`命令的原因是,该命令不通告前缀,当然客户端也就无法获取`IPv6`地址。
    而且由于没有通告前缀,客户主机上就没有`2019::/64`的路由(可以使用`route print-6`命令验证)。
    这样客户主机访问`2019::/64`同网段的终端时,数据包也会被发往默认路由(即路由器),虽然也能通信,但降低了效率。

  • 5.在接口下引用`DHCPv6`地址池时,使用命令`ipv6 dhcp server`自定义`DHCPv6`地址池,推荐再带上`rapid-commit`选项,这样客户主机若希望通过`rapid-commit`寻找DHCPv6服务器来获取地址,那么可以减少两次通信,从而快速、直接地为客户主机分配地址。

  • 6.路由器在作为`DHCPv6`服务器使用时,其用法与作为`DHCPv4`服务器使用时不同。
    在`IPv4`环境下,在定义好地址池后,地址池中的地址段与哪个接口相匹配,就自动为那个接口的客户端分配接口所在网段的地址,不需要单独在接口下指定使用地址池中的哪个地址段。
    而在`IPv6`环境下,必须在接口下指定使用哪个地址池,这也意味着地址池中定义的前缀与接口本身的前缀可以不一致,即客户主机获取到的地址的前缀与网关接口地址的前缀不一样。
    路由器有多个接口、多个地址池时,配置时一定要多加注意,避免把地址池配错接口,导致虽获取到地址却无法正常通信的情况。

  1. `DHCP`终端验证。打开`Win10`,将网卡设置成自动获取`IPv6`地址和`DNS`地址,建议禁止`IPv4`。然后在命令提示符下使用命令`ipconfig /all`查看主机获取地址的情况,

file

主机获取到了地址`2019::acc9:fdf3`,此地址在`2019::/96`范围之内,并有获得租约的时间和租约过期的时间`。Win10`主机还自动获取到了`DNS`服务器地址。与`IPv4`不同的是,这里不显示`DHCPv6`服务器的`IPv6`地址。

  1. 在路由器上验证。在路由器上使用命令`show ipv6 dhcp binding`查看`IPv6`地址的分配情况,结果如下所示。
    Router#show ipv6 dhcp binding 
    Client: FE80::8467:B31F:DBD3:6847 
    DUID: 0001000124119D48500000030000
    Username : unassigned
    VRF : default
    IA NA: IA ID 0x03500000, T1 43200, T2 69120
     Address: 2019::C661:1994
              preferred lifetime 86400, valid lifetime 172800
              expires at Mar 16 2016 08:53 PM (172470 seconds)

从上面的输出可以看到,客户端的链路本地地址、`DUID`、申请类型`IA NA`(即非临时地址)、`IA ID`(路由器上显示的是十六进制`0x03500000`,换算成十进制是55574528)等都与计算机上显示的一致。
`T1`和`T2`分别是地址更新时间和地址重新绑定时间,一般不用关心。
分配的地址就是在客户主机上看到的地址`2019::c661:1994`,此地址也有首选生存时间和有效生存时间。

  1. 对`于Win10`主机来说,`DHCPv6`客户端软件是系统默认自带的,当`Win10`将`IPv6`地址设置成自动获取时,就默认允许以`SLAAC`和`DHCPv6`两种方式获取地址。对于网络设备来说,虽然接口也支持自动配置,但需要明确指明是使用`SLAAC`还是`DHCPv6`来获取地址。对交换机进行如下配置:
    Switch#config terminal
    Switch(config)#interface vlan 1
    Switch(config-if)#ipv6 enable
    Switch(config-if)#ipv6 address ?
    WORD                     General prefix name
    X:X:X:X::X            IPv6 link-local address
    X:X:X:X::X/<0-128>    IPv6 prefix
    autoconfig            Obtain address using autoconfiguration    自动配置
    dhcp                   Obtain a ipv6 address using dhcp       使用DHCP配置
    Switch(config-if)#ipv6 address dhcp rapid-commit       在VLAN 1接口调用DHCP地址池
    Switch(config-if)#no shutdown

命令中的`rapid-commit`是可选的,当客户主机使用了该选项,但服务器并不支持该选项时,仍然需要4次报文交互来完成地址的自动配置,这并不影响`DHCPv6`的地址分配。再通过命令s`how ipv6 interface brief vlan 1` 查看获取到的地址,如下所示:

Switch#show ipv6 interface brief vlan 1
Vlan1                  [up/up]
    FE80::A8BB:CCFF:FE80:200
    2019::2527:DE17

无状态dhcpv6

所谓无状态`DHCPv6`,是指除了地址信息之外的其他参数信息由`DHCPv6`服务来分配,且地址的分配还是采用无状态自动配置的。
换句话说,无状态`DHCPv6`相当于`SLAAC`(地址分配)+`DHCPv6`(其他参数信息分配,如`DNS`、域名等)。
当还没有`DHCPv6`服务器,但又想向用户下发`IPv6 DNS`地址信息时,就可以采用无状态`DHCPv6`。

无状态`DHCPv6`配置主要就是网关路由器的配置。配置要点如下所示。

  • 允许发送`RA`报文。在`RA`报文中设置`O`位,但不设置`M`位,告诉客户主机将使用`DHCPv6`获取地址之外的参数,地址仍然是通过`SLAAC`无状态自动配置获取的。
  • `RA`报文中需携带允许自动配置的前缀信息,便于客户主机提取前缀,再加上自身生成的接口标识符,最终形成完整的`IPv6`地址。`RA`报文也向客户主机通告了默认网关。
  • `DHCPv6`服务不配置前缀或地址池,只配置`DNS`等其他参数。
  • 网关路由器接口下需指定`DHCPv6`地址池或`DHCPv6`中继地址。

网关路由器的通用配置参考如下:

Router#config terminal
Router(config)#ipv6 unicast-routing
Router(config)#service dhcp
Router(config)#ipv6 dhcp pool                             DHCPv6定义不包含地址信息的地址池
Router(config-dhcpv6)#dns-server 240c::6666
Router(config-dhcpv6)#domain-name  abc.com
Router(config-dhcpv6)#interface ethernet0/0
Router(config-if)#ipv6 enable
Router(config-if)#ipv6 address 2019::1/64
Router(config-if)#ipv6 nd other-config-flag                 设置O位
Router(config-if)#ipv6 dhcp server dhcpv6
Router(config-if)#no shutdown

ipv6地址的多样性和优选配置

IPv6地址与IPv4地址除格式不同外,IPv6地址的多样性和源地址选择的复杂性也远远超过IPv4
IPv4地址要么是手动静态配置,要么是通过DHCP分配,二者只能选其一。

IPv6的地址可以是手动静态配置、可以是SLAAC(可能还存在公用地址和临时地址)、还可以是有状态DHCP配置,同时还存在链路本地地址,关键是这些类型的IPv6地址可以在一台IPv6设备上同时存在。
这样算来,一台IPv6设备最多会同时存在5种类型的IPv6地址。
假如这些类型的IPv6地址中有多种类型同时存在,那么在设备访问外部网络时,源IPv6地址默认选择的是哪一类的IPv6地址呢?
在某些特殊的应用场合下,应该如何控制且使用某类IPv6地址呢?例如,有下列的一些特殊应用场合。

  • 有安卓的客户端,如安卓手机。
    存在问题:目前安卓系统尚不支持DHCPv6,静态手动配置也几乎不可能。解决思路:DHCPv6和静态手动配置都不可取的情况下,只能选择SLAAC

  • 设备经常被外部网络访问,IPv6地址需要长期固定。
    存在问题:在SLAAC的情况下,设备一般会生成临时IPv6地址和公用IPv6地址,临时IPv6地址会周期性改变,但公用IPv6不会改变。
    解决思路:公用IPv6相对稳定,把公用IPv6地址向外发布就可以了。
    考虑到公用IPv6地址默认采用接口随机标识符,很难控制,也可以采用手动静态配置的方式。
    考虑到不同终端不同操作系统不同版本的差异,比较稳妥的方式是禁用路由器的前缀通告或禁用路由器的地址分配,只配置静态IPv6地址。

  • 设备需要访问远程服务器,远端的安全设备要求只能是指定的IPv6地址才能访问。
    存在问题:设备主动访问外部网络,在默认情况下,临时IPv6最优先,临时IPv6经常变没办法固定,那就禁用临时IPv6地址。公用IPv6地址采用随机接口标识符,也不好提前确定。解决思路:禁用路由器的前缀通告或禁用路由器的地址分配,给终端配置指定的静态IPv6地址。

  • 需要记录IPv6地址的分配状态。
    存在问题:在SLAAC的情况中,路由器只是通告前缀信息,并不记录IPv6地址的分配情况;静态配置虽可以登记IPv6地址的分配状态,但配置的工作量较大且容易出错,对一些无线终端设备,手动配置几乎是不可能。
    解决思路:禁用SLAAC配置,禁用手动静态配置,采用DHCPv6配置,对一些有IPv6地址特殊要求的终端,可以采用DHCPv6地址保留的方式进行指定。

Win-10计算机没有手动配置网关的情况下:临时IPv6>公用IPv6>手动静态配置IPv6DHCPv6不能早于静态配置,否则DHCPv6优先)>DHCPv6

Win-10计算机手动配置网关的情况下:临时IPv6>手动静态配置IPv6DHCPv6不能早于静态配置,否则DHCPv6优先)>DHCPv6>公用IPv6

最后修改日期: 2024年7月10日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。