5、什么是IPv6 DAD?

在了解什么是IPv6 DAD之前、我们先来看看下面几种IPv6地址类型。在前面我们也介绍了多种IPv6地址类型,以及各种IPv6地址的含义和应用场景。在IPv6网络中,节点和路由器的接口在开启IPv6协议栈时无须配置也会自动生成IPv6的链路本地地址。由于IPv6大量使用组播替代了广播,因此节点或路由器的接口会自动加入一些组播地址组中。

5.1、常用IPv6地址

1、节点常用IPv6地址

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

链路本地地址:以FE80::/64打头,每个接口只要启用了IPv6协议,就会有链路本地地址,它是诸如自动地址配置、邻居发现等机制的基础。

环回地址:即::1地址,主要用于测试本地主机上的协议是否完整安装以及是否可以正常通信。

所有节点组播地址:FF01::1和FF02::1地址。前者很少用到,是节点本地作用域的所有节点地址;后者是本地链路作用域的所有节点地址。

单播地址:一般是申请后分配到的地址,在2000::/3范围内。

被请求节点组播地址:由FF02::1:FF00/104附加上单播地址的末24位组成,用于邻居发现和DAD等机制。

主动加入的组播地址:FF00::/8地址。该地址是可选地址,在特定的组播应用中使用。

2、路由器常用IPv6地址

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

链路本地地址:与节点的链路本地地址一样,只要接口启用了IPv6协议,就会有链路本地地址。若链路本地地址没有通过DAD,还需手动配置。

所有路由器组播地址:FF01::2、FF02::2和FF05::2都表示所有路由器组播地址,但表示的范围不同。

单播地址:一般是在2000::/3范围内的全球范围单播地址,但在实验环境中可以使用任何合法的IPv6地址。

任播地址:与单播地址一样,加上anycast以说明是任播地址。

被请求节点组播地址:类似于主机节点的被请求节点组播地址,这里不再赘述。

组播应用相关地址:当路由器运行PIM组播路由时代表所有PIM路由器的FF02::D;以及接口运行组播监听发现(Multicast ListenDiscovery,MLD)使用的地址FF02::16均是组播应用相关的地址。当思科路由器运行了PIM组播路由协议时,执行命令ipv6
multicast-routing,然后再执行命令show ipv6 interface,就可以看到这两个地址。

DHCPv6相关地址:DHCPv6服务器或中继器的FF02::1:2地址,以及本地站点范围内的所有DHCPv6服务器地址FF05::1:3,均是
DHCPv6相关地址。

以上都是主机节点和路由器常用的IPv6地址,当以后见到这些地址时,就可以知道这些地址各是什么用途。

5.2、IPv6 DAD

在了解了常用的IPv6地址类型之后、我们一起来看看什么是DAD。IPv6与IPv4一样,不管主机节点是手动配置地址还是自动获取地址,在地址正式生效之前,都需要判断此地址在网络中是否已被使用。在IPv4网络中,地址是通过发送ARP报文来检查的,在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地址是33:33:FF:34: 56:78(前16位固定为33:33,后32位是目的地址的末32位,即被请求节点组播地址的最后32位FF:34:56:78),NS报文中的目标地址字段中的值就是2001::1234:5678

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

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

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

5.3、DAD检测实验

我们通过下面的实验来演示IPv6 DAD的检测过程,并通过抓包讲解NS和NA报文格式,观察IPv6地址冲突现象,解决IPv6地址冲突问题。

image-20220120102811508

开启R1、Switch和Win10这3台设备;。先在Win10的e0接口抓包,然后再配置R1,如下所示:

R1#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R1(config)#host R1
R1(config)#ipv6 unicast-routing
R1(config)#int e0/0
R1(config-if)#ipv6 enable
R1(config-if)#ipv6 add 2001::1234:5678/64
R1(config-if)#no shu
R1(config-if)#

在从Win10上捕获的数据包中找到编号为83的数据包,如下图所示。捕获的数据包编号有极大的可能不是83,可以通过查找源地址“::”,或查找Info是“NeighborSolicitation”的报文,迅速找到该数据包,满足这两种格式的报文不会很多。

image-20220123205814673

R1#show interface e0/0
Ethernet0/0 is up, line protocol is up
  Hardware is AmdP2, address is aabb.cc00.0100 (bia aabb.cc00.0100)
  Internet address will be negotiated using DHCP
  MTU 1500 bytes, BW 10000 Kbit/sec, DLY 1000 usec,
     reliability 255/255, txload 1/255, rxload 1/255
  Encapsulation ARPA, loopback not set
  Keepalive set (10 sec)
  ARP type: ARPA, ARP Timeout 04:00:00
  Last input 00:00:01, output 00:00:02, output hang never
  Last clearing of "show interface" counters never
  Input queue: 0/75/1733/0 (size/max/drops/flushes); Total output drops: 0
  Queueing strategy: fifo
  Output queue: 0/40 (size/max)
  5 minute input rate 0 bits/sec, 0 packets/sec
  5 minute output rate 0 bits/sec, 0 packets/sec
     387435 packets input, 36544545 bytes, 0 no buffer
     Received 174658 broadcasts (0 IP multicasts)
     0 runts, 0 giants, 0 throttles
     0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
     0 input packets with dribble condition detected
     234402 packets output, 31521027 bytes, 0 underruns
     0 output errors, 0 collisions, 2 interface resets
     9989 unknown protocol drops
     0 babbles, 0 late collision, 0 deferred
     0 lost carrier, 0 no carrier
     0 output buffer failures, 0 output buffers swapped out
