题 IPv6子网如何工作以及它与IPv4子网有何不同?


这是一个 典型问题 关于IPv6子网。

有关:

我知道很多 IPv4子网当我准备(部署)IPv6网络时,我需要知道这些知识有多少可以转移,我还需要学习什么。 IPv6乍一看似乎比IPv4复杂得多。所以我想知道:

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

110
2017-09-11 00:57






答案:


关于IPv6子网划分应该提到的第一件事是不同的 思维方式 被要求。在IPv4中,您通常会考虑多少 地址 您可以使用以及如何为每个最终用户分配足够的内容。在IPv6中你通常会考虑多少(/ 64) 子网 您可以使用以及如何将它们分配给最终用户。您几乎从不担心在给定子网中将使用多少IP地址。除了像点对点链接这样的特殊情况之外,每个子网只是拥有比可能需要的更多可用地址,所以你只需要担心分配子网,而不是分配子网内的主机。

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

为什么建议使用/ 127作为点对点链接

对于点对点链路的特定情况,建议使用/ 127而不是/ 64,以避免数据包发送到子网上任意一个四分之一未使用地址的漏洞导致不需要的邻居请求和表条目可能会淹没路由器。这种错误的数据包可能是恶意的或偶然的。但即使你实际上将点对点链接配置为/ 127,有些人仍主张分配整数/ 64只是为了保持一致。

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

我不清楚为什么会为虚拟机配置小于/ 64的子网。也许是因为托管服务提供商认为服务器就像最终用户并且只需要一个(/ 64)子网,而不是预期服务器实际上是需要内部路由拓扑的虚拟机集合?它也可以简单地完成,使得寻址计划更容易记忆:主机得到 PREFIX::/64,然后每个VM得到 PREFIX:0:NNNN::/96 其中NNNN对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:每个ISP客户端站点应接收的65536个基本子网块和建议的块大小。
  • / 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地址。所有子网的子网必须相同吗?

绝对不!通过同时拥有来自不同子网的多个IP地址,就像IPv4一样,预计IPv6主机可以是多宿主。如果它们是使用SLAAC自动配置的,那么不同的子网可能来自不同路由器的路由器通告。

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

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

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

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

我浪费了太多的子网吗?我们不是要再跑出去吗?

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

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

但仍然是:我们正在自动向任何请求一个的ISP发放一个/ 32,我们正在向每个ISP客户分发一个/ 48。也许我们夸大其词,毕竟我们会浪费IPv6。但是有一个规定:到目前为止,只有八分之一的IPv6空间可供使用: 2000::/3。我们的想法是,如果我们在第一个八分之一发生可怕的混乱,我们必须彻底修改自由分配政策,我们在遇到麻烦之前再尝试7次。

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


130
2017-09-11 02:55



很好的解释!特别是关于不同的心态。如果你看一下这些数字,你会发现在2000年的情况下有536,870,912 / 32(小型互联网服务提供商):: / 3。世界人口70亿,每13人一个ISP,每个这样的ISP可以拥有65,536个客户,每个拥有48个。不用担心浪费地址了:-) - Sander Steffann
雅,这是一个非常好的解释。 - Fergus
关于2000 :: / 3的具体细节的良好解释。 - Koos van den Hout
很好的解释。最终评论+1。我希望每个人都已经看到了这个: xkcd.com/865 - Nico
@SanderSteffann如果它成为一个问题,那么ISP将新的/ 64分配给住宅用户而不是/ 48s是非常合理的,并且小型ISP一次请求4096个这样的块(/ 52块) )。目前的方案旨在为每一层留出扩展空间。 - immibis


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。

好的,关于解释:

根据 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位(而不仅仅是专用于MAC地址的48位)可以提供一些摆动空间,而不仅仅是这个方案提供的地址(还有其他几个)。

是否还有其他情况我会使用小于/ 64的子网?

不。除非你被打破,否则不会。那么,您可能有一个基于当地要求的理由来设置现有网络的手动路由。但请记住,通过这样做,你可能会弄得一团糟:

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

