「IPv6」- 邻居发现协议(NDP, Neighbor Discovery Protocol)

  CREATED BY JENKINSBOT

解决方案

NDP,Neighbor Discovery Protocol,邻居发现协议,RFC2461 定义 NDP 协议,后被 RFC4861 替代。

原理简述

该协议并非新协议,而是通过不同 ICMPv6.Type 报文组合来实现。

协议特性

WIP

应用场景

通过 NDP 协议,实现 无状态自动配置(前缀公告)、网络地址解析、重复地址检测 等等。

报文类型

该协议并非新协议,而是通过如下 ICMPv6.Type 报文组合来实现:
1)Type=133,路由器请求(Router Solicitation)
2)Type=134,路由器公告(Router Advertisement)
3)Type=135,邻居请求(Neighbor Solicitation)
4)Type=136,邻居公告(Neighbor Advertisement)
5)Type=137,重定向 (Redirect)

协议功能

路由器发现:发现链路上的路由器,获得路由器通告的信息;
网络地址解析:请求目的网络地址对应的数据链路层地址,类似 IPv4 ARP 协议;
邻居状态跟踪:通过 NDP 发现链路上的 IPv6 邻居,并跟踪邻居状态;
重复地址检测:获得地址后,进行地址重复检测,确保地址不存在冲突;
报文重定向:告知其他设备,到达目标网络的更优下一跳;
无状态自动配置:通过路由器通告的地址前缀,终端自动生成IPv6地址(无需 DHCP 服务);

前缀重编址
作用:路由器对所通告的地址前缀进行灵活设置,实现网络重编址(修改网络地址,而无需中断业务);
RS (ICMPv6.Type=133) + RA (ICMPv6.Type=134)

路由器发现(IRDP, Internet Router Discovery Protocol)

ICMP Router Discovery Protocol – Wikipedia

路由器发现,是指 Host(主机)发现本地链路上 Router(路由器),并确定其配置信息的过程。

ICMPv6 Packet:RS (ICMPv6.Type=133) + RA (ICMPv6.Type=134)

路由器发现能够同时实现以下三个功能:
1)路由器发现 (Router Discovery):Host 定位 Neighbor Router,并选择哪个 Router 作为缺省网关的过程;
2)前缀发现 (Prefix Discovery):Host 发现本地链路上的一组 IPv6 Network Prefix 的过程,用于主机的地址自动配置;
3)参数发现 (Parameter Discovery):Host 发现相关操作参数的过程,如输出报文的缺省跳数限制、地址配置方式等信息;

协议交互主要有两种情况:
1)主机请求触发:Host 发送 RS 报文,触发 Router 回应 RA 报文;
2)路由器周期性发送:Router 周期发送 RA 报文;

场景:主机请求触发

1)当 Host 启动时,会向本地链路范围内所有 Router 发送 RS 报文,使用广播地址(比如 FF02::2 地址);
2)触发 Router 响应 RA 报文,DST-IP-ADDRESS FF02::1;

经过前述交互,主机发现本地链路上的路由器后:
1)进行自动配置缺省路由器、建立缺省路由表、前缀列表、设置其它的配置参数;
2)根据需要,利用 RA 报文的参数来自动配置地址;

场景:路由器周期性发送

路由器周期性的发送 RA 报文,RA 发送间隔是一个有范围的随机值,缺省的最大时间间隔是 600 秒,最小时间间隔是 200 秒。

在华为路由器中,使用如下命名修改发送周期:

ipv6 nd ra { max-interval maximum-interval | min-interval minimum-interval }

对于定期发送的 RA 报文,其地址有如下要求:
1)Source Address:必须是发送接口的链路本地地址;
2)Destination Address:FF02::1(这是所有节点组播地址,当设备收到来自该地址的报文后,必须进行处理);

网络地址解析(Network Address Resolution)

IPv6 地址解析通过 ICMPv6 来实现,以取代 IPv4 ARP 协议。通过 ICMPv6 交互,形成 IPv6 Address 与数据链路层地址(通常为 MAC 地址)的映射关系。

