邻居发现
邻居发现ND(Neighbor Discovery)是确定邻居节点之间关系的一组消息和进程。邻居发现协议替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器发现(Router Discovery),并提供了其他功能。
路由器请求报文RS(Router Solicitation):主机启动后,通过RS报文向路由器发出请求,路由器则会以RA报文响应。
路由器通告报文RA(Router Advertisement):路由器周期性的发布RA报文,其中包括前缀和一些标志位的信息。
邻居请求报文NS(Neighbor Solicitation):IPv6节点通过NS报文可以得到邻居的链路层地址,检查邻居是否可达,也可以进行重复地址检测。
邻居通告报文NA(Neighbor Advertisement):NA报文是IPv6节点对NS报文的响应,同时IPv6节点在链路层变化时也可以主动发送NA报文。
IPv6邻居发现协议主要包括以下功能:
地址冲突检测功能
地址冲突检测DAD(Duplicate address detect)是确定IPv6地址是否可用的一种探测机制。具体执行过程如下:
当一个节点配置了IPv6地址,为了查看该地址是否被其他邻居节点所使用,会即时发送邻居请求报文来确定其可用性。
当其他邻居节点收到该报文后会查找本地的IPv6地址中是否存在相同的IPv6地址,若存在会回应一个邻居通告报文给源节点,并携带此IPv6地址信息。
源节点收到邻居的回应报文则认为该IPv6地址已被邻居使用。反之,如果源节点发出的邻居请求报文没有收到相应的回应报文,则表示配置的IPv6地址是可用的。
邻居发现功能
邻居发现功能和IPv4中的ARP功能类似,主要实现对邻居地址的解析和邻居可达性的探测,依赖于邻居请求和邻居通告报文完成。
当一个节点需要得到同一本地链路上另外一个节点的链路层地址时,就会发送ICMPv6类型为135的邻居请求报文。此报文类似于IPv4中的ARP请求报文,不过使用组播地址而不使用广播地址,只有被请求节点的最后24比特和此组播地址相同的节点才会收到此报文,减少了广播风暴的可能。目的节点在响应报文中填充其链路层地址。
邻居请求报文也用来在邻居的链路层地址已知时,验证邻居的可达性。IPv6邻居通告报文是对IPv6邻居请求报文的响应。收到邻居请求报文后,目的节点通过在本地链路上发送ICMPv6类型为136的邻居通告报文进行响应。收到邻居通告后,源节点和目的节点可以进行通信。当一个节点的本地链路上的链路层地址改变时也会主动发送邻居通告报文。
路由器发现功能
路由器发现功能用来定位邻居路由设备,同时学习和地址自动配置有关的前缀和配置参数。IPv6路由发现由下面两种机制实现:
路由器请求
当主机没有配置单播地址时(例如系统刚启动),就会发送路由器请求报文RS。路由器请求报文有助于主机迅速进行自动配置而不必等待IPv6路由设备的周期性路由器通告报文。路由器请求也是ICMPv6报文,类型为133。
路由器通告
每个IPv6路由设备的接口在配置了IPv6 RA去抑制的前提下会周期发送路由器通告报文。在本地链路上收到IPv6节点的路由器请求报文后,路由设备也会回应路由器通告报文。路由器通告报文发送到所有节点多播地址(FF02::1)或发送路由器请求报文节点的IPv6单播地址。路由器通告为ICMPv6报文,类型为134,包含以下内容:
是否使用地址自动配置
标记支持的自动配置类型(无状态或有状态自动配置)
一个或多个本地链路前缀(本地链路上的节点可以使用这些前缀完成地址自动配置)
通告的本地链路前缀的生存期
发送路由器通告的路由设备是否可作为缺省路由设备,如果可以,还包括此路由设备可作为缺省路由设备的时间(用秒表示)
和主机相关的其他信息,如跳数限制、主机发起的报文可以使用的最大MTU
本地链路上的IPv6主机接收路由器通告报文,并用其中的信息得到更新的缺省路由设备、前缀列表以及其他配置。
地址自动配置功能
通过使用路由器通告报文和针对每一前缀的标记,路由设备可以通知主机如何进行地址自动配置。例如,路由设备可以指定主机是使用有状态(DHCPv6)地址配置还是无状态地址自动配置进行地址配置。
对于无状态地址自动配置而言,当主机收到路由器通告报文后,使用其中的前缀信息和本地接口ID自动形成IPv6地址,同时还可以根据其中的默认路由设备信息设置默认路由设备。
安全邻居发现功能
IPSec为IPv6网络提供了良好的安全方案,但IPSec并不能解决所有的安全问题,因此,IPv6的安全问题不能仅仅依赖于IPSec。
在IPv6的协议族中,ND(Neighbor Discovery)用来保证本链路内邻居的可达性,具有举足轻重的地位。随着网络安全问题的日益突出,针对ND的安全性问题,标准协议总结了若干种威胁类型,例举如下:
攻击方法 |
说明 |
---|---|
NS/NA欺骗 |
攻击者向合法节点(主机或者路由器)发送包含不同源链路层地址选项的NS报文,或者包含不同目标链路层地址选项的NA报文,通过NS/NA欺骗,使合法节点的报文发往其他的链路层地址达到攻击的目的。 |
邻居不可达探测(NUD)失败 |
攻击者连续不断的发送伪造的NA报文来响应NUD检测中合法节点发送的NS报文,使得合法节点无法探测到邻居节点不可达。这种攻击的后果取决于邻居节点不可达的原因,以及节点在知道邻居节点不可达后所采取的具体行为。 |
DAD攻击 |
攻击者对每个接入网络的主机所发送的重复地址检测(DAD)都进行响应,宣称拥有DAD检测的地址,使主机无法获得该地址。 |
虚假的重定向报文 |
攻击者使用当前第一跳路由器的链路本地地址向合法主机发送重定向消息,使合法主机将该重定向消息误认为是来自第一跳路由器的消息,从而接收该重定向消息。 |
重放攻击 |
攻击者通过捕获合法的消息并且不断重放这些消息来达到攻击的目的。所以,即使NDP消息受到签名或证书的保护而使得其内容不能被伪造,但还是会受到重放攻击。 |
虚假的直连前缀攻击 |
攻击者发送伪造的RA报文指定某些地址前缀是直连的,使得主机不再向路由器发送这个地址前缀的报文。相反,该主机将试图通过发送NS报文来执行地址解析,但是实际上NS报文将不会被响应,主机将会受到拒绝服务的攻击。 |
恶意的最后一跳路由器 |
攻击者向试图发现合法的最后一跳路由器的主机发送伪造的多播RA报文,或者对该主机发送的多播RS报文回应伪造的单播RA报文,使主机将攻击者误认为最后一跳路由器。一旦主机选择攻击者作为它的缺省路由器,攻击者就可以拦截通讯双方的通话并插入新的内容。 |
为应对这些威胁,标准协议对ND协议进行了扩展。标准协议定义了CGA地址和CGA选项、RSA选项,用来验证ND消息的发送者的合法性和报文的完整性,还定义了Timestamp和Nonce选项用来防止重放攻击。
- CGA地址(Cryptographically Generated Address):IPv6地址的接口ID部分由公钥和附加参数,使用单向hash函数计算生成。
- CGA选项:包含接收方在验证发送方的CGA地址时需要的一些信息,包括发送方的修正值和公钥等。用来验证ND报文的发送者是其IPv6源地址的合法拥有者。
- RSA签名选项(Rivest Shamir Adleman):包含发送方公钥的hash值,以及根据发送方私钥和ND报文,使用算法生成的数字签名。用来验证ND报文的完整性和发送者的真实性。
说明:
当攻击者声称其为某地址的拥有者时(实际上此地址属于某合法节点),它必须使用合法节点的公钥进行加密,否则接收者可以通过CGA选项的校验发现其攻击行为,即使攻击者获取到了合法节点的公钥,但接收者通过对数字签名的校验,可以发现其攻击行为,因为攻击者可能并不知道消息发送者用来制作数字签名的私钥。 - 时间戳选项(Timestamp):包含一个时间戳的64位无符号整数,表示从1970年1月1号零时(UTC)以来的秒数。用来保护非请求的通告报文和重定向报文不会被重放。接收者应确保每个收到的报文其时间戳都比上一个收到的报文要新。
- 随机数选项(Nonce):包含了由请求消息的发送者所生成的一个随机数。用来在请求和回应交互中防止重放攻击,比如在NS和NA报文的交互中,NS报文中携带Nonce选项,回应的NA报文中也携带此选项,发送者根据收到的选项判断是否为合法的回应报文。
当接口需要拒绝接收非安全的ND报文时,可以配置IPv6安全邻居发现功能。如果满足以下条件中的任何一条,即为非安全的ND报文:
- 接收到的ND报文没有携带CGA和RSA选项,即发送该报文的接口没有配置CGA地址。
- 接收到的ND报文的密钥长度超出本接口可以接受的长度范围。
- 接收ND报文的速率超出系统接受的速率范围。
- 接收到ND报文的时间与发送ND报文的时间差超出本接口可以接受的时间差范围。