<转载请注明出处>
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报文格式如下图
- Type 类型字段,值133
- Code 代码字段,值0
- Options 选项字段
- 源链路层地址选项 仅用于已编址的链路层可用于RS报文的只有源链路层地址选项,表明该报文发送者的链路层地址。如果IPv6头的源地址为未指定地址,则不能包括该选项
同时,IPv6报文头中的字段要求如下:
- Hop Limit 值255,保证是本地链路上的报文
- Source Address 发送接口的本地链路地址或未指定地址
- Destination Address 本地链路中所有路由器的组播地址FF02::2
1.2.2 路由器通告报文RA Router Advertisement Message
路由器周期性的发布RA消息,其中包括前缀和一些标志位的信息,或者以RA报文响应路由器请求报文RS。RA的报文格式如下图。
- Type 类型字段,值134
- Code 代码字段,值0
- M管理地址配置标识(Managed address configuration)
- 0-无状态地址分配,客户端通过无状态协议(如ND)获得IPv6地址;
- 1-有状态地址分配,客户端通过有状态协议(如DHCPv6)获得IPv6地址。
- O 其它有状态配置标识(Other stateful configuration)
- 0-客户端通过无状态协议(如ND)获取除地址外的其他配置信息;
- 1-客户端通过有状态协议(如DHCPv6)获取除地址外的其他配置信息,如DNS、SIP服务器信息。协议规定,若M标记置为1,则O标记也应置为1,否则无意义。
- Router Lifetime 缺省路由器的生命周期(单位:秒)
表示发送该RA报文的路由器作为缺省路由器的生命周期。Router Lifetime最长9000秒小时,缺省值30分钟。如果该字段为0时,表示该路由器不能作为缺省路由器,但RA报文的其他信息仍然有效。
- Reachable Time 可达时间(单位:毫秒)
发送NS报文后,在得到邻居可达性确认后,认为邻居可达的时间,0表示不指定。路由器在接口上通过发送RA报文,让同一链路上的所有节点都使用相同的可达时间。若Reachable Time为0,表示路由器不指定该字段参数。该值可配置,RA报文中缺省值为0。
- Retrans Timer 重传定时器(单位:毫秒)
重传NS报文的时间间隔,用于邻居不可达检测和地址解析。若该值为0,表示路由器不指定该字段参数。该值可配置,RA报文缺省值为0。
- Options 选项字段
- 源链路层地址选项 仅用于已编址的链路层。当路由器正在多个链路层地址上进行负荷分担时,要忽略该选项。
- MTU选项 链路的可变MTU
- 前缀信息选项 用于地址自动配置的前缀信息,可包含多个
- 路由信息选项 用于主机生成缺省路由,表明前缀通过该路由器是可达的
同时,IPv6报文头中的字段要求如下:
- Source Address 必须是发送接口的本地链路地址
- Destination Address 组播地址FF02::1,或发送RS请求报文的主机的单播地址
1.2.3 邻居请求报文NS Neighbor Solicitation Message
主机通过NS消息可以得到邻居的链路层地址、检查邻居是否可达、重复地址检测等。
- Type 类型字段,值135
- Code 代码字段,值0
- Target Address 目标地址,16bytes
请求目标的IP地址,不能是组播地址,可以是本地链路、本地站点、全局地址。
- Options 选项字段
- 源链路层地址选项 ,和RS报文的选项相同,可用于NS报文的只有源链路层地址选项。源链路层选项仅用于已编址的链路层,如果IPv6头的源地址为未指定地址,则不能包括该选项。
同时,IPv6报文头中字段要求如下:
- Source Address 发送接口的地址或未指定地址(DAD检测)
- Destination Address 目的节点单播地址或目的节点地址对应的请求节点组播地址
需要说明,如果源地址为未指定地址,则目的地址应为被请求节点的组播地址,并且没有源链路层地址选项。
1.2.4 邻居通告报文NA Neighbor Advertisement Message
NA报文是主机对NS的响应报文,同时主机在链路层地址变化时也可以主动发送NA消息,以通知相邻节点自己的链路层地址或者角色发生改变。
- Type 类型字段,值136
- Code 代码字段,值0
- R 路由器标记(Router Flag)
表示NA报文发送者的角色。置位表示发送者是路由器,复位表示发送者为主机。
- S 请求标记(Solicited Flag)
置位表示为响应单播NS发送的NA报文。在NUD探测中,S标记作为邻居可达性确认标记;在组播通告或非请求单播通告中,S标记必须清零,如DAD检测中NS报文用的是被请求节点的组播地址,当地址冲突时,回应的NA报文的S标记需要清零。
- O 重载标记(Override Flag)
1-表示需要用目标链路层地址选项中的链路层地址,来更新邻居缓存表。
0-只有在链路层地址未知时,才能用目标链路层地址选项来更新邻居缓存表。
- Target Address 目标地址,16bytes
如果是针对NS而发送NA,该字段直接拷贝NS报文目标地址;如果不是针对NS发送的NA,该地址是链路层地址发生改变的网络节点的IP地址。目标地址不能是组播地址。
- Options 选项字段,只能是目的链路层地址选项,通告发送者的链路层地址。
同时,IPv6报文头中字段要求如下:
- Source Address 必须是发送接口的单播地址
- Destination Address 单播地址或者所有节点的组播地址(FF02::1)
1.2.5 重定向报文 Redirect Message
路由器通过重定向报文通知主机到目的地有更好的下一跳地址,或者通知主机目的地址为本网段邻居。
- Type 类型字段,值137
- Code 代码字段,值0
- Target Address 目标地址,16bytes
到达目的地址的下一跳地址。如果目标为路由器(本地链路外的报文),必须使用路由器的本地链路地址;如果是主机(本地链路报文),目标地址和目的地址必须一致。
- Destination Address 目的地址,即IPv6头部的目的地址,16bytes
- Options 选项字段
- 目标链路层地址选项:新下一跳的链路层地址。
- 重定向头选项:触发报文尽可能多的部分,但不应使重定向报文超过1280bytes。
同时,IPv6报文头中字段要求如下:
- Source Address 发送接口的本地链路地址
- Destination Address 触发重定向的数据报文的单播地址
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报文检测是否存在重复地址。详细步骤如下:
- 主机发送NS请求,并设置如下字段值
- source address为0.0.0.0
- desnation address为ff02::1(组播地址)
- target address为主机准备配置的地址,DAD即检测这个地址是否在网络上有重复
- Hop Limit字段值为255,主要是为了防止一跳以外的节点伪造ND报文
- 链路内收到该NS报文的主机将检测自身地址是否和target address重复,不重复则忽略,重复则发送NA报文,如果target address也是自己准备配置的地址,则放弃该地址并忽略NS报文
- 回复的NA报文的target address是从NS报文target address段直接复制过来,destination address 为组播地址
3.2 ND snooping监听过程
ND snooping则监听DAD交互过程,产生MAC-IP对应表filter table.步骤如下:
- 交换机收到DAD过程中的NS报文,将NS中的target address插入监听列表BST(Binding State Table)(如果这个地址不在BST中的话)设置ND snooping状态为SAC_START,初始化计时器MAX_DAD_DELAY
- MAX_DAD_DELAY超时前如果收到其他主机的NA回复报文,则删除BST中该地址信息,本次ND snooping监听结束,反之设置ND snooping状态为SAC_BOUND,初始化计时器MAX_SAC_LIFETIME,将该地址信息加入FT(filter table)
- 计时器MAX_SAC_LIFETIME超时后, 重设计时器MAX_DAD_PREPARE_DELAY,并发送NS报文到这个地址以期望得到它的MAC地址,在MAX_DAD_PREPARE_DELAY超时前如果没有收到NA回复,则删除BST,FT中的该地址信息,ND snooping监听结束,反之取出NA报文中的MAC地址,加入FT中,并设置计时器MAX_SAC_LIFETIME,ND snooping状态为SAC_QUERY
- 计时器MAX_SAC_LIFETIME超时后,交换机将返回上一步重新发送NS报文,以确认该地址是否正常,是否需要更新BST,FT。
3.3 ND snooping流程图