3. IPv6路由基础与邻居发现

在双栈或纯IPv6大型网络中,路由能否收敛、主机能否上线,往往不取决于BGP本身,而取决于最底层的三件事:IPv6单播路由如何选路、邻居发现(NDP)如何解析链路层地址、以及地址如何被自动配置并通过冲突检测。这三者构成了IPv6数据面的“地基”,一旦其中任一环节异常,上层MP-BGP邻居即使建立,业务流量也可能无法转发。

一、IPv6单播路由的基本原理

IPv6单播转发遵循“最长前缀匹配”原则,与IPv4一致,但有几个关键差异需要牢记。第一,IPv6报头中没有校验和,转发路径上的中间设备不再逐跳校验,转发效率更高,但错误检测依赖上层协议。第二,IPv6不允许中途分片,路径MTU发现(PMTUD)成为必需机制,若ICMPv6“Packet Too Big”被过滤,会出现“小包通、大包不通”的典型故障。第三,IPv6的链路本地地址(FE80::/10)在每个接口自动生成,路由表中会同时存在链路本地路由与全局单播路由,下一跳解析必须区分作用域。

IPv6路由表项通常包含:目的前缀/前缀长度、下一跳地址、出接口、度量值与管理距离。以Linux主机为例,可用如下命令观察:

ip -6 route show
2001:db8:100::/64 dev eth0 proto kernel metric 256 pref medium
2001:db8:200::/64 via fe80::1 dev eth0 proto static metric 1024 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
default via fe80::1 dev eth0 proto static metric 1024 pref medium

可以看到,静态路由的下一跳常写成链路本地地址(fe80::1),并绑定出接口。这是IPv6的一个典型特征:链路本地下一跳必须配合出接口才能唯一确定。在大型网络中,若同一接口存在多个上游,必须明确指定下一跳的链路本地地址,否则会出现“下一跳不可达”或选错邻居的问题。

二、NDP:邻居发现协议的核心作用

NDP(Neighbor Discovery Protocol)是IPv6的“ARP+ICMP路由器发现+地址自动配置”的集合体,基于ICMPv6实现,主要包含五类报文:

  • RS/RA(Router Solicitation / Router Advertisement):主机请求、路由器通告前缀、默认网关、跳数限制、MTU等参数。
  • NS/NA(Neighbor Solicitation / Neighbor Advertisement):地址解析与邻居可达性确认,替代IPv4的ARP。
  • Redirect:路由器告知主机存在更优的下一跳。

NDP的关键机制是“邻居缓存”(Neighbor Cache),它维护IPv6地址到MAC地址的映射,并带有状态:INCOMPLETE、REACHABLE、STALE、DELAY、PROBE。当主机要发送数据包但缓存中没有对应表项时,会先发NS组播,收到NA后进入REACHABLE;若长时间无流量,则转为STALE,再次发送前会先探测。大型网络中,邻居缓存表项数量可能达到数万条,若NDP报文被限速或丢弃,会出现“路由表正常但业务不通”的现象。

三、SLAAC与DAD:地址自动配置与冲突检测

SLAAC(Stateless Address Autoconfiguration)允许主机根据RA通告的前缀自行生成全局单播地址,无需DHCPv6服务器。其流程可概括为:

  1. 主机生成链路本地地址(EUI-64或稳定隐私地址),先做DAD。
  2. 发送RS,请求路由器通告。
  3. 收到RA后,取其中的前缀(如2001:db8:100::/64),结合接口标识生成全局地址。
  4. 对该全局地址执行DAD,确认无冲突后正式启用。

DAD(Duplicate Address Detection)通过发送NS(目标地址为待检测地址,源地址为::)并等待NA来完成。若收到NA,说明地址已被占用,该地址标记为DAD失败,不能使用。DAD默认会重试多次,若网络中存在大量主机同时上线,DAD报文可能造成瞬时泛洪,因此在大规模部署中需要合理规划RA间隔与DAD重传次数。

