IPv6子网划分如何工作?与IPv4子网划分有何不同?


116

这是有关IPv6子网划分的典型问题

有关:

我对IPv4子网划分了解很多,并且在准备(部署)IPv6网络时,我需要知道这些知识中有多少是可以转让的,以及我仍然需要学习什么。乍看起来,IPv6比IPv4复杂得多。所以我想知道:

  • IPv6是128位,那么/ 64为什么是主机推荐的最小子网?与此相关:
    • 为什么建议在路由器之间的点对点链接中使用/ 127,为什么过去却反对使用?我应该将现有的路由器链接更改为使用/ 127吗?
    • 为什么要为虚拟机配置少于/ 64的地址?
    • 在其他情况下,我会使用小于/ 64的子网吗?
  • 我可以直接从IPv4子网映射到IPv6子网吗?例如,IPv4 / 24是否直接对应于IPv6 / 56或/ 120?
  • 我的接口有几个IPv6地址。所有子网的子网都必须相同吗?
  • 为什么有时在IPv6地址中看到%而不是/,这是什么意思?
  • 我在浪费太多子网吗?我们不只是要再次耗尽吗?
  • IPv6子网与IPv4子网在其他哪些主要方面不同?

Answers:


138

关于IPv6子网划分,首先要提到的是需要一种不同的思维方式。在IPv4中,您通常会考虑可用的地址数量以及如何为每个最终用户分配足够的地址。在IPv6中,通常会考虑可用的子网数(/ 64),以及如何将其分配给最终用户。您几乎不必担心给定子网中将使用多少个IP地址。除了点对点链接之类的特殊情况外,每个子网都只是拥有比其所需的更多地址可用的地址,因此,您不必担心分配子网,而不必担心它们内部的主机。

IPv6子网通常为/ 64,因为这是SLAAC(无状态地址自动配置)正常工作所必需的。即使未使用SLAAC,也可能有其他原因使用/ 64。例如,可能有一些最终用户设备仅假设/ 64,否则在某些路由器上,比/ 64长的路由子网可能效率低下,因为路由器实施者已对/ 64或更短的路由进行了优化,以节省时间。路由表内存。

为什么建议将/ 127用于点对点链接

对于点对点链接的特定情况,建议使用/ 127而不是/ 64,以避免出现这样的漏洞:子网上到达未使用地址的四分之一地址的数据包地址会导致不必要的邻居请求和表条目,可能会淹没路由器。此类地址错误的数据包可能是恶意的或偶然的。但是,即使您实际上将点对点链接配置为/ 127,也有人主张无论如何都要分配整个/ 64以便保持一致。

为什么要为虚拟机配置小于/ 64的子网?

我不知道为什么要为虚拟机配置小于/ 64的子网。也许是因为托管服务提供商假设服务器就像最终用户,并且只需要一个(/ 64)子网,却没有想到该服务器实际上是需要内部路由拓扑的VM的集合?也可以仅通过使寻址计划更易于记忆来完成:主机获取PREFIX::/64,然后每个VM获取PREFIX:0:NNNN::/96NNNN唯一的VM,VM可以随意分配PREFIX:0:NNNN:XXXX:YYYY

我可以直接从IPv4子网映射到IPv6子网吗?例如,IPv4 / 24是否直接对应于IPv6 / 56或/ 120?