使用除/ 64之外的子网前缀长度将会破坏许多      IPv6的功能,包括邻居发现(ND),安全邻居      发现(SEND)[RFC3971],隐私扩展[RFC4941],部分内容      移动IPv6 [RFC4866],协议无关组播 - 稀疏模式      (PIM-SM)与Embedded-RP [RFC3956]和站点多宿主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地址,这可以简化应用程序开发。就网络而言,它不会产生任何差别。


42
2018-01-10 06:51





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

    此前缀大小最初是在较旧的RFC中推荐的 - 此后一直是对此策略的修订,其中考虑了邻居发现攻击的问题,并且使用/ 126是有效的缓解 - 尽管如此,如果您正在设置PtP链接路由流量的唯一目的,另一种选择就是坚持使用/ 64和防火墙那个子网。更好的是,为自己分配一个池,从中绘制/ 64个子网,并将整个池作为黑名单目的地(在其他任何可能来自敌意的地方)

  2. 为什么建议使用/ 127作为路由器之间的点对点链接,为什么过去推荐使用它?我应该更改现有路由器链接以使用/ 127吗?

    不推荐在路由器之间使用/ 127,从来没有 - 所有路由器的任播地址都是子网的全零地址;这意味着/ 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可以开始使用多个前缀。所以不,我们不会耗尽空间,即使我们这样做,也需要轻轻一笔才能打开新的前缀,而不是技术上的变化。这个问题唯一真正强调的是人类思维无法完全理解地址空间是多么荒谬。

  9. IPv6子网划分的其他主要方式与IPv4子网不同?

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

    除此之外,另一个主要区别是IPv6关心重复地址和死邻居(NUD) - 因此,与IPv4不同,如果主机可以确定链路上的另一个节点已经在使用地址,它将拒绝使用地址。另一方面,如果您正在配置静态路由,则NUD非常有用 - 您实际上可以定义多个单独的路由到具有不同指标的前缀,它们实际上可以工作,这与IPv4中的情况不同,后者将使用最低指标路由,无论下一个是否-hop是死的还是活的(尽管对于一些使用ARP来验证思科和其他主要路由器供应商等路由的IPv4实现可能并非如此)

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


18
2018-03-10 17:27



回答2)... tools.ietf.org/html/rfc6164  tools.ietf.org/html/rfc6547 - cpt_fink


对于那些想知道SLAAC的/ 64要求来自哪里的人来说,这里有一些额外的参考:

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

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

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

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

对于所有单播地址,除了以二进制开头的地址   值000,接口ID需要64位长   以改进的EUI-64格式构建。

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


2
2018-01-06 00:45





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

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

如果您使用任何其他子网大小,则无状态自动配置将中断。其他一些小事也可能会破坏,请阅读rfc7421了解更多细节。

我个人认为无状态自动配置无论如何都是一个愚蠢的想法。它会导致无法读取地址,并且除了将块分配给子网之外,基本上无法控制寻址。

当然,约定的事情是,如果你遵循它们并且出现问题你可以指出约定,如果你拒绝遵循它们并且出现问题,那将是你的错。

为什么建议在路由器之间使用/ 127作为点对点链路,

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

当然,这种推理不仅适用于点对点链接。我想在政治上有可能对点对点路由器链接进行这种推荐,但在政治上不可能将其用于其他链接。

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

我们需要在这里做出区分。托管服务提供商可以通过两种方式为计算机分配地址(无论是物理还是虚拟)。

他们可以为它们分配“on-link”地址,其中机器应该回复邻居发现请求。一些托管服务提供商选择为每台机器提供a / 64,这在地址移动性方面具有优势,其他的则为每个VLAN提供a / 64,然后为单个机器提供使用较少地址的机器子块,这可能意味着本地流量保持在本地而不是传递给路由器。

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

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

任何此类映射都是本地策略的问题。

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

没有

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

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

我浪费了太多的子网吗?我们不是要再跑出去吗?

我不会太担心它。

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

如果有一个紧缩,只需一笔笔就可以恢复那个奇怪的决定。

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

因此,我相信随着IPv6对公司网络的渗透不断增加,我们将看到对独立于提供商的IPv6空间的请求激增。


2
2018-01-06 03:25