IPv6链路复用/地址选择/IPv6路由+RFC6724

发布时间 2023-04-19 23:48:02作者: m风行者

IPv6的一个重要特点是可以进行链路复用,然而这种性质可能会引起数据转发的些许问题。本文旨在介绍IPv6链路复用的相关情况。
本文主要介绍了复用链路IPv6下的源目地址选择,有基础者可直接阅读第2章节。(当然这种情况主要指的是上层协议未明确指定源目的情况下。)
如有疑问,欢迎留言指导。

第2章节基本描述了IPv6地址选择的规则,可直接阅读相关内容。

IPv6地址选择的相关内容,可参考2012年发布的RFC6724
关于IPv6/ICMPv6基础协议(ND,SLAAC,DAD,NUD)的介绍,可参考博客IPv6/ICMPv6-原理介绍+报文分析+配置示例

目录

@

1.IPv6基础内容

1.1.IPv6简介/分类

IPv6
@新一代的IP用于替代IPv4的下一代IP协议
@核心解决IPv4地址不足的问题

IPv6地址
IPv6地址共128bits,使用冒号分隔的16进制表达。128=16*8
@通用格式为X:X:X:X:X:X:X:X。X=16进制。

举例当X=2031时,
2031=0010 0000 0011 0001。

@压缩格式。
当X组中高位出现0时可进行省略,当每个X=0时,可进行”: :“缩写。但是”: :“缩写只可缩写一次。

举例,3001::1=3001:0000:0000:0000:0000:0000:0000:0001

其他还有内嵌IPv4的IPv6地址格式,暂不做介绍。

IPv6分类
IPv6的地址总共可分为3类:单播地址、组播地址、任播地址。
在这里插入图片描述//相关内容可参考2006年发布的RFC4291

单播地址
全球单播地址= =2000::/3,占据IPv6的1/8。
2000::至3FFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
唯一本地单播地址= =fc00::/7,占据IPv6的1/2^7。类似IPv4的私网地址,但是可全球唯一。站点本地地址。
FC00::至FDFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
链路本地地址= =fe80::/10,占据IPv6的1/2^10。
FE80::至FEBF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
内嵌IPv4地址= =0000::/8,可用于协议报文的源地址。
::至00FF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
未指定地址= =::/128,可用于协议报文的源地址。
内部环回地址= =::1/128。类似IPv4的127.0.0.1/32,操作系统的内部通信地址。
组播地址
指定组播地址= =ff00::/8,占据IPv6的1/2^8。
FF00::至FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
请求节点组播地址= =FF02:1:FF00.0000/104。主要用于ICMPv6地址使用。FF02:0:0:0:0:1:FF00:0至FF02:0:0:0:0:1:FFFF:FFFF

在具体的组播地址上
在这里插入图片描述Flag:4bits,目前只有0000和0001两种取值。0000表示为IANA分配的永久组播地址,0001为临时组播地址。
Scope:4bits,组播数据流在网络中发送的范围。

可参考2014年发布的RFC7346
1标识接口范围(不可传出,设备内部通信),
2标识链路本地也即仅在二层链路,
3标识区域本地范围,
4标识管理本地范围,
5标识站点本地范围,
8标识组织本地范围,
E标识全局范围等

Group ID:32bits,同IPv4组播地址。建议使用最后32bits。

常见的组播地址
@Node-Local=
FF01::1为所有节点组播;
FF01::2为所有路由器组播
@Link-Local=
FF02::1为所有节点组播
FF02::2为所有路由器组播
FF02::5为OSPFv3路由器组播
FF02::6为OSPFv3路由器DR组播
FF02::9为RIP路由器DR组播
FF02::13为PIM路由器DR组播

任播地址:使用较少
任播地址与单播地址使用相同的地址空间;配置时须明确表明是任播地址以此区别单播和任播。用于距离用户最近的地址传输:例如在ospf不同区域存在相同的任意播地址,通过cost优选可以让用户优选距离最近的节点。

IPv6组播MAC映射
将组播IP的后32bits,叠加至33:33后形成48bits的mac地址。

1.2.地址状态