从寻址和路由工作原理的低级角度来看,前缀长度在IPv6和IPv4中具有相同的含义。在该级别上,您可以进行类比,例如“ IPv4 / 16将一半的位用于网络地址,一半的位用于主机地址,这类似于IPv6中的/ 64”。但是这种比较并不是很恰当。IPv6中出现了强大的约定,这些约定使网络大小的划分看起来更像是IPv4中有类网络的旧世界。可以肯定的是,IPv6不会重新引入分类寻址,在该分类寻址中,地址的最高有效位会强制使用特定的网络掩码,但是IPv6 确实具有某些[事实上/传统上]的标准网络大小:

  • / 64:单个子网的基本大小:LAN,WAN,Web虚拟主机的地址块等...永远不要期望“普通”子网比/ 64小(更长的前缀)。绝不会期望子网比/ 64更大(前缀更短),因为/ 64的主机地址值远远超出了我们的想象。
  • / 56:256个基本子网的块。即使当前的策略允许ISP向每个最终用户分发最大为/ 48的数据块,并且仍然认为其地址利用率是合理的,但某些ISP可能(并且已经这样做)选择将/ 56分配给消费级客户,以作为一种折衷方案。为它们分配大量子网并解决经济问题。
  • / 48:65535个基本子网的块,以及每个ISP客户端站点应接收的建议大小的块。
  • / 32:大多数ISP每次从区域地址注册中心请求更多地址时将接收的默认块大小。

在服务提供商和企业网络内部,可以看到比这4个更多的前缀长度。查看这些网络内部路由器的路由表时,IPv4和IPv6有很多共通之处,包括路由工作的大多数方式:较长前缀的路由会覆盖较短前缀的路由,因此可以进行汇总(缩短)并进行钻取向下(延长)路线。像在IPv4中一样,可以将路由聚合或汇总为具有较短前缀的较大块,以最小化路由表的大小。

IPv4和IPv6之间映射的另一个问题是如何协调双堆栈计算机上的IPv4和IPv6分配,以便可以轻松理解寻址计划。到目前为止,确实有一些通用的约定可以做到这一点:将IPv4“子网号”嵌入到IPv6前缀的一部分中,可以使用BCD(例如,10.0.234.0/24变成2001:db8:abcd:234::/64)或二进制(10.0.234.0/24变成2001:db8:abcd:ea::/64)。

我的接口有几个IPv6地址。所有子网的子网都必须相同吗?

绝对不!与IPv4一样,通过同时具有来自不同子网的多个IP地址,有望使IPv6主机成为多宿主。如果使用SLAAC对它们进行自动配置,则不同的子网可能来自不同路由器的路由器通告。

为什么有时在IPv6地址中看到%而不是/,这是什么意思?

您不会看到一个而不是另一个。它们具有不同的含义。斜杠表示前缀(子网),表示所有以相同n位开头的地址块。没有斜杠的地址是主机地址。您可能会认为该地址的末尾有一个隐含的“ / 128”,这意味着指定了所有128位。

百分号随附链接本地地址。在IPv6中,每个接口除了可能具有的任何其他IP地址之外,还具有链路本地地址。但问题是,链接本地地址始终无一例外地位于该fe80::/10块中。但是,如果我们尝试使用链接本地地址与对等方通信,并且本地主机具有多个接口,我们如何知道要使用哪个接口与该对等方通信?通常,路由表会告诉我们用于特定前缀的接口,但是在这里,它将告诉我们fe80::/10通过每个接口可访问的接口。

答案是我们必须使用语法告诉它使用哪个接口address%interface。例如,fe80::1234:5678:8765:4321%eth0

我在浪费太多子网吗?我们不只是要再次耗尽吗?

没人知道。谁能告诉未来?

但是考虑一下。在IPv6中,可用子网的数量是IPv4 中可用单个地址的数量的平方。确实很多。不,我的意思是真的很多!

但是,仍然:我们会自动将/ 32分发给任何请求它的ISP,而我们会向每个ISP客户分发/ 48。也许我们夸张了,毕竟我们将浪费IPv6。但是有一个规定:到目前为止,只有IPv8空间的八分之一可供使用:2000::/3。这个想法是,如果我们把前八名搞得一团糟,而我们不得不大刀阔斧地修改自由派分配政策,那么在陷入麻烦之前,我们必须再尝试七次。

最后:IPv6不必永远持续下去。也许它的寿命比IPv4更长(已经是一个令人印象深刻的寿命,并且还没有结束),但是像每种技术一样,它总有一天将不再重要。我们只需要做到这一点。