在三层完成地址解析,主要带来以下几个好处:
1)通用:地址解析在三层完成,不同的二层介质能够采用相同的地址解析协议;
2)安全:能够使用三层的安全机制,能够避免地址解析攻击;
3)高效:使用组播方式发送请求报文,减少了二层网络的性能压力(对比ARP 使用广播报文);

ICMPv6 Packet:NS (ICMPv6.Type=135) + NA (ICMPv6.Type=136)

场景:地址解析过程

地址解析使用的 NDP 报文为:NeighborSolicitation(ICMPv6.Type=135);NeighborAdvertisement(ICMPv6.Type=136)

在请求(NDP.NS)时,注意如下参数:
1)D-Add:为目标地址的被请求节点组播组;
2)D-MAC:3333 与 last 32 bit of D-Add 组合而成;

在响应(NDP.NA)时,注意如下参数:
1)D-MAC:目标主机链路地址;
2)D-Add:目标主机网络地址;

补充说明

在 IPv4 中,使用 ARP 表项,而在 IPv6 中,使用邻居关系表项;

重复地址检测(DAD, Duplicate Address Detection)

DAD(Duplicate Address Detection,重复地址检测)类似于 IPv4 的免费 ARP 检测,保证接口在使用某个 IPv6 Address 之前,先探测是否有其它的设备正在使用该地址,从而确保网络中没有两个相同的单播地址。

DAD 是设备确定即将使用的地址是否被其他设备使用的过程。在节点自动配置某个接口的 IPv6 单播地址之前,必须在本地链路范围内验证要使用的地址是唯一的,并且未被其他节点使用过。只要NS报文发送到本地链路上(缺省发送一次NS报文),如果在规定时间内没有NA报文进行应答,则认为这个临时单播地址在本地链路上是唯一的,可以分配给接口;反之,这个临时地址是重复的,不能配置到接口。

任何单播地址(包括 LLA 类型),都会触发 DAD 行为。当配置 GUA 类型后,由于设备会自动配置 LLA,所以会触发两个 DAD 检查。仅当 DAD 后,设备才会使用该单播地址。

ICMPv6 Packet:NS (ICMPv6.Type=135) + NA (ICMPv6.Type=136)

试验地址

在通过重复地址检测前,当前地址被称为“试验地址”(Tentative Address)。此时该接口不能使用这个试验地址进行单播通讯。

示例:重复地址检测

对于请求(ICMPv6.Type=135),需要注意如下几点:
1)D-Add:依旧是被请求节点组播组;
2)D-MAC:3333 + Last 32 bit of D-Add
3)S-Add:使用 :: 地址(规范要求);

然后,设备会进入等待状态,以等待来自其他设备的(思科等待 1s 时间);

对于响应(ICMPv6.Type=136),需要注意如下几点:
1)D-Addr:为所有节点组播地址,即所有设备都要接收处理;
2)D-MAC:3333 + Last 32 bit of D-Add

在华为路由器中,重复地址会被显示为 DUPLICATED 状态:

[AR3-GigabitEthernet0/0/0]display ipv6 interface 
GigabitEthernet0/0/0 current state : UP 
IPv6 protocol current state : UP
IPv6 is enabled, link-local address is FE80::2E0:FCFF:FE40:4178
  Global unicast address(es):
    2001::2, subnet is 2001::/64 [DUPLICATE] ---- 表示地址重复
  Joined group address(es):
    FF02::1:FF00:2
...

补充说明

若两个节点配置相同地址,同时作重复地址检测时,当一方收到对方发出的 DAD NS 报文,则接收方将不启用该地址。这是种特殊情况:有两台主机同时分配到同个 IP 地址。假设PC1和PC2都想使用2000::1这个地址,那么进一步假设PC1先发送NS,PC2收到以后将不会发送 NS(当然也不会发送 NA),直接停止使用2000::1这个地址,等待其他方式生成新的地址。如果双方都收到 NS 报文,则都会放弃使用 2000::1 地址。

DAD NS 报文的 SRC-IP-Address 为 ::,不同于网络地址解析所使用的源地址。

报文重定向

ipv6 icmp redirect send – WLAN AC V200R010C00 Command Reference – Huawei

重定向是指网关设备发现报文从其它网关设备转发更优,它就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关设备。

ICMPv6 Packet

WIP

示例:报文重定向