2006年发布的RFC4291允许将多个单播地址分配给接口,并且2006年发布的RFC44292007年发布的RFC4862对IPv6的地址状态进行了定义
Tentative Address:分配给接口之前,正在验证链接上唯一性的地址。此时不讲该地址视为分配给接口,并丢弃发往该地址的数据包。但接收与ND的DAD相关数据包。
Preferred address:分配给接口使用的地址,并完全不受限制。Preferred_LifeTime时间内的地址,可被RA报文刷新。
Optimistic address:分配给接口使用的地址,但在链路上验证其唯一性时受到限制。可用但未进行完全的DAD检测。
Deprecated address:分配给接口地址,但不鼓励也不禁止使用。该地址不得创建新的交流关系,只能被动接收连接和保持原有连接。

Valid_LifeTime减去Preferred_LifeTime时间的地址获得该状态(RA的Prefix Option中携带)。
这个时间可用于地址前缀切换。超过Valid_LifeTime无法则启用该地址,也即invalid address。
//Optimistic address是一种特殊地址,RFC4429新引入。不能携带Soure Option的RS,发送NS源地址必须为未指定地址且NA回应必须将O-bit不置位避免影响Neighbor Cache,Optimistic address为源发送的NA也必须将O-bit不置位,不能进行地址解析但可以将数据转发给链路的默认路由器。

valid address:一个preferred或者deprecated address。
interface identifier:链路(至少)唯一的接口的链路相关标识符。用于和前缀一起完成地址自动生成。interface identifier介绍可参考RFC4291-IPv6 Addressing Architecture。如果这样产生的地址也无法保证唯一,有可能导致无法实现SLAAC。

考虑到IPv6地址的各种状态,多归下的地址使用,源地址为未指定地址/组播地址,节点运行了IPv4/IPv6双栈,等场景,此时在启动通信时通常会面临多个可能的源地址和目标地址。

通常情况下应用程序使用诸如getaddrinfo()[RFC3493]之类的API,这些API向应用程序返回地址列表。然后,应用程序使用connect()或sendto()将目标地址传递给网络栈。之后以列表中的第一个可用地址进行网络通信。

1.3.IPv6报文格式/配置

关于最新的IPv6报文格式相关内容,可参考2017年发布的RFC8200
链路层
Ethernet Type=0x86dd

其他的Ethernet Type举例:
802.1q Ethernet Type=0x8100;
IPv4 Ethernet Type=0x0800;
ARP Ethernet Type=0x0806;
MPLS Ethernet Type=0x8847;

IPv6报文格式在这里插入图片描述Version:4bits,IPv6固定为6。IPv4则固定为4。
Traffic class:8bits,QOS分类。功能类似于IPv4的DSCP。
Flow Label:20bits,流标签。通常可用于区分是否是同一个流。例如TCP/UDP通过5元组确定流,而IPv6可根据该信息判断是否是同一个流。
Payload length:16bits,有效载荷的长度,单位byte字节。除去IPv6基本报文的长度,也即载荷长+IPv6扩展报文长。
Next header:8bits,下一报头。携带的上层报头的信息类型,也即扩展IPv6头部的类型或者上层协议的类型。
Hop limit:8bits,条数限制。与IPv4的TTL功能相似。
Source Address:128bits,报文的源地址。
Destination Address:128bits,报文的目的地址。
Extension Headers:IPv6的扩展头部,长度不定。IPv6使用扩展头部来扩展其他功能,扩展性好。另一个好处是只携带所使用的功能,减小IPv6报文的长。

IPv6的配置
IPv6的一个特性是链路复用,也即一条链路上支持多个IPv6前缀。
1@手工配置
在这里插入图片描述
2@EUI-64分配
将MAC地址的第7bit置1(也有其他方案,指定第7bit进行反转),并将接口48bits的MAC地址从中间插入固定长度16bit的FFFE,共64bits。将该bits转成IPv6的格式,填充到所分配的前缀上。
对于前缀小于64,在前缀与后64bit间补0;大于64,则将冲突eui-64部分删除。
在这里插入图片描述

