第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 地址解析流程

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 报文来检测该地址是否已被其他主机使用。

DAD(Duplicate Address Detection) - 图示

3.2 NS 报文的源地址选择

场景 NS 源地址 说明
地址解析 主机的 Link-Local 地址 正常的地址解析请求
DAD 检测 ::(零地址) 检测新地址是否被占用,源地址为零表示尚未配置
NUD(可达性检测) 主机的 Link-Local 地址 验证邻居是否仍然可达

3.3 NUD(Neighbor Unreachability Detection)

NUD 是 NDP 的邻居可达性检测机制,用于维护邻居缓存表的状态。

NUD(Neighbor Unreachability Detection) - 图示

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 不通。

排查过程:

  1. 检查 IPv6 地址配置:
[SW] display ipv6 interface GigabitEthernet 0/0/1
# 接口 IPv6 地址正常,状态 UP
  1. 检查邻居缓存表:
[SW] display ipv6 neighbors
# 邻居表为空,没有学习到任何 IPv6 邻居
  1. 抓包分析:
[SW] packet-capture interface GigabitEthernet 0/0/1
# 发现 NS 报文正常发出,但没有 NA 响应
  1. 根因确认:主机侧防火墙丢弃了 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% 以上,大量终端通信中断。

排查过程:

  1. 检查交换机 CPU:
[SW] display cpu-usage
# CPU 利用率 92%
  1. 检查端口流量:
[SW] display interface GigabitEthernet 0/0/15
# 端口入方向流量异常,大量 ICMPv6 报文
# Input packets: ICMPv6 packets 50000 pps
  1. 抓包分析:
[SW] packet-capture interface GigabitEthernet 0/0/15
# 发现大量伪造的 RA 报文,源地址为随机生成的 IPv6 地址
  1. 根因确认: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 地址,日志显示地址冲突。

排查过程:

  1. 查看终端日志:
# Windows 事件日志显示:
# "此计算机检测到 IPv6 地址冲突"
  1. 排查地址分配:
[SW] display ipv6 neighbors
# 发现同一 IPv6 地址出现在两个不同的端口上
  1. 根因分析: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

思考

  1. NDP 的 NS 报文使用 Solicited-Node 组播地址而不是全链路组播,这样做有什么好处?

  2. DAD 检测时使用 :: 作为源地址,如果链路上有多个主机同时进行 DAD 检测同一地址,如何确保检测的准确性?

  3. 在 IPv6 网络中,为什么防火墙不能简单地阻止 ICMPv6?哪些 ICMPv6 报文是网络正常运作所必需的?

下篇预告:第115篇:IPv6 地址配置:SLAAC、有状态 DHCPv6、无状态 DHCPv6