解决方案
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 个报文;