1@在单播MAC地址中,第1个Byte的第7bit是U/L(Universal/Local,也称为G/L,其中G表示Global)位,用于表示MAC地址的唯一性。如果U/L=0,则该MAC地址是全局管理地址,是由拥有OUI的厂商所分配的MAC地址;如果U/L=1,则是本地管理地址,是网络管理员基于业务目的自定义的MAC地址。
2@在单播MAC地址中,第1个Byte的第8bit决定单播和多播。
3@而在在EUI-64接口ID中,第7bit(也即IPv6地址后8个字节的第一个字节)的含义与MAC地址正好相反,0表示本地管理,1表示全球管理,所以使用EUIl-64格式的接口ID,U/L位为1,则地址是全球唯一的,如果为0,则为本地唯一。这就是为什么要反转该位。

3@IPv6 unnumbered
一个接口如果没有IP地址就无法生成路由也就无法产生IP报文转发报文。IPv6 unnumbered 就是路由器一个接口上没有配置地址,但借用其他其他接口的地址进行报文的路由转发。

以太口不能配置成无编号(unnumbered)接口。
串口中(同步口)中,使用也受限制。比如当封装成 帧中继的时候,只有点对点
的子接口才允许配置成unnumbered。另外X.25封装也是不允许的。
自动换行
Cisco 2500系列配置示例://关于本场景下的路由传递和出接口问题不做详细延申。在这里插入图片描述

4@SLAAC
利用Stateless Address Autoconfiguration协议进行IPv6地址的动态配置。
第6章节进行相关介绍。
5@DHCPv6
利用DHCPv6协议进行IPv6地址的动态配置

关于IPv6及其基本协议的介绍可参考IPv6/ICMPv6-原理介绍+报文分析+配置示例
自动换行
点击此处回到目录

2.IPv6

2.1.算法环境

策略表-Policy Table
策略表是一张最长前缀匹配的查找表,与路由表非常类似。在给定地址/前缀下,可得到2个值:优先级和标签。

优先级值Priority(A):用于对目标地址进行排序。如果优先级(A)>优先级(B),我们认为地址A的优先级高于地址B,这意味着我们的算法更倾向于将目标地址A排序在目标地址B之前。
标签值label(A):允许选择与目标地址前缀一起使用的特定源地址前缀的策略。如果标签(S)=标签(D),则算法优选使用源地址S和目的地址D。
A表示地址,S表示源,D表示目的。在这里插入图片描述windown/Linux主机上的策略表:
在这里插入图片描述

地址特性-Address Properties-Scope(A)
在第1章节中,我们介绍了IPv6的地址分类和IPv6地址状态,如果考虑到节点使用IPv4/6双栈的情况下源目的的选择将更为复杂。因此有必要对不同的情况进行区分。
组播地址作用域
单播站点本地(unicast site-local) = 组播站点本地(multicast site-local),
组播站点本地(multicast site-local) < 组播组织本地(multicast organization-local),
组播组织本地(multicast organization-local) < 全球单播(unicast global),
全球单播(unicast global) = 全球组播(multicast global)。

IPv4/IPv4映射地址范围:目的地地址选择算法同时对IPv6和IPv4地址进行操作。为此,必须为IPv4映射IPv6地址。
169.254.0.0/16具有link-local链路本地作用域。
127.0.0.0/8具有link-local链路本地范围。
其他IPv4地址(包括IPv4私网地址[RFC1918]和共享地址空间地址[RFC6598])被分配了全局范围。

169.254.0.0/16为DHCP地址自动分配[RFC3927]。
127.0.0.0/8为IPv4环回地址[RFC4007]第4节。
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16为IPv4私网地址.
100.64.0.0/10为共享地址空间地址只由服务提供商使用,专用于NAT。
且IPv4地址必须被视为具有IPv6的preferred状态。

嵌入IPv4的IPv6地址范围
嵌入IPv4的IPv6地址通常用于IPv4网络和IPv6网络的兼容,这些地址具有全局范围。并且被视为具有IPv6的preferred状态。

IPv6环回地址和其他格式地址
Loopback地址和NSAP地址具有全局范围,并且被视为具有IPv6的preferred状态。

关于移动IPv6地址的范围介绍可查看相关资料。

2.2.源地址选择算法

