<转载请注明出处>
1. ND协议介绍
邻居发现协议(Neighbor Discovery Protocol,以下称ND协议)是IPv6的一个关键协议,可以说,ND协议是IPv4某些协议在IPv6中综合起来的升级和改进,如ARP、ICMP路由器发现和ICMP重定向等协议。当然,作为IPv6的基础性协议,ND还提供了其他功能,如前缀发现、邻居不可达检测、重复地址检测、地址自动配置等。
1.1 IPv6协议格式
Version(4-bit):IP版本,该字段值为6
Traffic Class(8-bit):流量分类,与IPv4包头的TOS类似
Flow Label(20-bit):流标签,用来标记IPv6数据包的一个流
Payload Length(16-bit):有效载荷的长度,有效载荷为紧跟IPv6包头的数据包的其他部分
Next Header(8-bit):处理选项字段,分段,安全,移动性,松散源路由,记录路由等的新方式。该字段在承载ND报文时字段值为58(ICMPv6)。该字段详细字段值对应如下表
Value | Type of Header |
0 | Hop-by-Hop Options Header |
6 | TCP |
17 | UDP |
41 | Encapsulated IPv6 Header |
43 | Routing Header |
44 | Fragment Header |
50 | Encapsulating Security Payload |
51 | Authentication Header |
58 | ICMPv6 |
59 | No next header |
60 | Destination Options Header |
Hop Limit:(8-bit):定义IP数据包所能经过的最大跳数,每跳一次将此值减1
Source Address(128-bit):IP数据包的源地址
Destination Address(128-bit):IP数据包的目的地址
1.2 ND报文类型
ND协议定义的报文使用ICMP承载,其类型包括:路由器请求报文(RS)、路由器通告(RA)报文、邻居请求报文(NS)、邻居通告报文(NA)和重定向报文。
1.2.1 路由器请求报文RS Router Solicitation Message
主机启动后,通过RS消息向路由器发出请求,期望路由器立即发送RA消息响应。RS报文格式如下图
同时,IPv6报文头中的字段要求如下:
1.2.2 路由器通告报文RA Router Advertisement Message
路由器周期性的发布RA消息,其中包括前缀和一些标志位的信息,或者以RA报文响应路由器请求报文RS。RA的报文格式如下图。
表示发送该RA报文的路由器作为缺省路由器的生命周期。Router Lifetime最长9000秒小时,缺省值30分钟。如果该字段为0时,表示该路由器不能作为缺省路由器,但RA报文的其他信息仍然有效。
发送NS报文后,在得到邻居可达性确认后,认为邻居可达的时间,0表示不指定。路由器在接口上通过发送RA报文,让同一链路上的所有节点都使用相同的可达时间。若Reachable Time为0,表示路由器不指定该字段参数。该值可配置,RA报文中缺省值为0。
重传NS报文的时间间隔,用于邻居不可达检测和地址解析。若该值为0,表示路由器不指定该字段参数。该值可配置,RA报文缺省值为0。
同时,IPv6报文头中的字段要求如下:
1.2.3 邻居请求报文NS Neighbor Solicitation Message
主机通过NS消息可以得到邻居的链路层地址、检查邻居是否可达、重复地址检测等。
请求目标的IP地址,不能是组播地址,可以是本地链路、本地站点、全局地址。
同时,IPv6报文头中字段要求如下:
需要说明,如果源地址为未指定地址,则目的地址应为被请求节点的组播地址,并且没有源链路层地址选项。
1.2.4 邻居通告报文NA Neighbor Advertisement Message
NA报文是主机对NS的响应报文,同时主机在链路层地址变化时也可以主动发送NA消息,以通知相邻节点自己的链路层地址或者角色发生改变。
表示NA报文发送者的角色。置位表示发送者是路由器,复位表示发送者为主机。
置位表示为响应单播NS发送的NA报文。在NUD探测中,S标记作为邻居可达性确认标记;在组播通告或非请求单播通告中,S标记必须清零,如DAD检测中NS报文用的是被请求节点的组播地址,当地址冲突时,回应的NA报文的S标记需要清零。
1-表示需要用目标链路层地址选项中的链路层地址,来更新邻居缓存表。
0-只有在链路层地址未知时,才能用目标链路层地址选项来更新邻居缓存表。
如果是针对NS而发送NA,该字段直接拷贝NS报文目标地址;如果不是针对NS发送的NA,该地址是链路层地址发生改变的网络节点的IP地址。目标地址不能是组播地址。
同时,IPv6报文头中字段要求如下:
1.2.5 重定向报文 Redirect Message
路由器通过重定向报文通知主机到目的地有更好的下一跳地址,或者通知主机目的地址为本网段邻居。
到达目的地址的下一跳地址。如果目标为路由器(本地链路外的报文),必须使用路由器的本地链路地址;如果是主机(本地链路报文),目标地址和目的地址必须一致。
同时,IPv6报文头中字段要求如下:
1.3 ND主要功能
1.3.1 路由器发现
路由器发现是指主机怎样定位本地链路上路由器和确定其配置信息的过程,主要包含以下三方面的内容:
在路由器通告报文RA中承载着路由器的相关信息,ND协议通过RS和RA的报文交互完成路由器发现、前缀发现和参数发现三大功能。协议交互主要有两种情况:主机请求触发路由器通告和路由器定期发送路由器通告。
1.3.2 地址解析
地址解析是指某节点在知道目的节点IP地址的情况下,确定目的链路层地址的过程。
当一个节点需要得到同一本地链路上另外一个节点的链路层地址时,需要进行地址解析,该机制类似于IPv4中的ARP。 ND协议用NS和NA报文完成IPv6地址到链路层地址的解析,解析后的链路层地址和IP地址等信息用来建立节点的一个邻居缓存表项。
1.3.3 邻居不可达检测NUD
邻居不可达检测是节点怎样确定邻居不可达状态的过程。ND协议用NS和NA报文来验证邻居节点的可达性。
1.3.4 重复地址检测DAD
重复地址检测是节点确定即将使用的地址是否被另一节点使用的过程。
在节点自动配置某个接口的IPv6单播地址之前,必须在本地链路范围内验证要使用的临时地址是唯一的,并且未被其他节点使用过。ND协议使用NS/NA报文完成该功能。
2. ND常见攻击
2.1 重复地址检测DAD攻击
在结点使用无状态协议自动配置时发送NS报文,NS报文中附带了结点准备使用的地址target address,攻击者伪造NA报文,回复称该地址已被使用,迫使结点更换target address,如此反复,结点将无法完成无状态协议自动配置。
针对DAD攻击,可以采用ND snooping,DHCP snooping,ND detection技术防范。
DHCP snooping与IPv4一样,通过监听DHCP的交互进程,获得用户的IP,MAC,连接的交换机端口号的绑定表项。ND snooping与前者很类似,监听ND协议的DAD交互过程,获取用户的IP、MAC、Port的对应关系。
ND Detection是H3C在ND防攻击方面的创新技术,通过结合已经建立的绑定表项,这个绑定表项可以是使用ND snooping,DHCP snooping,手工来进行配置的,通过比较已经获取到的可信表项中的IP与MAC地址,对ND报文进行过滤,丢弃异常的报文。相比单纯使用ACL进行的用户绑定,ND Detection技术结合绑定表项对ND报文进行过滤,能够较好的防御ND攻击。
2.2 地址欺骗
地址欺骗类似IPv4中的ARP欺骗,攻击者伪造RS/NS/NA报文来修改受害主机或网关上受害主机的MAC地址,造成受害主机无法与网络进行正常的通信。
防范方法与DAD攻击防范方法类似。
2.3 网络配置参数攻击(RA伪造攻击)
RA能够携带很多网络配置信息,包括默认路由器,网络前缀列表,是否使用DHCP服务器进行有状态地址分配等网络配置的关键信息。如果受害者接收了虚假的RA信息,会造成网络配置错误,从而引发欺骗攻击。
防范方法为设置RA信任端口,将来自不信任端口的RA报文丢弃。
2.4 针对网关的泛洪攻击
通过发送大量的NS/RS报文,造成网关的表项溢出。
为了避免网关的ND表项被异常的ND报文打满溢出造成DoS攻击,在网关上能够针对端口配置最大的ND表项学习数量,能够缓解此类攻击。
3. ND snooping实现机制
以下为简单翻译结果,详细请参考 IETF草案Control Packet Snooping Based Binding draft-bi-savi-cps-00.txt 8.3节
3.1 DAD交互过程
根据本文1.3.4重复地址检测DAD的描述,主机在自动配置或手动配置IPv6地址时,会通过NS/NA报文检测是否存在重复地址。详细步骤如下:
3.2 ND snooping监听过程
ND snooping则监听DAD交互过程,产生MAC-IP对应表filter table.步骤如下:
3.3 ND snooping流程图