ICMPv6邻居通告NA(Neighbor Advertisement)消息是IPv6节点对ICMPv6邻居请求NS(Neighbor Solicitation)消息的响应,同时IPv6节点在链路层变化时也可以主动发送NA消息。
开启IPv6功能
开启IPv6功能,网卡会自动获得一个本地的链路的地址fe80开头的,如果没有这个locallink地址,说明没有使能,如果没有使能,在NDP(邻居发现协议)中没法进行 链路数据交换中会存在问题。
报文格式
1 | +0-------7-------15---------------31 |
字段 | 长度 | 含义 |
---|---|---|
Type | 1 Byte | 消息类型,此处值为136。 |
Code | 1 Byte | 该ICMPv6差错报文的始发者必须将该字段置为0,且接收端忽略该字段。 |
Checksum | 2 Byte | 用来在ICMPv6报文中检验数据和部分IPv6首部的完整性。 |
R | 1 bit | 路由器标记。当置1时,R位指出发送者是路由器。R位由Neighbor Unreachability Detection使用,用于检测改变为主机的路由器。 |
S | 1 bit | 请求标记。当置1时,S位指出通告被发送以响应来自目的地地址的Neighbor Solicitation。S位用作Neighbor Unreachability Detection的可达性确认。在多播通告和非请求单播通告中置0。 |
O | 1 bit | 替代标记。替代标志,1表示通告中的信息替代缓存,如更新链路层地址时,对于任播的回应则不应置位。在针对任播地址的请求通告中,以及在请求的前缀通告中它不能被置1。在其他请求通告中和在非请求通告中它应当被置1。 |
Reserved | 29 bit | 29位未使用字段。它必须由发送者初始化为0,接收者必须忽略它。 |
Target Address | 16 Byte | 对于请求的通告,是在Neighbor Solicitation消息(该消息催促这个通告)中的Target Address字段。对于非请求通告,是其链路层地址已经改变的地址。Target Address必须不是多播地址。 |
Options | 可变 | 选项:Target link-layer address: 目标的链路层地址,即,通告发送者。当响应多播请求时,在有地址的链路层上必须包括此选项。当响应单播Neighbor Solicitation时应当包括此选项。当对端节点由于没有缓存条目从而不能返回一个Neighbor Advertisements消息时,为了避免无休止的Neighbor Solicitation“递归”,对于多播请求必须包括 此选项。当响应单播请求时,可忽略此选项,因为请求的发送者有正确的链路层地址;其他情况,此选项不能在第一位置发送单播请求。然而,在此情况,包括链路层地址仅增加了少许开销,却消除了潜在的竞争条件,那里在收到对先前的请求的响应之前,发送者删除缓存的链路层地址。为TLV格式:Type: =2,字段长度为1字节。Length: 1字节,表示选项的长度(包括类型字段和长度字段),以8字节为单位计算。例如,IEEE802 地址的长度是1。Link-Layer Address: 可变长度的链路层地址。此字段的内容和形式(包括字节和比特顺序)一般由描述IPv6在不同链路层上如何运行的特定文件中规定。 |
- 邻居通告报文通常在本地链路范围内使用,因此跳数限制通常设置为255,以防止被路由器转发。根据RFC 4861,NDP报文应该具有255的跳数限制,作为有效性检查的一部分,以防止来自其他网络的欺骗。因此,如果用户将 hop_limit 设置为非255的值,可能会导致接收方忽略该报文,因为不符合协议要求。
配置项
/proc/sys/net/ipv6/conf
目录下,有一些可选的配置项目,可以在sysctl.conf中配置相关的项。
举例:
net.ipv6.conf.default.drop_unsolicited_na = 1
丢弃掉未经NS请求的NA报文,增强安全性。
NA报文
(1)当收到NS请求的时候,可以响应NS请求发送NA报文。
(2)当节点链路发生故障的时候,也可以主动发送NA通告。
- ICMPv6
主动构造NA通告报文
1 |
|
本地链路地址
- IPV6地址冲突会DAD检测,出现
tentative
则说明地址冲突。
- 本地链路地址刚激活的时候,发现有链路地址,过一段时间后地址消失,执行
ifconfig 或者 ip a
都是up状态,执行nmcli dev
命令看网卡不是处于连接的状态,原来是NetworkManager在搞鬼。
(1)开启dhcp,不成功,本地链路地址会掉,查看NetworkManager.service服务日志,报错如下。
(2)关闭网卡配置dhcp功能后,BOOTPROTO=none
,重启NetworkManager.service 服务,此问题解决。
(3)如果还不能解决,将网卡的从NetworkManager的管理中移除。修改对应的网卡配置文件ifc-ethxx,在文件末尾添加。
1 | NM_CONTROLLED=no |
reference
[1] https://datatracker.ietf.org/doc/html/rfc4291
[3] https://blog.csdn.net/qq_36428903/article/details/134563965