1. Introduction (简介)
邻居发现 (Neighbor Discovery, ND) [RFC4861] 指定了同一链路上IPv6节点(主机和路由器)用于相互通信和相互了解的机制。无状态地址自动配置 (Stateless Address Autoconfiguration, SLAAC) [RFC4862] 建立在这些ND机制之上,让节点配置自己的IPv6地址。在分析节点可能遇到的ND问题时,考虑SLAAC,查看它们在整个生命周期中交换的ND消息会有所帮助。
对于主机,整体过程如下:
-
LLA DAD (链路本地地址重复地址检测): 主机形成一个链路本地地址 (Link-Local Address, LLA) 并使用组播邻居请求 (Neighbor Solicitation, NS) 执行重复地址检测 (Duplicate Address Detection, DAD)。
-
路由器发现 (Router Discovery): 主机发送组播路由器请求 (Router Solicitation, RS) 以发现链路上的路由器。路由器使用路由器通告 (Router Advertisement, RA) 响应,提供子网前缀和其他信息。主机在接收到RA时为该路由器安装邻居缓存条目 (Neighbor Cache Entry, NCE)。相反,路由器此时无法为主机安装NCE,因为主机的全局IP地址仍然未知。当路由器稍后需要将数据包转发到主机的全局地址时,它将执行地址解析并为主机安装NCE。
-
GUA DAD (全局单播地址重复地址检测): 主机形成一个全局单播地址 (Global Unicast Address, GUA) [RFC3587] 或唯一本地地址 (Unique Local Address, ULA) [RFC4193],并使用组播NS进行DAD。为简化描述,本文档不再进一步区分GUA和ULA。
-
下一跳确定和地址解析 (Next-hop Determination and Address Resolution): 当主机需要发送数据包时,它将首先确定下一跳是路由器还是链路内主机(即目标)。如果下一跳是路由器,主机已经拥有该路由器的NCE。如果下一跳是链路内主机,它将使用组播NS执行目标主机的地址解析。因此,源主机为目标主机安装NCE。
-
节点不可达检测 (Node Unreachability Detection, NUD): 主机使用单播NS确定具有NCE的另一个节点是否仍然可达。
-
链路层地址变更通告 (Link-layer Address Change Announcement): 如果主机的链路层地址发生变化,它可以使用组播邻居通告 (Neighbor Advertisement, NA) 向其他节点宣布其新的链路层地址。
对于路由器,过程类似,只是没有路由器发现。相反,路由器执行主机没有的重定向 (Redirect) 过程。路由器发送重定向以告知节点其流量的更好下一跳。
ND在许多消息中使用组播并信任来自所有节点的消息,此外,路由器可能在需要将数据包转发到主机时按需为主机安装NCE。这些可能导致问题。具体而言,各种ND问题和缓解解决方案已发布在超过20个RFC中,包括:
- "IPv6 Neighbor Discovery (ND) Trust Models and Threats (IPv6邻居发现信任模型和威胁)" [RFC3756]
- "SEcure Neighbor Discovery (SEND) (安全邻居发现)" [RFC3971]
- "Cryptographically Generated Addresses (CGA) (加密生成地址)" [RFC3972]
- "Neighbor Discovery Proxies (ND Proxy) (邻居发现代理)" [RFC4389]
- "Optimistic Duplicate Address Detection (DAD) for IPv6 (IPv6的乐观重复地址检测)" [RFC4429]
- "IPv6 in 3rd Generation Partnership Project (3GPP) Evolved Packet System (EPS) (第三代合作伙伴计划演进分组系统中的IPv6)" [RFC6459]
- "IPv6 for Third Generation Partnership Project (3GPP) Cellular Hosts (第三代合作伙伴计划蜂窝主机的IPv6)" [RFC7066]
- "IPv6 in the context of TR-101 (TR-101环境中的IPv6)" [TR177]
- "Address Resolution Protocol (ARP) Mediation for IP Interworking of Layer 2 VPNs (第2层VPN IP互通的地址解析协议中介)" [RFC6575]
- "Operational Neighbor Discovery Problems (运营邻居发现问题)" [RFC6583]
- "Neighbor Discovery Optimization for IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs) (低功耗无线个域网上IPv6的邻居发现优化)" [RFC6775]
- "Registration Extensions for IPv6 over Low-Power Wireless Personal Area Network (6LoWPAN) Neighbor Discovery (低功耗无线个域网上IPv6邻居发现的注册扩展)" [RFC8505]
- "Address-Protected Neighbor Discovery for Low-Power and Lossy Networks (低功耗有损网络的地址保护邻居发现)" [RFC8928]
- "IPv6 Backbone Router (IPv6骨干路由器)" [RFC8929]
- "Architecture and Framework for IPv6 over Non-Broadcast Access (非广播接入上IPv6的架构和框架)" [SND]
- "Duplicate Address Detection Proxy (重复地址检测代理)" [RFC6957]
- "Source Address Validation Improvement (SAVI) Framework (源地址验证改进框架)" [RFC7039]
- "IPv6 Router Advertisement Guard (IPv6路由器通告防护)" [RFC6105]
- "Implementation Advice for IPv6 Router Advertisement Guard (RA-Guard) (IPv6路由器通告防护的实现建议)" [RFC7113]
- "Enhanced Duplicate Address Detection (增强重复地址检测)" [RFC7527]
- "The Scalable Address Resolution Protocol (SARP) for Large Data Centers (大型数据中心的可扩展地址解析协议)" [RFC7586]
- "Reducing Energy Consumption of Router Advertisements (减少路由器通告的能量消耗)" [RFC7772]
- "Unique IPv6 Prefix per Host (每主机唯一IPv6前缀)" [RFC8273]
- "Transparent Interconnection of Lots of Links (TRILL): ARP and Neighbor Discovery (ND) Optimization (大量链路透明互连:ARP和邻居发现优化)" [RFC8302]
- "Gratuitous Neighbor Discovery: Creating Neighbor Cache Entries on First-Hop Routers (无偿邻居发现:在第一跳路由器上创建邻居缓存条目)" [RFC9131]
- "Operational Aspects of Proxy ARP/ND in Ethernet Virtual Private Networks (以太网虚拟专用网中代理ARP/ND的运营方面)" [RFC9161]
- "Using DHCPv6 Prefix Delegation (DHCPv6-PD) to Allocate Unique IPv6 Prefixes per Client in Large Broadcast Networks (在大型广播网络中使用DHCPv6前缀委派为每个客户端分配唯一IPv6前缀)" [RFC9663]
本文档将这些RFC总结为一站式参考(截至撰写时),以便于访问。本文档还确定了问题的三个原因,并定义了三种主机隔离方法来解决这些原因并防止潜在的ND问题。
1.1. Terminology (术语)
本文档使用[RFC4861]中定义的术语。本节定义了其他术语。
MAC (媒体访问控制, Media Access Control): 为避免与链路本地地址混淆,本文档将链路层地址称为"MAC地址"。
主机隔离 (Host Isolation): 将主机分离到不同的子网或链路。
L3隔离 (L3 Isolation): 为每个主机分配唯一前缀 (Unique Prefix per Host, UPPH) [RFC8273] [RFC9663],使每个主机位于不同的子网中。鉴于可以在共享介质上为每个主机分配唯一前缀,不同子网中的主机可能在同一链路上。
L2隔离 (L2 Isolation): 采取措施防止主机在第2层 (L2) 直接到达其他主机,使每个主机位于不同的链路上。由于多链路子网 (Multi-Link Subnet) [RFC4903] 的存在,不同链路上的主机可能在同一子网中。因此,L2隔离并不意味着L3隔离,L3隔离也不意味着L2隔离。
L3+L2隔离 (L3+L2 Isolation): 同时应用L3隔离和L2隔离,使每个主机位于不同的子网和不同的链路上。
部分L2隔离 (Partial L2 Isolation): 使用L3 ND代理 (ND Proxy) [RFC4389] 设备在同一子网中向其他主机表示其后面的主机。在子网内,ND组播交换被分段为多个较小的范围,每个范围由一个ND代理设备表示。