1)PC1 希望发送报文到服务器,于是根据配置的默认网关地址向网关 R2 发送报文。
2)网关 R2 收到报文后,检查报文信息,发现报文应该转发到与PC1在同一网段的另一个网关设备R1,此转发路径是更优的路径,
3)于是 R2 会向 PC1 发送一个重定向消息(其中包含 R1 相关的信息),以通知 PC1 去往服务器的报文应直接发给 R1。
4)PC1 收到重定向消息后,会向R1发送报文,R1 再将该报文转发至服务器。

注意事项:
1)在华为模拟器中,虽然 ipv6 icmp redirect send 开启,但是依旧未能捕获到重定向报文。

邻居状态追踪(Neighbor Cache Entry)

在 IPv6 Neighbor Cache 中,缓存 IPv6 Address 与 MAC Address 的映射。

通过 display ipv6 neighbors 命令来查看:

<AR2>display ipv6 neighbors 
-----------------------------------------------------------------------------
IPv6 Address : 2002::1                                           
Link-layer   : 00e0-fc64-0e23                     State : STALE        
Interface    : GE0/0/0                            Age   : 10                  
VLAN         : -                                  CEVLAN: -                   
VPN name     :                                    Is Router: TRUE             
Secure FLAG  : UN-SECURE                          

IPv6 Address : FE80::2E0:FCFF:FE64:E23                           
Link-layer   : 00e0-fc64-0e23                     State : STALE        
Interface    : GE0/0/0                            Age   : 10                  
VLAN         : -                                  CEVLAN: -                   
VPN name     :                                    Is Router: TRUE             
Secure FLAG  : UN-SECURE                          

-----------------------------------------------------------------------------
Total: 2       Dynamic: 2       Static: 0 

邻居状态(State)

IPv6 节点需要维护一张邻居表,每个邻居都有相应的状态,状态间可以迁移。共有 5 种邻居状态分别是:

Incomplete(未完成),邻居不可达。正在进行地址解析,邻居的链路层地址未探测到。
如果解析成功,则进入 Reachable 状态。

Reachable(可达),邻居可达。表示在规定时间(邻居可达时间,缺省情况下是30秒)内邻居可达。
如果超过规定时间,该表项没有被使用,则表项进入 Stale 状态。

Stale(陈旧),邻居是否可达未知。表明该表项在规定时间(邻居可达时间,缺省情况下是30秒)内没有被使用。
此时,除非有发送到邻居的报文,否则不对邻居是否可达进行探测。

Delay(延迟),邻居是否可达未知。已向邻居发送报文,如果在指定时间内(5s)没有收到响应,则进入 Probe 状态。

Probe(探查),邻居是否可达未知。已向邻居发送 NS 报文,探测邻居是否可达。
在规定时间内,收到 NA 报文回复,则进入 Reachable 状态,否则进入 Incomplete 状态。

示例:邻居状态迁移

1)R1先发送 NS 报文,并生成缓存条目,此时邻居状态为 Incomplete 状态;
2)若收到 R2 回复的 NA 报文,则邻居状态由 Incomplete 变为 Reachable,否则固定时间后邻居状态由 Incomplete 变为 Empty 状态;
3)经过邻居可达时间(默认30s),邻居状态由 Reachable 变为 Stale,即未知是否可达。
—- 如果在Reachable状态,R1收到R2的非请求NA报文,且其中携带的R2的链路层地址和表项中不同,则邻居状态马上变为Stale。
4)当 Stale 时,若 R1 要向 R2 发送数据,则邻居状态由 Stale 变为 Delay,并发送 NS 请求进行探测;
5)在经过一段固定时间后,邻居状态由 Delay 变为 Probe 状态;其间若有 NA 应答,则邻居状态由 Delay 变为 Reachable 状态;
6)当 Probe 时,R1 周期(1s)发送单播 NS 报文,发送固定次数(3)后,有应答则邻居状态变为 Reachable,否则邻居状态变为 Empty 状态;

补充说明:
1)整个过程是这个样子的,但是在具体设备的实现中 发送报文的数量报文的时间间隔 等等方面可能才能在细微的差别。
2)在华为设备中,Stale ⇒ Delay,会发送两次 NS 报文,且 GUA、LLA 都会发送,即共计 4 个报文;