13
很好的解释!特别是关于不同的心态。如果看一下数字,您会发现2000 :: / 3中有536,870,912 / 32(小型ISP)。世界人口为70亿,每13个人中就有一个ISP,每个这样的ISP可以拥有65,536个客户,每个客户/ 48。无需担心浪费地址:-)
Sander Steffann 2012年

是的,这是一个很好的解释。
Fergus 2012年

2
对2000 :: / 3的具体细节有很好的解释。
Koos van den Hout 2012年

5
很好的解释。对最终评论+1。我希望每个人都已经看到了:xkcd.com/865
Nico,

@SanderSteffann如果出现问题,ISP将新的/ 64分配给住宅用户而不是/ 48是合理的,而小型ISP一次请求请求4096个块(/ 52个块) )。当前的方案只是为了在每个层次上留出扩展空间而设计的。
immibis

45

IPv6是128位,那么/ 64为什么是主机推荐的最小子网?

首先,从RFC中获得一些ASCII技术来建立术语:

|         n bits         |   m bits  |       128-n-m bits         |
+------------------------+-----------+----------------------------+
| global routing prefix  | subnet ID |       interface ID         |
+------------------------+-----------+----------------------------+

全局路由前缀通常标识该地址所属的整个网络。通常为48位。接口ID标识给定的网络接口。通常是64位。剩下的16位是您的子网ID。

OK,继续说明:

根据RFC 4291-IP版本6寻址架构

除以二进制000开头的地址外,所有全局单播地址都有一个64位接口ID字段。

RFC 5375-IPv6单播地址分配注意事项

IPv4寻址计划的重要部分是确定每个子网前缀的长度。与IPv4不同,IPv6寻址体系结构[RFC4291]指定使用全局唯一地址和ULA的所有子网始终具有相同的64位前缀长度。

因此,忽略000前缀异常,接口ID 始终完全是64位。这是所有本地广播网络始终都是64位的另一种说法。如果您有IPv6地址,则其网络掩码始终为 64位。永不止息。如果为您分配的地址空间大于该地址空间(比64位短的网络掩码),则假定您将把该地址空间划分为64位网络并自己处理路由。如果为您提供的网络小于该网络(较长的网络掩码),则可能有人搞砸了。

那么,为什么是64位呢?

通常,IPv6地址是自动配置的,而不是分配的。路由器将通告可用的网络前缀(路由前缀+子网ID:前64位),并且您的计算机将使用其自己的唯一标识符填充后64位。您的计算机如何提供唯一标识符?有几种可能性,最常见的是使用接口的MAC地址。您将MAC分成两部分(供应商一半/串行一半),翻转供应商一侧的通用本FF:FE地位,然后将它们与中间部分重新连接在一起。如此00:30:48:01:23:45成为0230:48ff:fe01:2345。现在,在其左侧放置广告的64位网络前缀,您便拥有了IP地址。

这里的重点是,如果遵循此方案,则不会发生IP地址冲突。由于给定广播网络上的每个设备都需要一个唯一的MAC地址才能工作,因此将接口ID绑定到MAC地址意味着只要广播流量不冲突,IPv6地址也不会冲突。使用64位(而不只是48个专用于MAC地址的地址)提供了一些摆动空间,而不仅仅是该方案提供的地址(还有其他几个地址)。

在其他情况下,我会使用小于/ 64的子网吗?

不。除非你很伤心,否则不会。好吧,您可能有基于本地要求的理由,可以使用现有网络设置手动路由。但是请记住,这样做可能会使您一团糟:

RFC 5375开始-IPv6单播地址分配注意事项

使用/ 64以外的子网前缀长度将破坏IPv6的许多功能,包括邻居发现(ND),安全邻居发现(SEND)[RFC3971],隐私扩展[RFC4941],移动IPv6的一部分[RFC4866],协议独立多播-具有嵌入式RP [RFC3956]的稀疏模式(PIM-SM),以及通过IPv6中介(SHIM6)[SHIM6]进行的站点多宿主。当前正在开发或正在提议中的许多其他功能也依赖于/ 64子网前缀。

