这是一个典型问题关于 IPv6 子网划分。
有关的:
我对IPv4 子网划分,当我准备(部署|工作)IPv6 网络时,我需要知道这些知识中有多少是可转移的,以及我还需要学习什么。乍一看,IPv6 似乎比 IPv4 复杂得多。所以我想知道:
- IPv6 是 128 位,那么为什么 /64 是主机的最小推荐子网?与此相关:
- 为什么建议在路由器之间使用 /127 作为点对点链接,而过去为什么不建议这样做?我是否应该将现有的路由器链接更改为使用 /127?
- 为什么虚拟机配置的地址少于 /64?
- 在其他情况下我是否需要使用小于 /64 的子网?
- 我可以直接从 IPv4 子网映射到 IPv6 子网吗?例如,IPv4 /24 是否直接对应于 IPv6 /56 或 /120?
- 我的接口有多个 IPv6 地址。所有接口的子网都必须相同吗?
- 为什么我有时在 IPv6 地址中看到 % 而不是 /,这是什么意思?
- 我是不是浪费了太多子网?我们不是又要用光子网了吗?
- IPv6 子网划分与 IPv4 子网划分还有哪些主要区别?
答案1
关于 IPv6 子网划分,首先要提到的是,思维方式是必需的。在 IPv4 中,您通常会考虑多少地址你有以及如何为每个最终用户分配足够的资源。在 IPv6 中,您通常会考虑有多少/64
-子网您有多少可用地址以及如何将它们分配给最终用户。您几乎从不担心给定子网中将使用多少 IP 地址。除了点对点链接等特殊情况外,每个子网的可用地址远远超过其所需的地址,因此您只需担心分配子网,而不是子网内的主机。
IPv6 子网通常是/64
因为斯坦福直线加速器(无状态地址自动配置)才能正常工作。即使在不使用 SLAAC 的地方,也可能有其他原因需要使用/64
。例如,可能有一些最终用户设备假设 /64
否则,/64
在某些路由器上,路由子网比可能更窄可能会效率低下,因为路由器实现者已经优化了或更宽的路由的情况,/64
以节省路由表内存。
为什么建议用于/127
点对点链接?
对于点对点链路的特定情况,/127
建议使用 而不是 ,/64
以避免出现漏洞,即发往子网上数以千万亿计的未使用地址中的任何一个的数据包会导致不必要的邻居请求和表条目,从而可能淹没路由器。这种错误地址的数据包可能是恶意的或意外的。但即使您实际上将点对点链路配置为/127
,有些人也主张分配一个整体/64
以保持一致性。
为什么要为虚拟机配置比 更窄的子网/64
?
我不清楚为什么虚拟机会配置比 更窄的子网/64
。也许是因为托管服务提供商认为服务器就像最终用户一样,只需要一个/64
子网,而没有预料到服务器实际上是需要内部路由拓扑的虚拟机集合?也可以简单地这样做,使寻址计划更容易记住:主机获得PREFIX::/64
,然后每个虚拟机获得PREFIX:0:NNNN::/96
,其中 NNNN 对于虚拟机是唯一的,并且虚拟机可以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
因为/64
的主机地址价值远远超出我们所能想象的需要。/56
:基本子网块256
。尽管当前政策允许 ISP 向每个最终用户分配与 一样大的块/48
,并且仍然认为他们的地址利用率是合理的,但一些 ISP 可能(并且已经)选择向消费级客户分配 ,/56
作为为他们分配大量子网和地址经济之间的折衷。/48
:基本子网块65536
以及每个 ISP 客户端站点应接收的块的建议大小。/32
:大多数 ISP 每次从区域地址注册表请求更多地址时将收到的默认块大小。
在服务提供商和企业网络内部,可以看到比这 4 个前缀长度多得多的前缀。查看这些网络内部路由器的路由表时,IPv4 和 IPv6 有很多共同之处,包括大部分路由工作方式:较长前缀的路由优先于较短前缀的覆盖路由,因此可以聚合(缩短)和深入(延长)路由。与 IPv4 一样,可以将路由聚合或汇总为具有较短前缀的较大块,以最小化路由表的大小。
IPv4 和 IPv6 之间映射的另一个问题是如何协调双栈机器上的 IPv4 和 IPv6 分配,以便可以轻松理解寻址计划。到目前为止,肯定有常用的惯例来做到这一点:将 IPv4“子网号”嵌入 IPv6 前缀的一部分,要么使用浮力调节装置(例如10.0.234.0/24
变成2001:db8:abcd:234::/64
)或二进制(10.0.234.0/24
变成2001: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 中。这真的相当多。不,我的意思是真的相当多!
但是,我们仍然会自动向任何请求 IPv6 的 ISP 提供 IPv6 空间/32
,我们向每个 ISP 客户提供 IPv6 空间/48
。也许我们有些夸张,我们终究还是会浪费 IPv6。但是,对此有一个规定:到目前为止,只有八分之一的 IPv6 空间可供使用:2000::/3
。我们的想法是,如果我们把前八分之一的空间搞得一团糟,不得不大幅度修改自由分配政策,那么在陷入困境之前,我们还可以再尝试 7 次。
最后:IPv6 不必永远存在。也许它的寿命会比 IPv4 更长(已经很长了,而且还没有结束),但就像每一项技术一样,它终有一天会变得不再重要。我们只需要坚持到那时。
答案2
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。
好的,继续解释:
除以二进制 000 开头的全球单播地址之外的所有地址都有一个 64 位接口 ID 字段。
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 的子网?
不。除非你坏了。好吧,根据当地要求,你可能有理由在现有网络上设置手动路由。但请记住,这样做可能会弄得一团糟:
使用 /64 以外的子网前缀长度将破坏 IPv6 的许多功能,包括邻居发现 (ND)、安全邻居发现 (SEND) [RFC3971]、隐私扩展 [RFC4941]、移动 IPv6 的部分 [RFC4866]、协议独立多播 - 稀疏模式 (PIM-SM) 和嵌入式 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 地址,这可以简化应用程序开发。就网络而言,这没有丝毫区别。
答案3
IPv6 是 128 位,那么为什么 /64 是主机的最小推荐子网?
此前缀大小最初是在较旧的 RFC 中推荐的 - 此后对该政策进行了修订,其中考虑了邻居发现攻击的问题,并使用 /126 是一种有效的缓解措施 - 尽管如此,如果您设置 PtP 链接的唯一目的是路由流量,则另一种选择是坚持使用 /64 并对该子网进行防火墙保护。更好的方法是,为自己分配一个池,您将从中抽取 /64 子网,并将整个池作为边缘的黑名单目的地(以及可能来自敌意的任何其他位置)
为什么建议在路由器之间使用 /127 作为点对点链接,而过去为什么不建议这样做?我是否应该将现有的路由器链接更改为使用 /127?
不建议在路由器之间使用 /127,而且从未建议过 - 所有路由器的任播地址都是子网的全零地址;这意味着 /127 在技术上仅在两台机器之间有效,其中一台是不是充当路由器。/126 当然可以。
但是,无论如何,我不会建议切换现有的 /64 链接,除非您的设备容易受到邻居发现缓存洪水攻击 - 即使在这种情况下,也要首先确定您是否实际要使用该 /64 进行互联网连接,如果答案是否定的,只需对其进行防火墙。
为什么要为虚拟机配置小于 /64 的子网?
这打破了 SLAAC 和 RA,除非你真的,真的知道自己在做什么,你不太可能有任何充分的理由这样做 - 也许你的上游只给了你一个 /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 及更高版本更智能,除非链路本地不唯一,否则不会发出抱怨。
我是不是浪费了太多子网?我们不是又要用光子网了吗?
不,这是一匹被鞭打过的死马哇哇哇次数太多了——目前的全球 IPv6 互联网是 2000::/3——如果地球上的每个 RIR 都设法耗尽其地址库存,IANA 可以开始使用更多前缀。所以,我们不会用完空间,即使我们用完了,也只需要动动笔就可以找到新的前缀,而不是技术上的改变。这个问题真正突出的唯一一点是人类思维无法完全理解地址空间有多么广阔。
IPv6 子网划分与 IPv4 子网划分还有哪些主要区别?
除了不关心您使用的空间大小之外,请记住没有广播地址,并且“子网零”地址现在是所有路由器的任播地址(基本上是隐式存在于配置为转发 IPv6 数据包的所有节点上的地址)-这有一个有用的副作用,允许您使用全零地址作为网络中的默认路由(不,它不会导致数据包重复,它是任播,而不是多播)-但请记住,主机可能会每隔几秒钟在路由器之间切换,因此如果连接跟踪未在它们之间同步,则这不适合状态防火墙设置。
除此之外,另一个主要区别是 IPv6 关注重复地址和死邻居 (NUD) - 因此,与 IPv4 不同,如果主机可以确定链接上的另一个节点已经在使用某个地址,它将拒绝使用该地址。另一方面,如果您正在配置静态路由,NUD 非常有用 - 您实际上可以定义多个单独的路由到具有不同度量的前缀,并且它们实际上会起作用,这与 IPv4 不同,在 IPv4 中,无论下一跳是死的还是活的,都会使用最低度量路由(尽管对于使用 ARP 验证路由的一些 IPv4 实现,如 Cisco 和其他主要路由器供应商,情况可能并非如此)
TLDR;IPv6 检测重复地址和无法访问的邻居。全零地址是全路由器任播,没有广播之类的东西,全一地址是常规地址。
答案4
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 空间的需求激增。