这是一个关于 IPv6 子网划分的规范问题。
有关的:
我对IPv4 子网划分了解很多,当我准备(部署|工作)一个 IPv6 网络时,我需要知道这些知识中有多少是可转移的,以及我还需要学习什么。乍一看,IPv6 似乎比 IPv4 复杂得多。所以我想知道:
- IPv6 是 128 位,那么为什么 /64 是主机推荐的最小子网?与此相关:
- 为什么建议对路由器之间的点对点链接使用 /127,为什么过去不建议这样做?我应该更改现有路由器链接以使用 /127 吗?
- 为什么要为虚拟机提供少于 /64 的地址?
- 在其他情况下我会使用小于 /64 的子网吗?
- 我可以直接从 IPv4 子网映射到 IPv6 子网吗?例如,IPv4 /24 是否直接对应于 IPv6 /56 或 /120?
- 我的接口有多个 IPv6 地址。所有子网都必须相同吗?
- 为什么我有时会在 IPv6 地址中看到 % 而不是 /,这是什么意思?
- 我是否浪费了太多子网?我们不是又要跑出去了吗?
- IPv6 子网划分与 IPv4 子网划分在哪些其他主要方面不同?
关于 IPv6 子网划分,首先应该提到的是需要一种不同的思维模式。在 IPv4 中,您通常会考虑有多少地址可用,以及如何将足够多的地址分配给每个最终用户。
/64
在 IPv6 中,您通常会考虑有多少子网可用以及如何将它们分配给最终用户。您几乎从不担心给定子网中将使用多少个 IP 地址。除了点对点链接等特殊情况外,每个子网的可用地址都远远多于它所需要的地址,因此您只需担心分配子网,而不是其中的主机。IPv6 子网通常是
/64
因为这是SLAAC(无状态地址自动配置)工作所必需的。即使没有使用 SLAAC,也可能有其他原因需要使用/64
. 例如,可能有一些最终用户设备只是假设/64
,或者路由子网比/64
在某些路由器上可能效率低下更窄,因为路由器实施者已经优化了/64
或更宽路由的情况以节省路由表内存。为什么建议
/127
用于点对点链接?对于点对点链接的特定情况,
/127
建议而不是/64
为了避免一个漏洞,即发送到子网上数万亿个未使用地址中的任何一个的数据包会导致不需要的邻居请求请求和可能淹没路由器的表条目. 这种寻址错误的数据包可能是恶意的或意外的。但是,即使您实际上将点对点链接配置为/127
,有些人还是提倡分配一个整体/64
只是为了保持一致。为什么要为虚拟机提供比 更窄的子网
/64
?我不知道为什么要为虚拟机配置比
/64
. 也许是因为托管提供商假设服务器就像最终用户并且只需要一个/64
子网,没有预料到服务器实际上是需要内部路由拓扑的 VM 集合?它也可以简单地作为使寻址计划更容易记住的问题来完成:主机获取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
使用一半的位作为网络地址,一半的位作为主机地址,就像/64
IPv6 中的一样”。但这种比较并不恰当。IPv6 中出现了严格的约定,这使得网络大小的划分看起来更像是 IPv4 中有类网络的旧世界。可以肯定的是,IPv6 没有重新引入有类寻址,其中地址的最高有效位强制使用特定的网络掩码,但 IPv6确实具有某些 [事实上/常规] 标准网络大小:/64
:单个子网的基本大小:LAN、WAN、Web 虚拟主机的地址块等...“正常”子网永远不会比 . 更窄(前缀更长)/64
。/64
由于 a/64
的主机地址价值远远超过我们想象的需要,因此预计没有子网会比它更宽(更短的前缀) 。/56
:256
基本子网块。尽管当前的政策允许 ISP 向/48
每个最终用户分发尽可能大的块,并且仍然认为他们的地址利用率是合理的,但一些 ISP 可能(并且已经)选择将 a 分配/56
给消费级客户,作为分配大量数据之间的折衷。他们的子网和地址经济。/48
:65536
基本子网块和每个 ISP 客户端站点应接收的建议块大小。/32
:大多数 ISP 每次从区域地址注册处请求更多地址时都会收到的默认块大小。在服务提供商和企业网络内部,可以看到比这 4 个更多的前缀长度。当查看这些网络中路由器的路由表时,IPv4 和 IPv6 有很多共同点,包括大部分路由工作方式:较长前缀的路由覆盖较短前缀的覆盖路由,因此可以聚合(缩短)和钻取向下(延长)路线。与 IPv4 一样,可以将路由聚合或汇总为具有较短前缀的较大块,以最小化路由表的大小。
IPv4 和 IPv6 之间映射的另一个问题是如何协调双栈计算机上的 IPv4 和 IPv6 分配,以便可以轻松理解寻址计划。到目前为止,肯定有一些常用的约定来执行此操作:将 IPv4“子网号”嵌入到 IPv6 前缀的一部分中,可以使用BCD(例如
10.0.234.0/24
becomes2001:db8:abcd:234::/64
)或二进制(10.0.234.0/24
becomes2001:db8:abcd:ea::/64
)。我的接口有多个 IPv6 地址。所有子网都必须相同吗?
绝对不!IPv6 主机有望通过同时拥有多个来自不同子网的 IP 地址来实现多宿主,就像 IPv4 一样。如果它们使用 SLAAC 自动配置,那么不同的子网可能来自不同路由器的路由器通告。
为什么我有时会在 IPv6 地址中看到 % 而不是 /,这是什么意思?
你不会看到一个而不是另一个。它们有不同的含义。斜线表示一个前缀(子网),意思是所有以相同
n
位开头的地址块。没有斜杠的地址是主机地址。您可能会认为这样的地址/128
在末尾有隐含的含义,这意味着所有 128 位都已指定。百分号伴随着链接本地地址。在 IPv6 中,除了它可能拥有的任何其他 IP 地址之外,每个接口都有一个链路本地地址。但问题是,链接本地地址始终无一例外地位于
fe80::/10
块中。但是,如果我们尝试使用链接本地地址与对等点通信,而本地主机有多个接口,我们如何知道使用哪个接口与该对等点通信?通常路由表会告诉我们特定前缀使用哪个接口,但在这里它会告诉我们fe80::/10
通过每个接口可达的比。答案是我们必须使用语法告诉它使用哪个接口
address%interface
。例如,fe80::1234:5678:8765:4321%eth0
。我是否浪费了太多子网?我们不是又要跑出去了吗?
没人知道。谁能预知未来?
但是请考虑一下。在 IPv6 中,可用子网数是IPv4中可用单个地址数的平方。这真的很多。不,我的意思是真的很多!
但仍然:我们会自动
/32
向任何请求一个的 ISP 分发一个,我们会/48
向每个 ISP 客户分发一个。也许我们在夸大其词,毕竟我们会浪费掉 IPv6。但是对此有规定:到目前为止,只有八分之一的 IPv6 空间可供使用:2000::/3
。这个想法是,如果我们把前八分之一搞得一团糟,我们必须彻底修改自由分配政策,我们在遇到麻烦之前可以再尝试 7 次。最后:IPv6 不必永远存在。也许它的生命周期会比 IPv4 更长(已经是令人印象深刻的生命周期了,而且还没有结束),但就像所有技术一样,它总有一天会变得无足轻重。我们只需要做到这一点。
IPv6 是 128 位,那么为什么 /64 是主机推荐的最小子网?
首先,使用 RFC 中的一点 ASCII 艺术来建立术语:
全局路由前缀通常标识地址所属的整个网络。它通常是 48 位。接口 ID 标识给定的网络接口。它通常是 64 位的。剩下的 16 位是您的子网 ID。
好的,继续解释:
根据RFC 4291 - IP 版本 6 寻址架构:
和RFC 5375 - IPv6 单播地址分配注意事项:
因此忽略 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 单播地址分配注意事项:
为什么建议对路由器之间的点对点链接使用 /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 地址,这可以简化应用程序开发。就网络而言,它没有一点区别。
IPv6 是 128 位,那么为什么 /64 是主机推荐的最小子网?
此前缀大小最初是在较旧的 RFC 中推荐的 - 此后对该策略进行了修订,其中考虑了邻居发现攻击的问题并且使用 /126 是一种有效的缓解措施 - 尽管如此,如果您正在设置 PtP 链接路由流量的唯一目的,另一种选择是简单地坚持使用 /64 和防火墙该子网。更好的是,为自己分配一个池,您将从中提取 /64 子网,并将整个池作为您边缘的黑名单目的地(以及任何其他可能来自敌意的地方)
为什么建议对路由器之间的点对点链接使用 /127,为什么过去不建议这样做?我应该更改现有路由器链接以使用 /127 吗?
不建议在路由器之间使用 /127,而且从来没有这样——所有路由器的 Anycast 地址是子网的全零地址;这意味着 /127 在技术上仅在其中一台不充当路由器的两台机器之间有效。/126 当然没问题。
但是,无论如何,我不建议切换现有的 /64 链接,除非您的设备容易受到 Neighbor Discovery 缓存泛洪攻击的攻击——即使在这种情况下,首先要确定您是否真的要使用该 /64 进行互联网连接,如果答案是否定的,就防火墙吧。
为什么要为虚拟机配置小于 /64 的子网?
这打破了 SLAAC 和 RAs,除非你真的,真的知道你在做什么,否则你不太可能有任何充分的理由这样做 - 也许你的上游只给你一个 /64 但如果是这样的话,你需要去回到他们那里并要求更多,如果他们想为此向您收费,请开始寻找新的提供商,也可能向他们发送一些链接到相关 RFC 的尖刻电子邮件。
在其他情况下我会使用小于 /64 的子网吗?
诚实地?可能不是。如果我想到一个合理的理由,即为了防止 NDP 攻击以外的目的,更可取较小的子网,我将编辑此部分。
相反,有些情况下您不想使用小于 /64 的子网 - 特别是在您运行具有硬件转发设备的环境的任何地方(想想名牌路由器和 L3 交换机) - 有些将无法进行前缀的硬件路由长于 /64,其他人必须将操作拆分为多个比较,因此,您至少应该尽最大努力确保 /64 是您的(OSPF/ISIS/EIGRP/等)骨干网中最长的前缀。
我可以直接从 IPv4 子网映射到 IPv6 子网吗?例如,IPv4 /24 是否直接对应于 IPv6 /56 或 /120?
正式地,::ffff:xxxx 是 IPv6 映射的 IPv4 地址的格式 - 当然还有许多转换机制,即 6to4 及其相关的 6rd,它们将 IPv4 地址映射到全球 IPv6 地址以达到目的通过创建从 IPv4 地址派生的 IPv6 前缀来提供对 IPv4 的 IPv6 访问。
我的接口有多个 IPv6 地址。所有子网都必须相同吗?
不,在同一接口上使用不同的地址和子网大小应该不是问题。如果是,则实施有问题。当然,更好的问题是你为什么要这样做?
为什么我有时会在 IPv6 地址中看到 % 而不是 /,这是什么意思?
这是一个定界符,通常应用于链路本地地址 (fe80::/12) - 因为相同的链路本地地址可以合法地存在于多个接口上,所以 % 定界符用于允许指定所指的接口。Linux 通常在执行涉及本地链接的操作时强制指定接口。Windows Vista/2008 及更高版本更智能,除非本地链接不唯一,否则不会抱怨。
我是否浪费了太多子网?我们不是又要跑出去了吗?
不,这是一匹死马,被鞭打了WAAAAAAAAAY太多次了——当前的全球 IPv6 互联网是 2000::/3——如果地球上的每个 RIR 都以某种方式设法耗尽它们,那么 IANA 可以开始使用更多的前缀地址股票。所以不,我们不会用完空间,即使我们用完了,也需要轻点笔来打开一个新的前缀,而不是技术上的改变。这个问题真正突出的唯一一件事是人类思维无法完全理解地址空间有多么荒谬。
IPv6 子网划分与 IPv4 子网划分在哪些其他主要方面不同?
除了不关心你使用了多少空间之外,请记住没有广播地址并且“子网零”地址现在是所有路由器的任播地址(它基本上是一个隐式存在于所有已配置节点上的地址转发 IPv6 数据包) - 这有一个有用的副作用,允许您使用全零地址作为网络中的默认路由(不,它不会导致数据包重复,它是 ANYcast,而不是 MULTIcast) - 请记住虽然主机可能每隔几秒在路由器之间切换一次,但如果连接跟踪未在它们之间同步,则这不适用于有状态的防火墙设置。
除此之外,另一个主要区别是 IPv6 关心重复地址和死邻居 (NUD) - 因此,与 IPv4 不同,如果主机可以确定链路上的另一个节点已经在使用它,它将拒绝使用该地址. 另一方面,如果您正在配置静态路由,则 NUD 很有用 - 您实际上可以定义多个单独的路由到具有不同度量的前缀,它们实际上会起作用,这与 IPv4 不同,在 IPv4 中,无论下一个是否使用,都会使用最低度量的路由-hop is dead or alive(尽管对于某些使用 ARP 验证路由的 IPv4 实现,如 Cisco 和其他主要路由器供应商,这可能并非如此)
TLDR; IPv6 检测重复地址和无法访问的邻居。全零地址是全路由器任播,没有广播之类的东西,全一是常规地址。
对于那些想知道规范中 SLAAC 的 /64 要求从何而来的人,这里有一些额外的参考资料:
来自IPv6 无状态地址自动配置 (RFC 4862):
从IP 版本 6 寻址架构 (RFC 4291)中:
因此,由于接口 ID 必须为 64 位长,并且前缀长度和接口 ID 长度之和必须为 128,因此使用 SLAAC 时前缀的唯一可能长度为 64 位。
因为 IPv6 支持者喜欢无状态自动配置的想法。
如果您选择任何其他子网大小,则无状态自动配置将中断。其他一些小东西也可能会损坏,请阅读 rfc7421 了解更多详细信息。
我个人认为无状态自动配置无论如何都是一个愚蠢的想法。它会导致无法读取的地址,并且除了将块分配给子网之外,您基本上无法控制寻址。
当然,约定俗成的事情是,如果您遵循它们而出了问题,您可以指出约定,如果您拒绝遵循它们并且出了问题,那将是您的错。
使用具有少量可用地址的子网可以避免邻居发现耗尽攻击。
当然,这种推理不仅仅适用于点对点链接。我猜想为点对点路由器链路推荐这个建议在政治上是可能的,但在政治上不可能为其他链接推荐。
这里需要区分一下。托管服务提供商可以通过两种方式将地址分配给机器(无论是物理的还是虚拟的)。
他们可以为它们分配“链接”地址,机器将在其中回复邻居发现请求。一传递到路由器。
或者他们可以将机器视为路由器并为其分配路由块。在这种情况下,它需要足够的地址来寻址它的所有内部子网。如果您遵循“所有子网必须是 /64”的约定,这意味着至少要为它分配一个 /64,可能更多。这对于具有“机器内部网络”的机器来说是有意义的,例如容器主机。
任何此类映射都是本地策略的问题。
不
% 是接口标识符。它与链路本地地址一起使用。它是必需的,因为一台机器可能有多个接口,并且连接到这些接口的网络可能有重叠的链路本地地址。
我不会太担心它。
即使 IPv6 设计者奇怪地决定使用 128 位地址空间,然后在无状态自动配置中丢弃近一半,IPv6 的空间仍然比 IPv4 大得多。
如果出现紧缩,只需要大笔一挥就可以恢复那个奇怪的决定。
IPv6 可扩展性的一个更大问题是路由表的大小。强烈建议不要使用 IPv6 NAT。在提供商分配的地址上运行大型网络会导致提供商锁定的重大风险。
因此,我相信随着 IPv6 对企业网络的渗透不断增加,我们将看到对独立于供应商的 IPv6 空间的需求激增。