注意:DAD依赖组播,若接入层配置了IPv6组播抑制或NDP限速过严,可能导致DAD误判为“无冲突”,从而出现地址冲突;也可能因NA丢失导致地址长时间处于TENTATIVE状态,主机无法通信。

四、大型网络中地址自动配置的部署要点

在大型园区或数据中心,SLAAC与DHCPv6往往混合使用。SLAAC负责提供前缀和默认网关,DHCPv6负责下发DNS、域名等扩展参数。RA中通过M位和O位控制主机行为:M=1表示使用DHCPv6获取地址,O=1表示仅获取其他配置。若M=0、O=1,则主机用SLAAC生成地址,同时向DHCPv6请求DNS等信息。

部署时需重点关注以下参数与操作:

  • RA间隔:默认200秒,大型网络可适当缩短至30~60秒,加快主机上线,但需控制RA泛洪。
  • RA生存期:应大于RA间隔的3倍,避免路由器切换时主机默认网关过早失效。
  • 前缀长度:通常为/64,SLAAC要求前缀长度必须为/64,否则主机无法自动生成地址。
  • DAD重传:默认1次,若网络丢包严重可增至3次,但会延长地址可用时间。
  • NDP限速:在接入交换机上配置NDP报文限速,防止NDP泛洪攻击,但需保证DAD和NS不被丢弃。

以下是一个典型的Cisco IOS-XE接口配置示例,用于在网关接口上启用RA并控制参数:

interface GigabitEthernet0/0/1
 ipv6 enable
 ipv6 address 2001:db8:100::1/64
 ipv6 nd ra interval 30
 ipv6 nd ra lifetime 120
 ipv6 nd ra suppress
 no ipv6 nd ra suppress
 ipv6 nd prefix 2001:db8:100::/64 2592000 604800
 ipv6 nd managed-config-flag
 ipv6 nd other-config-flag
 ipv6 nd dad attempts 3

其中,ipv6 nd prefix后的两个数值分别表示有效生存期和首选生存期(单位秒),managed-config-flag对应M位,other-config-flag对应O位。若同时使用DHCPv6下发DNS,则M=0、O=1,此时应去掉managed-config-flag,保留other-config-flag。

五、NDP与SLAAC的联动关系图

下图展示了主机从链路本地地址生成、RS/RA交互、全局地址生成、DAD检测到最终路由可用的一条完整链路,同时标出了各阶段的关键报文与状态变化,便于在排障时快速定位问题环节。

IPv6主机上线:NDP / SLAAC / DAD 联动链路 主机(Host) ① 生成链路本地地址 fe80::/10 + 接口标识 ② 对链路本地地址DAD NS(源::) → 等待NA ③ 发送RS请求前缀 目的:ff02::2 ④ 收到RA,生成全局地址 2001:db8:100::/64 + IID ⑤ 对全局地址DAD NS(源::) → 无NA则可用 地址可用,加入路由表 路由器(Gateway) 接口启用IPv6 2001:db8:100::1/64 周期发送RA 前缀、M/O位、MTU 响应NS(NA) 提供MAC映射 维护邻居缓存 REACHABLE/STALE 转发数据包 最长前缀匹配 路由可达,业务通 DAD NS(组播) RA通告(周期/响应RS) RS请求 NA响应 数据包(源/目的全局地址) 关键状态:TENTATIVE(DAD中)→ PREFERRED(可用)→ DEPRECATED(首选期过期)→ INVALID(有效期满)

结合上图,排障时可沿链路逐段检查:若主机始终没有全局地址,先看RS是否发出、RA是否到达;若地址长期处于TENTATIVE,检查DAD的NS/NA是否被丢弃;若地址已生成但无法ping通网关,检查邻居缓存是否处于INCOMPLETE,以及NDP限速是否误伤。只有把NDP、SLAAC、DAD与单播路由表联动起来看,才能在大规模IPv6网络中快速定位“地址有、路由有、但业务不通”的典型问题。