IPv6 的“路由前缀”和“链接前缀”之间究竟有什么区别?
这些区别在 wireshark-Trace 中如何体现?(如果您观察到具有指定“路由前缀”的主机或具有指定“链接前缀”的主机)。
这些区别在邻居发现协议中如何体现?(从其他/外部主机的角度来看)
它们是否有效一起,这两类前缀?
答案1
理解两者之间差异的最简单方法是通过一个展示前缀的层次性质的例子。
层次结构示例
ISP 已从区域情报(区域互联网注册局),在本例中我们假设为2001:db8::/32
。此前缀与传递给客户的前缀不同,因为 ISP 必须通过 BGP 将其通告给与其对等的其他 ISP。
ISP 现在要为客户分配前缀。首先,它们分配2001:db8:0:1::/64
给连接 ISP 路由器和持续教育(客户端设备)路由器。这是一个链接前缀因为它被分配给了链接。一般建议 IPv6 中的所有链接前缀都应为/64
。
ISP 路由器将发送路由器通告来宣布此前缀,而 CPE 将使用 SLAAC 为指向 ISP 路由器的外部接口构建一个地址/64
。我们假设外部接口获得了 IP 地址2001:db8:0:1:42:ff:fe00:42/64
(此符号中/64
包含此 IP 地址是为了提醒我们链接前缀的长度,但我也可以省略它)。
此链接前缀足以使 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
为其链接前缀,则此链接上的节点可以通过 SLAAC 获取地址2001:db8:1:1::42:ff:fe00:43
。该节点可能是无线路由器,恰好需要为其无线接口分配前缀。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
链路前缀的数据包时,它会执行邻居发现来查找其中主机的 MAC 地址/64
。
这样,ISP 路由器将需要为链路前缀内的每个 IP 地址设置单独的邻居缓存条目。
当 ISP 路由器收到2001:db8:1::/48
带有路由前缀的数据包时,它会执行邻居发现来查找网关的 MAC 地址2001:db8:0:1:42:ff:fe00:42
。
这样,ISP 路由器只需要网关的一个邻居缓存条目,就可以将数据包路由到路由前缀内的任何 IP 地址。此属性对于互联网的可扩展性至关重要。
解决缺少路由前缀的问题
有时,客户会发现自己被一家只提供链接前缀而不提供路由前缀的 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,那么发往 2001:db8:42::/64 中大多数地址的数据包将从 ISP 转发到客户,就像这是使用 2001:db8:42::2 作为网关的路由前缀一样。
这意味着可以进行某种黑客攻击。在 CPE 上,实际上可以将 2001:db8:42::/64 配置为 LAN 上的链路前缀。为了让 CPE 知道某个目的地位于两条链路中的哪一条上,必须将指向 ISP 的点对点链路上的实际配置更改为 2001:db8:42::/126。除了一个小例外,所有这一切都可以正常工作,LAN 上的主机无法与 2001:db8:42::/126 中的四个 IP 地址通信。由于它们可能不需要与这些地址通信,所以这不是什么大问题。但是,不建议使用这种黑客攻击,正确的配置是从 ISP 获取路由前缀。
另一种节省地址的方法是仅为路由前缀分配全局地址,并为点对点链接使用 RFC 4193 地址。然而,这是一种愚蠢的技巧,因为它仍然会引入一些缺点来解决不存在的问题。
也可以不为点对点链路分配任何前缀。只要每个端点都有另一个具有全局地址的接口,它们就可以在点对点链路上通信时使用分配给另一个接口的地址。我不知道这种方法有什么缺点,所以如果您发现这种点对点链路方法简化了您的网络配置,请随意使用它,但不要将其用作节省地址的措施。
路由前缀的用例
- 分层路由正如我的第一个例子所示,路由前缀就是为此而设计的。
- VPN/隧道在需要前缀的路由器层次结构中添加另一层。虽然它们是虚拟的而不是真实的硬件,但它们在寻址方面并没有什么不同,并且像物理链路一样需要路由前缀。
- 为主机分配多个地址。有些用例需要将大量地址分配给单个主机。对于少数地址,只需分配它们并通过邻居发现处理每个地址,并分配与地址数量相同的缓存条目。但如果需要数千个地址,则路由前缀更好。
最后一点的一个更详细的例子是 DNS 递归器。由于我认为 DNSSEC 在我们完成与 IPv4 的斗争之前不会获得很大的关注,因此需要采取其他措施来防止 DNS 中毒。我们已努力将尽可能多的熵放入查询中。ID 和端口号最多可以容纳 32 位熵,如果要解析的域名中混合了大小写,则可以在请求中保留另外几位。通过这种方式,您很少会得到超过 48 位的总数。为/64
DNS 递归器分配一个完整的值将允许熵一次性增加 64 位,这比所有其他努力的总和还要多。
答案2
您的路由器和 ISP 之间使用链接前缀。
路由前缀在您的网络内部使用。
如果您从 ISP 收到 /64 路由前缀,那么您只需让路由器在 LAN 上通告该前缀即可。如果您收到的前缀小于 /64(可能是 /48?),则应考虑如何以逻辑方式对该前缀进行子网划分,以供组织中的所有路由器使用。
在 Wireshark 中,取决于在哪里您捕获数据包时,可能会看到仅使用路由前缀(如果您在 LAN 上捕获)或者您可能会看到同时使用两个前缀(如果您在 WAN 上捕获)。
至于邻居发现协议,它也取决于链路。在 ISP 和路由器之间的链路上,NDP 用于发现路由器 WAN 接口的 MAC 地址和 ISP 上游路由器的 MAC 地址。在您的 LAN 接口上,NDP 用于发现 LAN 网段上主机的 MAC 地址。
希望这可以帮助。
答案3
如果发往该前缀的数据包需要经过路由器才能到达目的地,则该前缀为路由前缀。如果前缀位于本地网络接口所连接的网段上,则该前缀为链接前缀。
当数据包在互联网上传输时,它所针对的 /64 将是一个路由前缀,直到到达最后一跳。然后它将是一个链接前缀。
路由前缀通常会聚合。许多 /64 可以聚合为一个较短的前缀,以保持路由表较小。在互联网提供商之间的边界上,通常强制最大前缀长度为 /48。
如果前缀是 /0 到 /63 之间的任何值,通常可以假设它是路由前缀。如果前缀是 /64,则需要更多信息才能知道它是路由前缀还是链接前缀。