第114篇:NDP 与 IPv6 邻居发现协议
关键词:NDP、IPv6 邻居发现、NS、NA、RS、RA、DAD、地址自动配置、Router Advertisement
一、引言
在 IPv4 网络中,ARP 协议负责 IP 地址到 MAC 地址的解析,但其功能单一且缺乏安全机制。IPv6 引入了邻居发现协议(Neighbor Discovery Protocol, NDP),它不仅仅替代了 ARP,还承担了路由器发现、前缀发现、参数获取等多项功能。
理解 NDP 的工作原理对于 IPv6 网络的规划、部署和排错至关重要。NDP 的复杂性远大于 ARP,但其提供的功能也更加丰富和安全。
二、核心概念
2.1 NDP 的功能概览
NDP 替代了 IPv4 中的多个协议:
| IPv4 协议 | IPv6 替代方案 | NDP 功能 |
|---|---|---|
| ARP | NDP(NS/NA) | 地址解析(IP → MAC) |
| ICMP Router Discovery | NDP(RS/RA) | 路由器发现 |
| DHCP(部分功能) | NDP(RA) | 地址自动配置参数获取 |
2.2 NDP 报文类型
NDP 基于 ICMPv6 实现,使用以下报文类型:
| 报文类型 | ICMPv6 Type | 方向 | 功能 |
|---|---|---|---|
| Router Solicitation(RS) | 133 | 主机 → 路由器 | 请求路由器发送 RA |
| Router Advertisement(RA) | 134 | 路由器 → 所有主机 | 通告前缀、默认网关等信息 |
| Neighbor Solicitation(NS) | 135 | 任一方 → 特定节点 | 地址解析、邻居可达性检测 |
| Neighbor Advertisement(NA) | 136 | 任一方 → 特定节点 | 响应 NS,主动通告地址变更 |
| Redirect | 137 | 路由器 → 主机 | 告知更好的下一跳 |
2.3 NDP 地址解析流程

2.4 关键地址概念
| 地址类型 | 格式 | 说明 |
|---|---|---|
| Link-Local 地址 | FE80::/10 | 仅在本地链路上有效,NDP 通信必须使用 Link-Local 地址 |
| Solicited-Node 组播地址 | FF02::1:XXXX:XXXX | 由目标 IPv6 地址的最后 24 位生成,用于 NS 报文 |
| All-nodes 组播地址 | FF02::1 | 链路上所有节点 |
| All-routers 组播地址 | FF02::2 | 链路上所有路由器 |
三、技术细节
3.1 DAD(Duplicate Address Detection)
DAD 是 NDP 的重要功能,用于检测 IPv6 地址冲突。当主机配置一个新的 IPv6 地址时,会先发送 NS 报文来检测该地址是否已被其他主机使用。

3.2 NS 报文的源地址选择
| 场景 | NS 源地址 | 说明 |
|---|---|---|
| 地址解析 | 主机的 Link-Local 地址 | 正常的地址解析请求 |
| DAD 检测 | ::(零地址) | 检测新地址是否被占用,源地址为零表示尚未配置 |
| NUD(可达性检测) | 主机的 Link-Local 地址 | 验证邻居是否仍然可达 |
3.3 NUD(Neighbor Unreachability Detection)
NUD 是 NDP 的邻居可达性检测机制,用于维护邻居缓存表的状态。