首先需要介绍候选源地址集
候选集合是可以用作给定目标地址的潜在源地址的所有地址的集合;源地址选择算法将从该集合中选择一个地址。通常是一个单播地址集。并且有如下要求:
1@:配置于Loopback环回接口的全球地址必须满足环回口的相应要求
2@:在某些情况下,目标地址可以用区域索引或其他信息约束候选集。
3@:对于目的地址为组播和链路本地地址的,候选源地址集必须仅包括与出接口属于同一链路的接口地址。
4@:对于目的地址为站点本地单播地址,候选源地址集必须仅包括与出接口属于同一站点的接口的地址。
5@:在任何情况下,组播地址和未指定的地址都不能包含在候选集中。
6@:纯IPv6节点仅支持Stateless IP/ICMP Translation (SIIT)情况下,对于目的地址为IPv4转化地址(IPv4-converted address),候选源地址集必须仅包括IPv4翻译地址(IPv4-translatable address)。
7@:如果应用程序或上层指定的源地址不在目标的候选集中,则网络层必须将其视为错误。如果应用程序或上层指定了目标候选集中的源地址,则网络层必须选择该地址。如果应用程序或上层未指定源地址,则网络层使用源地址选择算法

源地址选择算法用于为指定目的地址选择一个出向的单一源地址。并且该算法只涉及目的地址为IPv6地址的情况下。

这里的单一源地址指的是按算法规则对候选源地址集进行“排序”。完成后,选择候选源地址集第一个作为源地址。

源地址选择算法依据一下8条规则先后比较优胜者
S表示源地址、D表示目的地址,SA表示源地址A,SB表示源地址B,Scope(S)表示S的作用范围,Label(S)表示S在2.1章介绍策略表中的标签。地址作用范围可参考2.1章节地址特性介绍。

1@:如果S=D,选择该源地址S。
2@:在Scope(SA) < Scope(SB)前提下,如果Scope(SA) < Scope(D)则优选SB。否则优选SA。
3@:避免deprecated addresses,优选preferred addresses。
4@:优选home addresses。
如果SA是home address和care-of address而SB为普通地址,优选SA;
如果SA是home address而SB是care-of address,优选SA。

home address 和care-of address为移动IPv6所定义的相关内容,感兴趣者可查阅相关资料。

5@:优选出接口。
如果SA是发送到D的接口/下一跳,而SB被分配给不同的接口,则优先选择SA。
6@:优选匹配的Label(SA)
如果Label(SA) = Label(D)而Label(SB) <> Label(D),则优先选择SA。

该Label()位于先前介绍的策略表中,而且通常是可人为编辑的。

7@:优选临时地址temporary addresses
如果SA是一个临时地址temporary addresses而SB是一个公共地址,则优先选择SA。

需要重点强调的是,如上文所描述应用程序可依自己偏好进行地址选择。源地址选择算法只是提供了一种地址选择的方式。因此必须提供一种机制,允许应用程序颠倒此处介绍的第7条。例如,通过适当的API扩展。

temporary addresses:由于IPv6地址足够为所有设备分配全球唯一的单播地址,并同时由于SLAAC的自动地址分配等协议的存在使得使用者的IP/MAC很容易泄露。为此操作系统可以选用多个临时ip,每个ip有固定的生命周期。相关介绍可参考2021年发布的RFC8981及博客linux ipv6临时地址等内容。在这里插入图片描述

8@:进行最长前缀匹配。如果实现具有在源地址中选择的其他方式,则规则8可以被替代。例如,有链路检测的其他应用程序。
自动换行

2.3.目的地址选择算法

目的地地址选择算法获取目的地地址列表,并对地址进行排序以生成新列表。 该算法对IPv6和IPv4地址进行排序。并有如下10条规则:
1@:避免不可用的目的地。
2@:优选匹配的范围。
Scope(DA) = Scope(Source(DA))并且Scope(DB) <> Scope(Source(DB)),此时优选DA
3@:避免deprecated addresses。
4@:优选home addresses。
如果Source(DA)是home address和care-of address而Source(DB)为普通地址,优选DA;
如果Source(DA)是home address而Source(DB)是care-of address,优选DA。
5@:优选匹配的Label(SA)。
如果Label(Source(DA)) = Label(DA)而Label(Source(DB)) <> Label(DB),则优先选择DA。
6@:优选高优先级DA。
如果Precedence(DA) > Precedence(DB),则优先选择DA。
7@:优选本地传输。
如果DB需要进行封装传输机制而DA无需,则优先选择DA。
8@:优选更小范围。
如果Scope(DA) < Scope(DB),则优先选择DA。