....

但是,某些网络管理员对连接路由器的链接使用的前缀长于/ 64,通常在点对点链接上仅使用两个路由器。在通过手动配置分配了所有地址且链接上的所有节点都是网络已知的路由器(不是终端主机)的链接上,管理员不需要任何依赖于/ 64子网前缀的IPv6功能,这能行得通。不建议一般使用长度大于/ 64的子网前缀,将其用于包含最终主机的链接将不是一个好主意,因为很难预测主机将来将使用哪些IPv6功能。

为什么建议在路由器之间的点对点链接中使用/ 127,为什么过去却反对使用?

您可能希望掩盖RFC 3627-在认为有害的路由器之间使用/ 127前缀长度。然后看看随后的RFC 6164-在路由器间链接上使用127位IPv6前缀

反对在路由器上使用长于/ 64的前缀的原因与路由器自动配置有关,在极少数情况下可能会失败。反对使用短于/ 127(仅2个主机)的前缀,这与许多与将数据包发送到未路由地址有关的潜在拒绝服务问题有关。由于现实世界中的拒绝服务问题比理论上的自动配置失败要严重,因此/ 127是新的首选。

我应该将现有的路由器链接更改为使用/ 127吗?

如果您控制IPv6路由器,建议您阅读两个RFC(它们很短!),然后自己决定。

我可以直接从IPv4子网映射到IPv6子网吗?

例如,IPv4 / 24是否直接对应于IPv6 / 56或/ 120?

其实,是。还记得我们之前故意忽略的000前缀吗?好吧,这是一个用途:

在双堆栈系统(同时具有IPv4和IPv6堆栈的系统)上,可以使用IPv6机制表示IPv4。他们称其为“ IPv4映射的IPv6地址 ”。模式为全零,后跟FFFF,后跟32位IPv4地址。

因此,192.168.100.21变得::FFFF:C0A8:6415-或更简单地说: ::FFFF:192.168.100.21。由于该右手位表示一个IPv4地址,因此通常以点分十进制形式写出。

由于这是实际的IPv4地址,因此仍使用IPv4标头等,这意味着必须存在IPv4堆栈,必须设置IPv4路由等。优点是您可以使用单个地址结构表示IPv4和IPv6地址,这可以简化应用程序开发。就网络而言,这没有什么区别。