3.4 RA 报文中的关键选项
| 选项类型 | 名称 | 作用 |
|---|---|---|
| Prefix Information | 前缀信息 | 通告链路上的前缀、前缀长度、有效寿命、首选寿命 |
| MTU Option | MTU 选项 | 通告链路的 MTU 大小 |
| Source LL Address | 源链路本地地址 | 通告路由器的 Link-Local 地址和 MAC |
| RDNSS Option | DNS 递归解析器 | 通告 DNS 服务器地址(RFC 6106) |
3.5 RA 报文中的 Flag 位
RA 报文的前缀信息选项中包含两个重要的 Flag:
| Flag | 名称 | 说明 |
|---|---|---|
| M | Managed | M=1 时,主机通过有状态 DHCPv6 获取全局地址 |
| O | Other | O=1 时,主机通过无状态 DHCPv6 获取其他配置信息(如 DNS) |
| A | Autonomous | A=1 时,主机可以进行无状态地址自动配置(SLAAC) |
四、实战配置/案例分析
4.1 华为路由器 NDP 配置
# ========== 基础 NDP 配置 ==========
# 1. 接口上启用 NDP(默认已启用)
[HUAWEI] interface GigabitEthernet 0/0/0
[HUAWEI-GigabitEthernet0/0/0] ipv6 enable
[HUAWEI-GigabitEthernet0/0/0] ipv6 address 2001:db8::1/64
# 2. 配置 RA 发送间隔
[HUAWEI-GigabitEthernet0/0/0] ipv6 nd ra interval 60
# 最小间隔 60 秒(默认 60 秒)
# 3. 配置 RA 报文中的前缀信息
[HUAWEI-GigabitEthernet0/0/0] ipv6 nd prefix 2001:db8:: prefix-length 64
[HUAWEI-GigabitEthernet0/0/0] ipv6 nd ra other-config enable
# 设置 O Flag,告知主机使用 DHCPv6 获取 DNS 等配置
# 4. 配置 RA 的 Lifetime
[HUAWEI-GigabitEthernet0/0/0] ipv6 nd ra lifetime 1800
# RA 存活时间 1800 秒(30分钟)
# ========== 安全加固 ==========
# 5. 限制 RA 报文速率
[HUAWEI-GigabitEthernet0/0/0] ipv6 nd ra suppression 1
# 6. 配置 NS/NA 速率限制
[HUAWEI-GigabitEthernet0/0/0] ipv6 nd ns suppression 3
4.2 故障案例:IPv6 地址解析失败
场景描述:IPv6 双栈网络中,两台主机可以正常通过 IPv4 通信,但 IPv6 ping 不通。
排查过程:
- 检查 IPv6 地址配置:
[SW] display ipv6 interface GigabitEthernet 0/0/1
# 接口 IPv6 地址正常,状态 UP
- 检查邻居缓存表:
[SW] display ipv6 neighbors
# 邻居表为空,没有学习到任何 IPv6 邻居
- 抓包分析:
[SW] packet-capture interface GigabitEthernet 0/0/1
# 发现 NS 报文正常发出,但没有 NA 响应
- 根因确认:主机侧防火墙丢弃了 ICMPv6 报文。Windows 防火墙默认阻止了 NDP 报文中的 NS/NA。
处理措施:
# 在 Windows 主机上启用 ICMPv6
# 以管理员身份运行 PowerShell:
# Set-NetFirewallRule -DisplayName "文件和打印机共享(回显请求 - ICMPv6-In)" -Enabled True
# Set-NetFirewallRule -DisplayName "核心IPv6网络" -Enabled True
# 或在 Windows 防火墙高级设置中,启用以下规则:
# - 文件和打印机共享(邻居发现请求 - ICMPv6-In)
# - 文件和打印机共享(邻居发现响应 - ICMPv6-In)
# - 文件和打印机共享(路由器请求 - ICMPv6-In)
# - 文件和打印机共享(路由器通告 - ICMPv6-In)
4.3 故障案例:NDP 泛洪攻击
场景描述:某园区网的 IPv6 网络出现广播风暴现象,交换机 CPU 利用率飙升到 90% 以上,大量终端通信中断。
排查过程:
- 检查交换机 CPU:
[SW] display cpu-usage
# CPU 利用率 92%
- 检查端口流量:
[SW] display interface GigabitEthernet 0/0/15
# 端口入方向流量异常,大量 ICMPv6 报文
# Input packets: ICMPv6 packets 50000 pps
- 抓包分析:
[SW] packet-capture interface GigabitEthernet 0/0/15
# 发现大量伪造的 RA 报文,源地址为随机生成的 IPv6 地址
- 根因确认:GE0/0/15 连接的终端运行了 NDP 泛洪攻击工具,持续发送大量 RA 报文,导致网络中所有主机频繁更新路由表和前缀信息。
处理措施:
# 第一步:隔离攻击端口
[SW] interface GigabitEthernet 0/0/15
[SW-GigabitEthernet0/0/15] shutdown
# 第二步:启用 NDP 安全特性
# 限制 RA 报文速率
[SW] interface GigabitEthernet 0/0/0
[SW-GigabitEthernet0/0/0] ipv6 nd ra suppression 1
# 限制 NS 报文速率
[SW-GigabitEthernet0/0/0] ipv6 nd ns suppression 3
# 第三步:在接入层启用 IPv6 Source Guard(如有支持)
4.4 故障案例:DAD 检测导致 IPv6 地址配置失败
场景描述:新部署的 IPv6 网络中,部分终端无法获取 IPv6 地址,日志显示地址冲突。
排查过程:
- 查看终端日志:
# Windows 事件日志显示:
# "此计算机检测到 IPv6 地址冲突"
- 排查地址分配:
[SW] display ipv6 neighbors
# 发现同一 IPv6 地址出现在两个不同的端口上
- 根因分析:DHCPv6 服务器和 SLAAC 同时运行,且使用了相同的前缀。一台主机通过 SLAAC 获取了地址 A,另一台主机通过 DHCPv6 也获取了地址 A。当第二台主机进行 DAD 检测时,收到了第一台主机的 NA 响应,判定地址冲突。
处理措施:
# 方案一:仅使用 SLAAC,关闭 DHCPv6
# 在路由器 RA 报文中设置 M=0, O=1
[SW-GigabitEthernet0/0/0] undo ipv6 nd ra managed-config enable
[SW-GigabitEthernet0/0/0] ipv6 nd ra other-config enable
# 方案二:仅使用 DHCPv6(有状态)
# 在路由器 RA 报文中设置 M=1
[SW-GigabitEthernet0/0/0] ipv6 nd ra managed-config enable
[SW-GigabitEthernet0/0/0] undo ipv6 nd ra autonomous-flag enable
# 方案三:SLAAC + DHCPv6 无状态混合模式(推荐)
# M=0, O=1,地址通过 SLAAC,DNS 等通过 DHCPv6
五、总结
| 项目 | 说明 |
|---|---|
| NDP 本质 | IPv6 的邻居发现协议,替代 IPv4 的 ARP + 路由器发现 + 部分 DHCP |
| NS/NA | 地址解析,类似 ARP 的 Request/Reply |
| RS/RA | 路由器发现和前缀通告 |
| DAD | 地址冲突检测,确保地址唯一性 |
| NUD | 邻居可达性检测,维护邻居缓存状态 |
| 安全加固 | 限制 NS/RA 速率、防火墙放行 ICMPv6 |
| 华为推荐 | 合理配置 RA 间隔、启用速率限制、正确设置 M/O Flag |
思考
-
NDP 的 NS 报文使用 Solicited-Node 组播地址而不是全链路组播,这样做有什么好处?
-
DAD 检测时使用 :: 作为源地址,如果链路上有多个主机同时进行 DAD 检测同一地址,如何确保检测的准确性?
-
在 IPv6 网络中,为什么防火墙不能简单地阻止 ICMPv6?哪些 ICMPv6 报文是网络正常运作所必需的?
下篇预告:第115篇:IPv6 地址配置:SLAAC、有状态 DHCPv6、无状态 DHCPv6