注意与第2条规则的区分,一个是DA报文源地址的范围,一个是DA范围。

9@:进行最长前缀匹配。
10@:保持顺序不变。
如果在原始列表排序中DA由于DB,则优先选择DA。

同样的,如果实现具有其他目的地地址排序方式,则规则9和10可能被取代。

点击此处回到目录

2.4.地址选择举例

默认源地址选择:源地址选择规则与默认策略表一起产生以下行为

目的地址 候选源地址 默认选择结果 选择原因
2001:db8:1::1 2001:db8:3::1
fe80::1
2001:db8:3::1 scope
ff05::1 2001:db8:3::1
fe80::1
2001:db8:3::1 scope
2001:db8:1::1 2001:db8:3::1(deprecated)
2001:db8:2::1
2001:db8:1::1 相同地址
fe80::1 fe80::2(deprecated)
2001:db8:1::1
fe80::2 scope
2001:db8:1::1 2001:db8:1::2
2001:db8:3::2
2001:db8:1::2 最长前缀匹配
2001:db8:1::1 2001:db8:1::2(care-of address)
2001:db8:3::2(home address)
2001:db8:3::2 home address
2002:c633:6401::1 2002:3:1::13eb:22e8(temporary)
2001:db8:1::2
2002:3:1::13eb:22e8 label
2001:db8:1::1 2002:3:1::13eb:22e8(temporary)
2001:db8:1::2(public)
2002:3:1::13eb:22e8 temporary address

自动换行
默认目的地址选择:目标地址选择规则与默认策略表和源地址选择规则一起产生以下行为

候选源地址 目的地址列表 默认选择结果 选择原因
2001:db8:1::2
fe80::1
169.254.13.78
2001:db8:1::1
198.51.100.121
2001:db8:1::1 with 2001:db8:1::1 第2条scope
198.51.100.121 with 169.254.13.78
fe80::1
198.51.100.117
2001:db8:1::1
198.51.100.121
2001:db8:1::1 with fe80::1 第2条scope
198.51.100.121 with 198.51.100.117
2001:db8:1::2
fe80::1
10.1.2.4
2001:db8:1::1
10.1.2.3
2001:db8:1::1 with 2001:db8:1::2 高优先级
10.1.2.4 with 10.1.2.3
2001:db8:1::2
fe80::1
2001:db8:1::1
fe80::2
2001:db8:1::1 with 2001:db8:1::2 scope
fe80::2 with fe80::1
2001:db8:1::2(care-of address)
2001:db8:3::2(home address)
fe80::1(care-of address)
2001:db8:1::1
fe80::2
2001:db8:1::1 with 2001:db8:3::1 home address
fe80::2 with fe80::1
2001:db8:1::2
fe80::1(deprecated)
2001:db8:1::1
fe80::2
2001:db8:1::1 with 2001:db8:1::2 deprecated
fe80::2 with fe80::1
2001:db8:1::2
fe80::1
2001:db8:3f44::2
2001:db8:1::1
2001:db8:3ffe::1
2001:db8:1::1 with 2001:db8:1::2 最长前缀
2001:db8:3ffe::1 with 2001:db8:3f44::2
2002:c633:6401::2
fe80::1
2002:c633:6401::1
2001:db8:1::1
2002:c633:6401::1 with 2002:c633:6401::2 label
2001:db8:1::1 with 2002:c633:6401::2
2002:c633:6401::2
fe80::1
2001:db8:1::2
2002:c633:6401::1
2001:db8:1::1
2001:db8:1::1 with 2001:db8:1::2 高优先级
2002:c633:6401::1 with 2002:c633:6401::2

更新

点击此处回到目录