目录
一、 IPv6地址介绍
1.1. IPv6简介
IPv6 采用了 128 二进制地址(IPv4 是 32 位),因此 IPv6地址空间以地球人口 70 亿人计算,每人平均可分得约 4.86 ×1028 个 IPv6 地址。 IPv6 地址的表达形式一般采用 32 个十六进制数,例如:2001:0db8:85a3:08d3:1319:8a2e:0370:7344IPv6 在某些条件下可以省略,以下是省略规则:
规则1:每项数字前导的 0 可以省略,省略后前导数字仍是 0 则继续;
规则2:可以用双冒号"::"表示一组 0 或多组连续的 0,但只能出现一次。
大多数应用场景下,IPv6 地址由两个逻辑部分组成:64位的网络前缀和 64 位的主机地址,主机地址通常根据物理地址自动生成,称作 64 位扩展唯一标识(EUI-64)。
1.2. IPv6 的特点与挑战
IPv6 最大的特点就是具有大得多的地址空间,这一巨大的地址空间,为各种新应用的开展提供了可能,同时,也带来了IPv6 地址生成、使用、安全等多方面的问题。
题目 | 内容 |
网络路由的子网前缀(subnet prefix) | 子网前缀是在进行 IPv6 组网时,终端用户通过运营商、地区互联网注册中心(Regional Internet Registry,RIR)、互联网数字分配机构 IANA(The Internet Assigned Numbers Authority)等一层一层分配得来。 |
用于子网内寻址的接口标识(Interface ID,IID) | 用户接口标识的生成方案是 IPv6 所独有的问题,接口标识长度较长,如何能够既可以承载新的功能,同时又不产生额外的安全风险,需要进行精心的设计。 |
应用场景较为复杂 | 例如由于更广泛的物理网络支持所带来的不同,如 IPv6在用于 802.15.4 网络中时,为便于包头压缩,经常需要对 IPv6 地址进行压缩,因此需要生成便于压缩的地址;此外,无状态自动配置方式(Stateless Address Autoconfiguration,SLAAC)也为 IPv6 所独有。这也使得 IPv6 地址生成方式更为复杂。 |
1.3. IPv6 地址结构概述
根据 RFC4291,IPv6 地址按照其用途可以分为单播、组播和任播三种地址,单播地址标识了一个接口,组播地址标识了一组接口,任播地址在单播地址区间内分配,但是可以指定给多个接口(通常属于不同节点),发送到这些地址的数据包被路由到最近的一个接口,这三类 IPv6 地址分别实现了不同的需求。
1.4. IPv6 的地址空间分配概况
关于 IPv6 地址的规划,可以大致按照前 3比特来理解,::/3 用于分配特殊地址,常常用于 RFC中指定具有特殊意义的 IPv6 地址;2000::/3 作为全球单播地址,是各个运营商、用户等得到的地址;唯一本地地址、链路本地地址以及组播地址在最后的 e000::/3 地址块中,IPv6 地址空间的大致分配方案如下:
地址块 | 分配用途及其 RFC 来源 |
0:0:0:0:0:0:0:0- 1ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | IETF 保留 RFC4291 |
200:0:0:0:0:0:0:0-3ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | IETF 保留 RFC4048 |
400:0:0:0:0:0:0:0- 1fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | IETF 保留 RFC4291 |
2000:0:0:0:0:0:0:0-3fff:ffff:ffff:ffff:ffff:ffff:ffff:fff | IETF 保留 RFC4291 |
4000:0:0:0:0:0:0:0-fbff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | IETF 保留 RFC4291 |
fc00:0:0:0:0:0:0:0-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | 唯一本地单播地址 RFC4193 |
fe00:0:0:0:0:0:0:0-fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff | IETF 保留 RFC4291 |
fe80:0:0:0:0:0:0:0-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff | 链路单播地址 RFC4291 |
fec0:0:0:0:0:0:0:0-feff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | IETF 保留 RFC3879 |
ff00:0:0:0:0:0:0:0-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | 组播地址 RFC4291 |
1.5. IPv6 全球单播地址结构
在 IPv6 网络的使用和运行中,我们接触到的地址一般都是全球单播地址,来自于 2000::/3 地址块,定义于 RFC4291。从全球单播地址块到最终用户,需要经历多个过程。 一些具有特殊意义的单播地址,没有分配到在::/3 地址块中,而是分配到了 2000::/3 地址块中,究其原因,主要是因为这些特殊的地址块,本身也需要全球可路由,因此不太适合分配在::/3 地址块中。RFC 中直接分配的全球单播地址,主要是为了满足各种特殊用途,如测试、文档用的 IPv6 地址块。如定义于 RFC5180的 2001:2::/48,在 IPv6 的测试时使用;定义于 RFC 3849的 2001:db8::/32,主 要用于文档示例中。 各个 RIR 负责本地区 ISP 的地址分配,也可以直接给最终用户分配,分配策略取决于各个 RIR 的政策,各个 RIR 有自己的分配政策,例如 APNIC 的 《IPv6 地址分配指导建议》,一般而 言,ISP 从 RIR 得到/32 地址,然后根据需要给成员单位、更小的运营商、或者最终用户分配/48 等大小的地址块,而成员单位、更小的运营商、或者最终用户给子网分配/64 地址块,分配的流程如图
1.6. IPv6 地址的获得
1.7. 通过DHCPv6获取地址
DHCPv6 | 详情 |
有状态DHCPv6 | 如果托管地址配置标记即 M 标记设置为 1,则要求主机使用 DHCPv6 配置协议来获取有状态地址。如果其他有状态配置标记即 O标记设置为 1,则表明主机需要使用配置协议来获取其他配置设置。 |
无状态DHCPv6 | 由于 IPv6 中没有 IPv6 到 IPv6 网络的地址翻译,DHCPv6 还可以给节点分配前缀,也就是所谓地址委派 DHCP-PD,通过地址委派,可以让下级连接点获得一个/56 或/64 大小的子网。 |
1.8. IPv6 组播地址结构
组播地址定义于 RFC4291,一个组播地址代表了一组接口,发往组播地址的数据包将发送给这一组接口,同时每一个接口也可以加入多个组播组。组播可以分为 任 意 源 组 播 ( Any-Source Multicast,ASM)和特定源组播(Source-Specific Multicast,SSM)两种。 IPv6 的组播组地址格式如图 :最高的 8个比特为 0xFF,标识此地址为组播地址,接着的 4个比特为标志(Flag)位,标志位的最高位为 0;R比特表示是否是内嵌 RP 的组播地址(定义于 RFC 3956);P 比特表示组播地址是否是基于单播前缀生成的(定义于 RFC 3306);T 比特表示组播地址是永久分配的还是临时分配的,T 为 1 时标识这是一个临时分配的组播地址,T 为 0 时表示这是一个由 IANA 指定的知名组播地址。 标志位根据一个组播地址的功能、生成方式等属性进行了标识,之后的 4 个比特为表示组播的范围,常见的范围有本地接口(Interface-local)、本地链路(Link-local)、本地站点(Site-local)、本地机构(Organization-local)等。RFC 7346中进一步定义了本地领域(Realm-local)范围,定义为同一种物理网络所覆盖的范围,对于 IP-over-IEEE802.15.4网络,则是具有同一个个人范围内网络标识(PAN ID)的网络。
1.8.1. 临时组播地址生成方案
临时分配的组播地址中,标志位的 T 比特为 1。对于临时分配的组播地址而言,如何在使用时避免冲突是一个重要的研究问题,针对这一问题,IETF提出了基于单播前缀的组播地址、内嵌汇聚点(Rendezvous Point)RP 地址的组播地址以及链路范围内的 IPv6 组播地址。尽管临时组播地址也可以动态分配获得,不过动态分配方式一直没有得到广泛应用。
1.8.2. 基于单播前缀的组播地址生成方案
因为没有机构去分配组播地址,但是由 IANA分配单播前缀,因此一种思路就是通过单播前缀生成组播地址就可以实现组播地址的不冲突。基于单播前缀的组播地址结构如图
1.8.3. 内嵌 RP 地址的组播地址生成方案
汇聚点(Rendezvous Point ,RP)是组播网络中的一台作为组播共享树根节点的路由器。内嵌 RP地址的 IPv6 组播地址定义于 RFC3956,当组播路由器收到这样组播组的数据包就可以检测出该组的 RP 地址。其中 plen 不为 0 且不超过 64。 RP 地址可以根据 plen 所指示的,取网络前缀部分中的相应长度作为前缀,之后补 0,最后四比特为 RIID,这样随着 RIID 的不同,可能形成 15个 RP 地址(RIID 为 0 的情况保留)。内嵌 RP 地址的 IPv6 组播地址区间为 ff70::/12,RFC 7371允许FF1 标志之中的第一比特设置为 1 的情况,则内嵌RP 的地址的 IPv6 组播地址还可以是 fff0::/12。
1.8.4. 链路范围内的组播地址生成方案
RFC 4489中定义了链路范围内的 IPv6 组播地址,这种组播地址中,标志位必须为 0011,范围必须小于等于 2,保留域必须为 0,plen 值为特殊值“11111111”(十进制 255),然后是 64 比特的接口标识 IID,该 IID 为本链路使用的 IID,而且已经经过 DAD 检测。
1.8.5. 永久组播地址
除了临时组播地址之外,IANA 还批准了许多永久的组播地址,这些组播地址通常用于各种依赖于组播的服务发现中。RFC 2375[42]、RFC4291总结定义了一些永久的组播地址,这些定义的组 ID具有预定义的范围,不能作为其他范围的永久组播地址。其中被请求节点(Solicited-Node)组播地址为节点单播和任播地址的一个函数,它通过把任播 或 单 播 地 址 的 后 24 比 特 和 前 缀ff02:0:0:0:0:1:ff00::/104 合 并 形 成 , 格 式 为ff02:0:0:0:0:1:ffxx:xxxx 随着 IPv6 组播的广泛使用,更多的永久性的IPv6 组播地址被 IANA 分配。除了 IETF 之外,另外一些标准化组织如 IEEE、UPNP 论坛等也纷纷向IANA 申请了永久的 IPv6 组播地址。之所以有大量的协议使用到了永久组播地址,主要是出于如下几方面的原因:
1.9. IPv6任播地址结构
任播地址从单播地址空间内进行分配,并没有特殊的格式。通过将服务部署于具有相同的任播地址,但在不同位置的多个节点,任播可以实现在单一地址下的更可靠、更有效的服务。RFC4786指出任播的部署可以实现粗粒度的负载均衡、减少拒绝服务攻击、便于确定流量来源、提高客户响应速度、便于单地址下实现可靠服务等多个目的。任播部署的核心问题在于如何通过路由系统的配置实现单地址、多节点的可达。根据任播部署的范围,可以分为本地范围任播(Local-Scope Anycast)和全球范围任播。本地范围任播通过在内部网关协议(Interior Gateway Protocol,IGP)的配置实现,而全球范围任播则需要在域间路由协议(Border Gateway Protocol,BGP)进行配置。对于两者而言,配置又有所不同,例如配置内部路由可以不受前缀长度的限制,而域间路由配置时有可能无法宣告过小的前缀长度,RFC4786研究了这一问题并给出了一些推荐建议。
IPv6任播应用 | 详情 |
---|---|
2001:1::1/128 | 定义于 RFC7723,用于端口控制协议(Port Control Protocol ,PCP),主要用于发现支持 PCP 协议的 NAT、防火墙或其他Middlebox 设备,对应的 IPv4 任 播 地 址 为192.0.0.9/32。端口控制协议主要用于主机控制 NAT设备或防火墙,从而实现个性化的数据包翻译或转发策略。 |
2001:1::2/128 | 定义于 RFC8155,用于TURN协议。TURN 协议用于提高 P2P 应用的连接性,它使得即使连接的双方都在 NAT 之后也能建立连接。这一任播地址主要用于寻找 NAT 穿越中继,相对应的 IPv4 的地址为 192.0.0.10/32。 |
2001:3::/32 | 定义于 RFC7450,主要用于发现自动组播隧道协议中继。AMT 用于将来自于组播网络中的组播数据,通过基于UDP的隧道封装,发送到没有连接到该组播网络的节点上,对应的IPv4任播地址为192.56.193.0/24 |
2001:4:112::/48 | 定义于 RFC7535,用于AS112项目。目前许多地方使用非全球唯一的 IPv4地址如10.0.0.0/8、192.168.0.0/16 的地址,有时会出现针对这些地址的逆向解析,鉴于这些地址只有局部意义,理想情况下应当由本地回答,但是这难于实现,AS112项目意图建立一个这些请求的分布式的吸收点。 |
2620:4f:8000::/48 | 定义于 RFC 7534,也是用于 AS112 新项目。AS112项目中使用 IPv4 任播地址 192.175.48.0/24 和 IPv6任播地址2620:4f:8000::/48来提供对内部地址逆向解析请求的授权回答。 |
任播在局域网内的应用 | RFC4291中定义了子网路由器任播地址,用于子网前缀就是某一链路的子网前缀,接口标识为0,发往这一地址的数据包被交给子网中的一台路由器,这一任播地址主要用于主机与任一个路由器通信时使用。 |
二、 IPv6地址规划
2.1. IPv6子网划分思考
庞大的IPv6地址空间在制订编址计划方面,为网络工程师提供了极高的灵活性。在构建编址空间时,主要需要注意两个问题:一是怎样设定子网规模和分配子网地址;二是怎样分配接口标识符。
- 当前网络的总体规模和未来的增长趋势——企业在预估需要申请多大的IPv6地址块时,必须考虑到网络的总体规模。网络规模应当考虑到子网数量。相比之下,IPv4规划则主要是基于终端系统的数量。
- 增长是在分配子网时必须考虑的另外一个因素。可以根据企业前缀中的位边界,分配和操作子网。在子网规划中还需要留出一定的空间,以支持未来的增长,便于为网络添加更多的子网。通过保留相邻的地址块空间,将可以容纳这些额外的子网。
- 在分配前缀长度时,需要考虑两个网络——带有终端站的网段和基础设施网段。对于连接至终端站的网段,IPv6的编址RFC建议使用/64前缀长度。因为每个网段有264个可用地址,很可能不会看到企业为托管终端系统的网段采用短于/64的前缀长度。如果采用无状态自动配置方法将接口ID分配给终端站,那么也需要使用/64网段前缀。安全邻居发现和私密性扩展也需要使用/64前缀。
2.2. IPv6地址分配规划
深入研究完成IPv6地址分配的技术细节。你应该在地址分配规划的每一层都使用共同的分配技术,但在地址规划层次结构的不同水平阶段可以应用不同的技术。
例如:定义了4个层级,开始是源IPv6地址段2001:db8:1a::/48,为核心分配 /56前缀,/56前缀分配给汇聚,/64前缀给接入层/站点/子网。我们可以对核心层使用稀疏技术,对区域使用最合适,对站点使用随机,对子网使用单调的分配技术。
2.3. IPv6地址单调分配
单调分配方案仅仅分配子网,从块地址0,1,2开始计算。如果我们在核心层使用这种方法,首先分配地址0,2001:db8:1a:0000::/56(i.e., 2001:db8:1a::/56),然后是地址1,2001:db8:1a:0100::/56,然后是地址2,2001:db8:1a:0200::/56,等等。这个方法是最简单的,仅仅只计算从0到f,在当前层面提供最多16个地址块。
2.4. IPv6地址稀疏分配
RFC 3531描述了稀疏分配技术,它继承自单一计数,但是从最左边位元开始而不是从最右边开始。以一个4位元为例,从最右边计数产生0000,0001,0010,0011,...或者0,1,2,3,...如我们前面的章节所看到的。从最左边计数产生0000,1000,0100,1100,...或者0,8,4,c,... 其根本上是最右边按位计算的镜像。这种技术的效果是尽可能的分散分配。 这种方案的动机除了分配地址之外,也为未来的成长预留分配空间。如果核心路由器1 Rc1未来需要更多的地址空间,这是很有可能的,那么一个连续的地址块是可用的(未分配),所以我们可以分配2001:db8:1a:800::/56 地址段。最大的好处是Rc1不需要通告另外的地址段,我们仅仅需要修改已经通告地址块的前缀长度就行了。因为2001:db8:1a:400::/56和2001:db8:1a:500::/56 能被合并成一个单一的地址块,2001:db8:1a:4000::/55,我们只需要调整Rc1路由通告的前缀长度。这有助于增加IP地址空量,而不需要在路由器的路由表或者路由协议更新时增加路由。
2.5. IPv6地址最适合分配
在IPv4中无类域间路由(CIDR)引入了可变长度非八位限制的网络编址概念,可以更加精确的符合地址容量的需求,并且节省IPv4的地址空间。在拥有海量IPv6地址空间的今天,这可能不是一个考虑因素。通常,你需要保持事情的简单性,尽可能为层次结构中的每一层都分配同等大小的地址块。为了说明这种技术,下图展示了一个最适合分配的案例,为了满足要求,需要分配最小的可用地址块。在图中,我们分配了三个/56前缀地址给三个路由器,但Rc2需要分配更大的地址,/55前缀 ,分配 2001:db8:1a:200::/55地址。
2.6. IPv6地址随机分配
随机分配机制的特点是把用于分配层的比特位进行随机化。在分配4个比特位用于核心层。定义一个0至15(f)的随机数,如果没有用于分配,就分配此地址块。下图演示了随机分配案例。对于路由器Rc0,随机数是5,Rc1的随机数是8,Rc2的随机数是15。这种随机分配方案可能最适合避免使用单调块计算分配的站点或子网,从安全的角度来说,使别人更难以跟踪和发现你的IP分配计划。
2.7. IPv6地址前缀委托
前缀委托本身不是一种分配技术,但它为使用DHCPv6协议的网络提供了一种自动分配的机制。配置了地址池的路由器或者DHCPv6服务器可以分配整块给下游请求的路由器。例如,希望为客户端分配/56地址块的服务提供商可以通过配置前缀委托来自动完成此过程。
2.8. IPv6地址块设计
2.8.1. 三层结构
2.8.2. 大二层结构
2.8.3. 宿舍区IP地址块分析