IPv6:“路由前缀”和“链接前缀”之间的区别?

Eri*_*rik 14 routing ipv6

IPv6 的“路由前缀”和“链接前缀”之间的确切区别是什么?
Wireshark-Trace 中的这些差异如何?(如果您观察到分配了“路由前缀”的主机或分配了“链接前缀”的主机)。
邻居发现协议中的这些差异如何?(从一个角度其它/外部主机的点),
难道他们工作在一起,这两种类型的前缀?

kas*_*erd 20

了解两者之间差异的最简单方法是通过一个示例显示前缀的层次结构。

示例层次结构

ISP 已经从RIR(区域互联网注册机构)分配了一个前缀,在这个例子中我们假设是2001:db8::/32。该前缀与传递给客户的前缀不同,因为 ISP 必须通过 BGP 向与其对等的其他 ISP 宣布它。

ISP 现在将为客户分配前缀。首先,它们分配2001:db8:0:1::/64给连接 ISP 路由器和CPE(用户驻地设备)路由器的链路。这是一个链接前缀,因为它被分配给一个链接。作为一般建议,IPv6 中的所有链接前缀都应该是/64.

ISP 路由器将发送路由器通告,宣布此前缀,CPE 将使用 SLAAC 为指向/64. 让我们假设外部接口获得了 IP 地址2001:db8:0:1:42:ff:fe00:42/64/64包含在这个符号中是为了提醒我们链接前缀的长度是多少,但我也可以省略它)。

这个链接前缀足以让 CPE 路由器与世界其他地方进行通信,但它并不能帮助 CPE 路由器支持 LAN 上连接到其内部接口的任何客户端。CPE 路由器需要通过该 CPE 路由器路由的 LAN 的前缀,因此这称为路由前缀

路由前缀可以静态配置,也可以通过 DHCPv6 配置。CPE 路由器如何与 ISP 提供的 DHCPv6 服务器协商前缀长度的确切细节超出了本答案的范围。搜索前缀委托可以告诉您更多相关信息。让我们假设路由前缀最终是2001:db8:1::/48. 在 ISP 路由器上,将创建一个路由表条目,指示2001:db8:1::/48需要通过网关路由2001:db8:0:1:42:ff:fe00:42。该路由表条目是路由前缀的定义特征。

CPE 路由器可能有多个内部 LAN,因此/48它可以/64为每个内部 LAN分配一个链路前缀。如果我们假设其中一个 LAN 已被分配2001:db8:1:1::/64为其链路前缀,则该链路上的节点可以2001:db8:1:1::42:ff:fe00:43通过 SLAAC获得地址。该节点可能是一个无线路由器,它的无线接口恰好需要一个前缀。CPE 可以指定2001:db8:1:100::/60为无线路由器的路由前缀,无线路由器可以指定2001:db8:1:100::/64为无线接口的链路前缀。

现在在这样的设置中,我们拥有的是一个前缀层次结构。以下全部嵌套在彼此之下:

  • 2001:db8::/32 BGP 公布前缀
  • 2001:db8:1::/48 路由前缀
  • 2001:db8:1:100::/60 路由前缀
  • 2001:db8:1:100::/64 链接前缀

数据包实际上是如何处理的

当 ISP 路由器收到一个2001:db8:0:1::/64包含链接前缀的数据包时,它会执行邻居发现以在/64.

这样,ISP 路由器将需要一个单独的邻居缓存条目,用于链接前缀内的每个 IP 地址。

当 ISP 路由器收到一个2001:db8:1::/48路由前缀的数据包时,它会执行邻居发现以找到网关的 MAC 地址2001:db8:0:1:42:ff:fe00:42

这样,ISP 路由器只需要网关的单个邻居缓存条目,即可将数据包路由到路由前缀内的任何 IP 地址。此属性对于 Internet 的可扩展性至关重要。

解决缺少路由前缀的问题

有时,客户会发现自己受困于只提供链接前缀而没有路由前缀的 ISP。在这种情况下,客户可以安装一个守护进程,该守护进程响应链接前缀特定子范围内所有 IP 地址的邻居发现。这将产生类似于将该前缀配置为路由前缀的效果。但它有几个缺点:

  • 一般来说,路由前缀应该比 短/64,但是响应邻居发现请求的守护进程只能创建一个比 长的“路由”前缀/64
  • 由于每次 IP 地址不在 ISP 路由器上的邻居缓存中时都会进行额外的往返,因此它会略微增加延迟。
  • 由于需要更频繁的邻居发现,它增加了 ISP 路由器的负载。ISP 路由器很可能可以纯粹在硬件中将数据包转发到已知的目的地前缀,但邻居发现将在软件中完成。
  • 它会增加 ISP 路由器的内存消耗。如果 ISP 为每个客户分配一个路由前缀,他们可以很容易地摆脱每个客户只有一个邻居缓存条目的情况。但是对于邻居响应程序守护程序,这可能会变成每个客户的数千个条目。