20
  1. IPv6是128位,那么/ 64为什么是主机推荐的最小子网?

    此前缀大小最初是在较旧的RFC中建议的-此后已对该策略进行了修订,其中考虑了邻居发现攻击的问题,并且使用/ 126是有效的缓解方法-尽管如此,如果您要通过以下方式设置PtP链接:路由流量的唯一目的是,另一种选择是坚持使用/ 64和该子网的防火墙。更好的是,为自己分配一个池,从中可以提取/ 64个子网,并将整个池作为边缘(以及可能来自于敌意的任何其他地方)的黑名单目的地

  2. 为什么建议在路由器之间的点对点链接中使用/ 127,为什么过去却反对使用?我应该将现有的路由器链接更改为使用/ 127吗?

    不建议在路由器之间使用/ 127,并且绝对不要使用/ 127-全路由器的Anycast地址是子网的全零地址;这意味着/ 127在技术上仅在两台机器之间有效,其中一台机器充当路由器。/ 126当然可以。

    但是,无论如何,除非您的设备容易受到邻居发现缓存泛洪攻击,否则我不建议您切换现有的/ 64链接-即使在这种情况下,也要先确定您是否真的要使用/ 64进行互联网连接,如果答案是否定的,只需对其进行防火墙处理。

  3. 为什么要为虚拟机配置小于/ 64的子网?

    这会破坏SLAAC和RA,除非您真的非常了解自己在做什么,否则您不太可能有充分的理由这样做-也许您的上游只给了您一个/ 64,但是如果是这样,您就需要返回给他们并要求更多,如果他们想向您收取费用,请开始寻找新的提供商,还可能向他们发送一些链接到相关RFC的肮脏电子邮件。

  4. 在其他情况下,我会使用小于/ 64的子网吗?

    老实说 可能不是。如果出于合理的原因,出于防止NDP攻击之外的目的,最好使用较小的子网,则将在本节中进行编辑。

    相反,在某些情况下,您希望使用小于/ 64的子网-特别是在您使用硬件转发设备运行环境的任何地方(请考虑使用名牌路由器和L3交换机)-有些情况将无法进行前缀的硬件路由比/ 64更长的时间,其他人必须将操作分成多个比较,因此,您至少应尽力确保/ 64是(OSPF / ISIS / EIGRP / etc)主干网中的最长前缀。

  5. 我可以直接从IPv4子网映射到IPv6子网吗?例如,IPv4 / 24是否直接对应于IPv6 / 56或/ 120?

    正式地,:: ffff:xxxx是IPv6映射的IPv4地址的格式-当然,还有许多转换机制,即6to4及其相对的6rd,它们将IPv4地址映射到全局IPv6中。通过创建从其继承的IPv4地址派生的IPv6前缀来提供对IPv4的IPv6访问。

  6. 我的接口有几个IPv6地址。所有子网的子网都必须相同吗?

    不,在同一接口上使用不同的地址和子网大小应该不是问题。如果是这样,则说明实现存在错误。当然,更好的问题是您为什么要这样做?

  7. 为什么有时在IPv6地址中看到%而不是/,这是什么意思?

    这是一个分隔符,通常应用于链接本地地址(fe80 :: / 12)-由于同一链接本地地址可以合法存在于多个接口上,因此%分隔符用于允许指定要使用的接口。在执行涉及本地链接的操作时,Linux通常会强制指定接口。Windows Vista / 2008及更高版本更加智能,除非链接本地不是唯一的,否则不会抱怨。

  8. 我在浪费太多子网吗?我们不只是要再次耗尽吗?

    否。这是一匹死马,它被WAAAAAAAAAY浪费了太多次-当前的全球IPv6互联网是2000 :: / 3-如果某种程度上,如果地球上的每个RIR都耗尽了IANA,则IANA可以开始使用更多前缀地址股票。因此,不会,我们将不会用完空间,即使这样做,也需要轻按一下笔才能出现新的前缀,而不是技术上的改变。这个问题真正强调的唯一一件事是人的大脑无法完全理解地址空间有多么荒谬。

  9. IPv6子网与IPv4子网在其他哪些主要方面不同?

    除了不在乎正在使用多少空间外,请记住没有广播地址,并且“子网零”地址现在是所有路由器的任意播地址(基本上是隐含在配置的所有节点上的地址)以转发IPv6数据包)-这有一个非常有用的副作用,允许您将全零地址用作网络中的默认路由(不,它不会导致数据包重复,它是ANYcast,而不是MULTIcast)-请切记尽管主机可能每隔几秒钟便会在路由器之间翻转一次,所以如果连接跟踪未在它们之间进行同步,则这不适用于有状态防火墙设置。

    除此之外,另一个主要区别是IPv6关心重复地址和死邻居(NUD)-因此,与IPv4不同,主机可以确定链接上的另一个节点已经在使用该地址,因此它将拒绝使用该地址。 。另一方面,如果您要配置静态路由,则NUD很有用-您实际上可以为具有不同度量的前缀定义多个单独的路由,并且它们实际上可以工作,这与IPv4不同,在IPv4中,将使用最低的度量路由,而不考虑下一条-hop死了还是活着(尽管对于某些使用ARP验证路由的IPv4实施(例如Cisco和其他主要路由器供应商)可能并非如此)

    TLDR;IPv6检测到重复的地址和不可达的邻居。全零地址是所有路由器的任播地址,没有广播这样的东西,全一是常规地址。



