IPv6子网划分如何工作,它与IPv4子网划分有什么不同?

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

有关:

  • IPv4子网划分如何工作?

我对IPv4子网划分了解很多,在准备(部署)IPv6networking时,我需要知道这些知识有多less是可转移的,我还需要学习什么。 IPv6似乎乍一看比IPv4复杂得多。 所以我想知道:

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

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

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

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

    对于点对点链接的特定情况,推荐使用/ 127而不是/ 64,以避免数据包寻址到子网上任何一个未使用地址的四分之一引起不需要的邻居请求和表项的漏洞可能淹死路由器。 这种错误的数据包可能是恶意的或偶然的。 但即使实际上将点对点链接configuration为/ 127,也有人主张为了保持一致而分配整个/ 64。

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

    我不知道为什么虚拟机要configuration小于/ 64的子网。 也许是因为托pipe服务提供商认为服务器就像最终用户一样,只需要一个(/ 64)子网,而不是预料服务器实际上是需要内部路由拓扑的虚拟机的集合? 这也可以简单地作为使寻址计划更容易记住的问题:主机获得PREFIX::/64 ,然后每个VM获得PREFIX:0:NNNN::/96 ,其中NNNN对于VM和VM是唯一的可以根据需要分配PREFIX:0:NNNN:XXXX:YYYY

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

    从寻址和路由工作的低层angular度来看,前缀长度在IPv6和IPv4中具有相同的含义。 在这个层面上,你可以做一个类比,比如“一个IPv4 / 16使用半个位作为networking地址,一半作为主机地址,这就像IPv6中的一个/ 64”。 但是这个比较并不太合适。 在IPv6中出现了强有力的约定,使得networking规模的划分看起来更像是IPv4中有类networking的旧世界。 可以肯定的是,IPv6并没有重新引入有select的寻址,其中最重要的几位地址强制一个特定的networking掩码,但是IPv6 确实具有一定的(事实上/常规的)标准networking大小:

    • / 64 :单个子网的基本大小:局域网,广域网,networking虚拟主机的地址块等…“普通”子网永远不会比/ 64更小(长的前缀)。 由于/ 64的主机地址的价值比我们所能想象的要多,所以没有子网预期会比/ 64更大(更短的前缀)。
    • / 56 :一个由256个基本子网组成的块。 尽pipe目前的政策允许互联网服务提供商向每个最终用户发布大小为/ 48的数据块,并且仍然认为他们的地址使用是合理的,但是一些ISP可能(并且已经这么做)select为消费者级客户分配一个/ 56作为折衷为他们分配许多子网和地址经济。
    • / 48 :65536个基本子网块和每个ISP客户端站点应该接收的块的推荐大小。
    • / 32 :大多数ISP在每次从区域地址注册处请求更多地址时将接收的块的默认大小。

    在服务提供商和企业networking内部,可以看到比这四个更多的前缀长度。 当查看这些networking中路由器的路由表时,IPv4和IPv6有很多共同点,包括大部分路由工作方式:较长前缀的路由覆盖覆盖较短前缀的路由,所以可以聚合(缩短)和钻取(使更长的路线)。 就像在IPv4中一样,可以将路由汇总或汇总到更短的前缀较大的块,以最大限度地减小路由表的大小。

    在IPv4和IPv6之间映射的另一个问题是如何协调双栈机器上的IPv4和IPv6分配,以便可以很容易地理解寻址计划。 远非如此,这样做通常有一些惯例:将IPv4的“子网号码”embeddedIPv6前缀的一部分,或者用BCD (例如10.0.234.0/24变为2001:db8:abcd:234::/64 )或二进制( 10.0.234.0/24变为2001:db8:abcd:ea::/64 )。

    我的接口有几个IPv6地址。 这些子网必须一致吗?

    绝对不! 与IPv4一样,IPv6主机预计能够同时拥有来自不同子网的多个IP地址。 如果它们使用SLAAC自动configuration,则不同的子网可能来自不同路由器的路由器通告。

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

    你不会看到另一个。 他们有不同的含义。 斜杠表示前缀(子网),表示一个地址块,它们都以相同的n位开始。 没有斜杠的地址是主机地址。 你可能会想到这样一个地址在最后有一个隐含的“/ 128”,意思是指定了所有的128位。

    百分号附有链接本地地址。 在IPv6中,除了可能具有的任何其他IP地址之外,每个接口都具有链路本地地址。 但是,事实是,链接本地地址总是,无一例外地,在fe80::/10块。 但是,如果我们尝试使用链路本地地址与本地主机进行通信,并且本地主机有多个接口,那么我们如何知道使用哪个接口与此同级进行通信? 通常情况下,路由表告诉我们哪个接口用于特定的前缀,但是在这里它会告诉我们,通过每个接口都可以访问fe80::/10

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

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

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

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

    但仍然:我们正在自动发送一个/ 32给任何请求ISP的ISP,我们向每一个ISP客户发送一个/ 48。 也许我们在夸大,毕竟我们会浪费IPv6。 但有一个规定:到目前为止,只有八分之一的IPv6空间可用: 2000::/3 。 这个想法是,如果我们把第一个八分之一弄得乱七八糟,我们必须彻底修改自由分配政策,那么在我们陷入困境之前,我们还要再试七次。

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

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

    首先,从RFC创build一些ASCII艺术来build立术语:

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

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

    OK,就解释说:

    根据RFC 4291 – IP版本6寻址体系结构 :

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

    和RFC 5375 – IPv6单播地址分配注意事项 :

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

    所以忽略000-前缀exception,接口ID 总是 64位。 这是所有本地广播networking总是64位的另一种方式。 如果你有一个IPv6地址,它的networking掩码总是 64位。 没有更多,永远不会less。 如果您分配的地址空间大于此值(比64位更短的networking掩码),则假定您将将该地址空间划分为64位networking并自行处理路由。 如果你给了一个比这个更小的networking(更长的networking掩码),那么有人搞砸了。

    那么,为什么64位呢?

    通常,IPv6地址是自动configuration的,而不是分配的。 路由器将通告哪个networking前缀可用(路由前缀+子网ID:第一个64位),并且您的计算机将使用其自己的唯一标识符填写最后的64位。 你的电脑如何拿出一个唯一的标识符? 有几种可能性,最常见的是使用你的接口的MAC地址。 将MAC分成两半(供应商半/串行一半),翻转供应商一侧的通用本地位,并将其与中间的FF:FE连接在一起。 所以00:30:48:01:23:45变成0230:48ff:fe01:2345 现在把广告的64位networking前缀放在那个左边,并且你有你的IP地址。

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

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

    不。 除非你坏了 那么,根据当地的要求,你可能有一个合理的理由来设置你现有的networking手动路由。 但要记住,这样做可能会让你一团糟:

    从RFC 5375 – IPv6单播地址分配注意事项 :

    使用除64以外的子网前缀长度将会破坏IPv6的许多特性,包括邻居发现(ND),安全邻居发现(SEND)[RFC3971],隐私扩展[RFC4941],移动IPv6的部分[RFC4866]采用Embedded-RP的多播 – 稀疏模式(PIM-SM)[RFC3956],以及IPv6中介站点多宿主(SHIM6)[SHIM6]等等。 目前正在开发或正在提出的一些其他function也依赖于/ 64子网前缀。

    ….

    但是,有些networkingpipe理员已经使用长度超过/ 64的前缀来连接路由器,通常是点对点链路上的两台路由器。 在通过手动configuration分配所有地址的链路上,链路上的所有节点都是networking已知的路由器(不是terminal主机),pipe理员不需要任何依赖/ 64子网前缀的IPv6function,可以工作。 使用超过/ 64的子网前缀不推荐用于一般用途,并且将它们用于包含terminal主机的链路将是一个特别糟糕的主意,因为很难预测主机未来将使用哪些IPv6function。

    为什么build议使用/ 127作为路由器之间的点对点链路,为什么过去build议不要?

    您可能想要照顾RFC 3627 – 在路由器之间使用/ 127前缀长度被认为是有害的 。 然后查看后续RFC 6164 – 在路由器间链路上使用127位IPv6前缀 。

    反对在路由器上使用长度超过/ 64的前缀与路由器自动configuration有关,在极less数情况下可能失败。 反对使用短于/ 127的前缀(仅限2主机)与许多与发送到未路由地址的数据包相关的可能的拒绝服务问题有关。 由于现实世界中的拒绝服务问题比理论上的自动configuration故障更糟糕,因此/ 127是新宠。

    我应该改变现有的路由器链接使用/ 127?

    如果你控制一个IPv6路由器,我build议你阅读两个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地址,因此传统上使用点分十进制forms写出。

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

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

      这个前缀大小最初是在一个较老的RFC中推荐的 – 此后一直对这个策略进行修改,其中考虑了邻居发现攻击的问题,并且使用了/ 126是一种有效的缓解措施 – 但是,如果您正在设置PtP链接路由stream量的唯一目的,另一种select是简单地坚持一个/ 64和子网的防火墙。 更好的是,为自己分配一个池,从中你将画出64个子网,并将整个池作为列入黑名单的目的地(以及任何可能来自敌意的地方)

    2. 为什么build议使用/ 127作为路由器之间的点对点链路,为什么过去build议不要? 我应该改变现有的路由器链接使用/ 127?

      / 127不build议在路由器之间,而且从不是 – 全路由器任播地址是子网的全零地址; 这意味着/ 127在技术上只在两台机器之间有效,其中一台机器作为路由器。 / 126当然是好的。

      然而,在任何情况下,我都不build议切换现有的/ 64链接,除非你的设备容易受到邻居发现caching洪水攻击 – 即使在这种情况下,首先要确定是否要使用/ 64连接来连接互联网如果答案是否定的,只是防火墙而已。

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

      这打破了SLAAC和RA,除非你真的知道自己在做什么,否则你不太可能有这样的理由 – 也许你的上游只给了你一个/ 64,但是如果是这样的话,你需要去回到他们身上,要求更多,如果他们想要为此收费,就要开始寻找新的提供商,并且可能会向他们发送一些与相关的RFC相关的晦涩的电子邮件。

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

      说实话? 可能不会。 如果我想出一个合理的理由,那么为了防止NDP攻击,最好使用较小的子网,我将编辑本节。

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

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

      正式的,:: ffff:xxxx是IPv6映射的IPv4地址的格式 – 当然也有一些转换机制,即6to4及其相对的第6个,它将IPv4地址映射到全局的IPv6地址用于这个目的通过创build一个IPv6前缀来提供通过IPv4的IPv6访问。

    6. 我的接口有几个IPv6地址。 这些子网必须一致吗?

      不,在同一接口上使用不同的地址和子网大小不应该成为问题。 如果是这样,那么实施就是越野车。 当然,更好的问题是为什么你会这样做?

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

      这是一个分隔符,通常应用于链路本地地址(fe80 :: / 12) – 因为同一链路本地地址可以合法地存在于多个接口上,所以使用%分隔符来允许指定具体的接口。 Linux通常在执行涉及本地链接的操作时指定该接口为必需的。 Windows Vista / 2008及更高版本更聪明一点,除非本地链接是非唯一的,否则不会抱怨。

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

      不,这是一个被WAAAAAAAAAY攻击过多的死马 – 目前的全球IPv6互联网是2000 :: / 3 – 如果不知何故,这个星球上的每个RIR都设法耗尽他们的前缀,那么IANA可以开始使用更多的前缀地址股票。 所以,不,我们不会耗尽空间,即使我们这样做,也需要用笔轻轻一点,以形成新的前缀,而不是技术上的变化。 这个问题唯一真正强调的是,人类的心灵无法充分理解地址空间是多么的荒谬可笑。

    9. IPv6子网划分与IPv4子网划分有什么不同?

      除了不关心你使用了多less空间以外,请记住没有广播地址,而且“子网零”地址现在是全路由器任播地址(这基本上是一个地址,它隐式存在于所有configuration的节点上以转发IPv6数据包) – 这有一个有用的副作用,允许您使用所有的零地址作为您的默认路由在networking中(不,它不会导致数据包重复,它是ANYcast,而不是MULTIcast) – 牢记尽pipe主机可能每隔几秒在路由器之间翻转,所以如果连接跟踪没有在它们之间同步,那么这对于有状态的防火墙设置是不合适的。

      除此之外,另一个主要区别在于IPv6关心重复地址和死亡邻居(NUD) – 因此,与IPv4不同的是,如果主机可以确定链路上的另一个节点已经在使用它,它将拒绝使用地址。 另一方面,如果您正在configuration静态路由,则NUD非常有用 – 您可以实际定义多个不同度量的单独路由前缀,并且实际上它们可以正常工作,这与IPv4中使用最低度量标准路由而不pipe下一个-hop是死的还是活的(尽pipe对于一些使用ARP来validation思科和其他主要路由器供应商的路由的IPv4实现,这可能并不是这样)

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

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

    从IPv6无状态地址自动configuration(RFC 4862) :

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

    系统pipe理员有责任确保“路由器通告”中包含的前缀长度与该链接types的接口标识符的长度一致。

    从IP版本6寻址体系结构(RFC 4291) :

    对于所有单播地址,除了那些以二进制值000开头的地址外,接口ID必须是64位长,并且要以修改后的EUI-64格式构build。

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

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

    因为IPv6支持者喜欢无状态自动configuration的思想。

    如果你去任何其他的子网大小,那么无状态的自动configuration将会中断。 其他一些小的事情也可能会打破,阅读rfc7421了解更多细节。

    我个人认为无国籍的自动configuration无论如何是愚蠢的想法。 这会导致地址不可读,并且除了将块分配给子网之外,基本上不会控制寻址。

    当然,有约定的事情是,如果你跟着他们,事情出错,你可以指出的惯例,如果你拒绝跟随他们,事情出错,这将是你的错。

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

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

    当然,这个推理不仅适用于点到点链接。 我猜想在点对点路由器链路上做这个build议是政治上可行的,但是在政治上不可能为其他链路做好准备。

    为什么虚拟机configuration的地址less于64个?

    我们需要在这里做一个区分。 主机提供商可以通过两种方式将地址分配给计算机(无论是物理的还是虚拟的)。

    他们可以在机器预期回复邻居发现请求的时候为他们分配“在线”地址。 一些托pipe服务提供商select为每台机器提供一个地址移动优势的机器,其他机器提供每个VLAN的一个64位,然后给每个机器的子地址使用较less的地址,可能意味着本地stream量保持在本地而不是传递给路由器。

    或者他们可以将机器当作路由器,并为其分配路由块。 在这种情况下,它将需要足够的地址来处理所有的内部子网。 如果你按照“所有子网必须是/ 64”的惯例,这意味着至less分配一个/ 64和可能更多。 这对于在机器内部具有“networking”的机器是合理的,例如容器主机。

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

    任何这样的映射都是地方政策的问题。

    我的接口有几个IPv6地址。 这些子网必须一致吗?

    没有

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

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

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

    我不会担心太多。

    即使IPv6devise者使用128位地址空间的奇怪决定,然后在无状态自动configuration上丢掉近一半的IPv6,IPv6仍然具有比IPv4更大的空间。

    如果出现紧缩情况,只需要用笔来恢复那个奇怪的决定。

    对IPv6可扩展性的更大关注是路由表大小。 强烈build议不要使用IPv6 NAT。 在提供者分配的地址上运行大型networking会导致提供者locking的重大风险。

    所以我相信,随着IPv6在企业networking中的渗透率的提高,我们将看到对独立于提供商的IPv6空间的需求激增。