R1#

如上图、行号1是捕获的被请求节点组播地址的报文;行号2是数据帧的目的MAC地址,即33:33:ff:34:56:78;行号3的MAC是数据帧的源MAC地址aa:bb:cc:00:01:00,可以在R1上使用show interface e0/0命令来验证源MAC是否为R1的e0/0接口的MAC地址(如上);行号4是网络层的源IPv6地址“::”;行号5是网络层的目的IPv6地址ff02::1:ff34:5678,是被请求节点的组播IPv6地址;行号6是目标IPv6地址2001::1234:5678,我们的目的就是查找这个IPv6地址是否在网络中存在。

下面我们开始配置冲突的IPv6地址;配置完完R1的IPv6地址后,R1发送DAD的NS报文,但没有收到相应的NA报文,这说明网络中不存在冲突的IPv6地址,地址配置生效。在Win10上使用ipconfig命令查看当前的IPv6地址,然后手动给Win10静态配置与路由器一样的IPv6地址2001::1234:5678/64。Win10的IPv6地址配置不像IPv4一样会提示地址冲突,配置完成后,可以使用ipconfig命令验证配置的IPv6地址是否生效。若没有看到这个静态配置的IPv6地址,说明DAD失败。

在Win10上手动配置静态IPv6地址时,也会进行DAD操作。由于路由器接口已经配置了IPv6地址2001::1234:5678,所以Win10发出的NS报文会收到相应的NA报文。查看Win10上捕获的数据包,找到对应的NA报文,即图4-3中编号为456的报文。在下图中也可以看到编号为160的NA报文,这是由Win10发出的:

image-20220123211255871

注:该NA报文的目标IPv6地址是ff02::1(即所有节点组播地址),本地链路上的所有IPv6节点都能收到这个报文。当Win10收到该报文后表示DAD失败,IPv6地址配置失败。

我们再次配置冲突的IPv6地址,这里我们手动修改Win10的IPv6地址为2001::1234:5679,然后通过下面的配置把R1的e0/0接口IPv6地址也配置成2001::1234:5679:

image-20220123211504603

R1(config)#int e0/0
R1(config-if)#ipv6 add 2001::1234:5679/64
R1(config-if)#
*Jan 24 20:17:17.332: %IPV6_ND-4-DUPLICATE: Duplicate address 2001::1234:5679 on Ethernet0/0
R1(config-if)#

注:路由器配置界面中会提示*Jan 24 20:17:17.332: %IPV6_ND-4-DUPLICATE: Duplicate address 2001::1234:5679 on Ethernet0/0,表示IPv6地址冲突。在路由器上使用show ipv6 int e0/0命令查看,显示结果如下。其中的DUP表示这个IPv6地址是重复的:

R1#sh ipv6 int e0/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:5678, subnet is 2001::/64
    # 提示DUP地址冲突
    2001::1234:5679, subnet is 2001::/64 [DUP]
  Joined group address(es):
    FF02::1
    FF02::2
    FF02::1:FF00:100
    FF02::1:FF34:5678
  MTU is 1500 bytes
  ICMP error messages limited to one every 100 milliseconds
  ICMP redirects are enabled
  ICMP unreachables are sent
  ND DAD is enabled, number of DAD attempts: 1
  ND reachable time is 30000 milliseconds (using 30000)
  ND advertised reachable time is 0 (unspecified)
  ND advertised retransmit interval is 0 (unspecified)
  ND router advertisements are sent every 200 seconds
  ND router advertisements live for 1800 seconds
  ND advertised default router preference is Medium
  Hosts use stateless autoconfig for addresses.
R1#

既然地址冲突了、现在我们就需要找出冲突的IPv6地址所在的设备;假设2001::1234:5679这个IPv6地址应该配置在路由器上,结果却被Win10主机盗用。该如何解决这个IPv6地址盗用的问题呢?

这里我们可以开启Winserver设备,执行ping 2001::1234:5679操作,发现可以ping通。使用netsh interface ipv6 show neighbor命令查看2001::1234:5679对应的MAC地址:

image-20220123213345177

然后我们在交换机上使用show mac address-table命令找到这个MAC所对应的交换机端口,将其关闭,相当于断开了Win10主机的网络。

Switch#show mac address-table add 5000.0003.0000
          Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----
   1    5000.0003.0000    DYNAMIC     Et0/1
Total Mac Addresses for this criterion: 1
Switch#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Switch(config)#int e0/1
Switch(config-if)#shu
Switch(config-if)#shutdown
Switch(config-if)#
*Jan 24 20:36:51.205: %LINK-5-CHANGED: Interface Ethernet0/1, changed state to administratively down
*Jan 24 20:36:52.211: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/1, changed state to down
Switch(config-if)#

我们关闭R1的e0/0接口再打开,IPv6地址即可生效。Winserver可以ping通路由器的2001::1234:5679,至此盗用网关IPv6地址的问题解决。

image-20220123213711537

推荐文章