3

对于那些想知道规范中SLAAC的/ 64要求来自何处的人,这里有一些额外的参考资料:

IPv6无状态地址自动配置(RFC 4862)

如果前缀长度和接口标识符长度的总和不等于128位,则必须忽略“前缀信息”选项。[...]

系统管理员有责任确保路由器广告中包含的前缀长度与该链接类型的接口标识符的长度一致。

IP版本6寻址架构(RFC 4291)中

对于所有单播地址(以二进制值000开头的地址除外),接口ID的长度必须为64位,并以Modified EUI-64格式构造。

因此,因为接口ID必须为64位长,并且前缀长度和接口ID长度之和必须为128,所以使用SLAAC时前缀的唯一可能长度是64位。


2

IPv6是128位,那么/ 64为什么是主机推荐的最小子网?

因为IPv6支持者喜欢无状态自动配置的想法。

如果您选择任何其他子网大小,则无状态自动配置将中断。其他一些小问题也可能会中断,请阅读rfc7421以获取更多详细信息。

我个人认为无状态自动配置无论如何都是愚蠢的想法。它导致地址不可读,除了将块分配给子网之外,您几乎没有对地址的控制。

当然,使用约定的事情是,如果您遵循这些约定而出现问题,则可以指出该约定;如果您拒绝遵循这些约定而出现错误,那将是您的错。

为什么建议将/ 127用于路由器之间的点对点链接,

使用具有少量可用地址的子网可以避免邻居发现耗尽攻击。

当然,这种推理不仅适用于点对点链接。我猜想从政治上来说可能对点对点路由器链接提出此建议,但在政治上不可能对其他链接做出建议。

为什么要为虚拟机配置少于/ 64的地址?

我们需要在这里做出区分。主机提供商可以通过两种方式为计算机分配地址(物理的或虚拟的)。

他们可以为它们分配“链接”地址,以便机器可以在其中答复邻居发现请求。一些托管服务提供商选择给每台计算机提供一个/ 64,这在地址移动性方面具有优势,另一些托管服务提供商选择为每个VLAN提供一个/ 64,然后给各个机器的子块分配使用更少地址的子块,这可能意味着本地流量保持本地状态,而不是传递到路由器。

或者他们可以将机器视为路由器,并为其分配路由块。在这种情况下,它将需要足够的地址来寻址其所有内部子网。如果遵循“所有子网必须为/ 64”的约定,则意味着至少为其分配一个/ 64,并且可能分配更多。对于具有“机器内部网络”的机器,例如容器主机,这是有意义的。

我可以直接从IPv4子网映射到IPv6子网吗?例如,IPv4 / 24是否直接对应于IPv6 / 56或/ 120?

任何此类映射都取决于本地策略。

我的接口有几个IPv6地址。所有子网的子网都必须相同吗?

没有

为什么有时在IPv6地址中看到%而不是/,这是什么意思?

%是接口标识符。它与链接本地地址一起使用。因为一台机器可能具有多个接口,并且连接到这些接口的网络可能具有重叠的链接本地地址,所以需要它。

我在浪费太多子网吗?我们不只是要再次耗尽吗?

我不会为此担心太多。

即使IPv6设计人员做出了一个奇怪的决定,即使用128位地址空间然后将其丢弃近一半用于无状态自动配置,IPv6仍比IPv4拥有更大的空间。

而且,如果出现紧缩,只需花费几笔就可以恢复这个奇怪的决定。

IPv6可伸缩性的一个更大的问题是路由表的大小。强烈建议不要使用IPv6 NAT。在提供商分配的地址上运行大型网络会导致提供商锁定的巨大风险。

因此,我相信,随着IPv6对公司网络的渗透率不断提高,我们将看到对与提供商无关的IPv6空间的需求激增。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.