ISP 路由器上的处理开销可能是一个重要问题。一些路由器在处理需要邻居发现的大量数据包方面非常糟糕,以至于它变成了实际的 DoS 攻击,并且使用更长的链接前缀(在/120-127范围内)已被用作此类 DoS 攻击的解决方法。

即使路由器不易受到 DoS 攻击,当使用上述解决方法时,邻居缓存条目所需的内存对 ISP 来说比路由前缀的 IP 地址昂贵得多,因此几乎没有理由ISP 拒绝分发路由前缀。

点对点链接的特殊情况

在点对点链路(例如 6in4 隧道和 PPP 链路)上,不需要邻居发现。在这样的链路上发送数据包只有一个方向,并且在发送数据包之前不需要查找硬件地址。

这意味着邻居发现的开销在这样的链路上不是问题。因此,让点对点链路的一端使用大量地址不是问题,只要端点对谁使用哪些地址达成了某种协议。缺少邻居发现意味着也没有重复地址检测,因此如果两个端点都尝试使用相同的地址,它将不会按预期工作(除非您希望它表现为任播地址)。

关于点对点链接,需要记住一个警告。每个端点将假定链路上没有分配给它自己的所有地址都分配给另一端。这意味着点对点链路上未使用的地址容易触发路由循环。这样的路由循环(以及其他几种路由循环情况)可以通过端点从不将数据包直接发送回接收它的节点来避免。因此,从点对点链路接收的数据包不得通过同一点对点链路发回,只要一个端点正确,路由循环就会被打破。作为以太网上的侧节点,接收数据包并将其转发回同一链路是有效的,但如果将其转发回接收数据包的相同 MAC 地址,则最好避免这样做。

由于点对点链路上的大多数地址将被转发到链路的另一端而无需邻居发现,因此它看起来与路由前缀非常相似。例如,如果 ISP 将 2001:db8:42::/64 分配给点对点链路,端点被分配地址 2001:db8:42::1 和 2001:db8:42::2,则数据包将发送到大多数地址in 2001:db8:42::/64 将从 ISP 转发给客户,就像使用 2001:db8:42::2 作为网关的路由前缀一样。

这意味着某种黑客攻击是可能的。在 CPE 上,实际上可以将 2001:db8:42::/64 配置为 LAN 上的链接前缀。为了让 CPE 知道某个目的地位于两条链路中的哪一条,指向 ISP 的点对点链路的实际配置必须更改为 2001:db8:42::/126。这一切都可以工作,但有一个小例外,局域网上的主机无法与 2001:db8:42::/126 中的四个 IP 地址通信。反正他们大概也不需要和那些人交流,所以这也不是什么大问题。然而,不推荐使用这个 hack,正确的配置是从 ISP 获取路由前缀。

另一个保存地址的技巧是只为路由前缀分配全局地址,并为点对点链接使用 RFC 4193 地址。然而,这是一个愚蠢的黑客,因为它仍然引入了一些缺点来解决一个不存在的问题。

也可以根本不为点对点链接分配任何前缀。只要每个端点都有另一个接口,它确实有一个全局地址,它们就可以在点对点链路上通信时使用分配给另一个接口的地址。我不知道这种方法有什么缺点,所以如果您发现这种点对点链接的方法简化了您的网络配置,请随意使用它,但不要将其用作保存地址的措施。

路由前缀的用例

  • 在我的第一个示例中,分层路由是路由前缀的设计目的。
  • VPN/隧道将另一层添加到需要前缀的路由器层次结构中。尽管它们是虚拟的而不是真正的硬件,但它们在寻址方面并没有什么不同,并且需要一个路由前缀,就像物理链接一样。
  • 为一台主机分配多个地址。有将大量地址分配给单个主机的用例。对于少数地址,可以简单地分配和处理每个缓存条目以及与地址一样多的缓存条目。但是如果需要数千个地址,路由前缀会更好。

最后一点的一个更详细的例子是 DNS 递归。由于在我们完成与 IPv4 的斗争之前,我认为 DNSSEC 不会受到很大的关注,因此需要采取其他措施来防止 DNS 中毒。已努力使查询尽可能多的熵。ID和端口号最多可以容纳32位熵,如果要解析的域名中大小写混合,则请求中可以容纳另外几位。您很少会以这种方式获得超过 48 位的总数。/64为 DNS 递归分配一个 full将使熵一次性增加 64 位,这比所有其他努力的总和还要多。