Answers:
理解两者之间差异的最简单方法是通过一个显示前缀的层次结构性质的示例。
层次结构示例
ISP已从RIR(区域Internet注册表)中分配了前缀,在本示例中,我们将假定为2001:db8::/32
。此前缀与传递给客户的前缀不同,因为ISP必须通过BGP将其通告给与之对等的其他ISP。
ISP现在将为客户分配前缀。首先,它们分配2001:db8:0:1::/64
给将ISP路由器连接到CPE(客户驻地设备)路由器的链接。这是链接前缀,因为它已分配给链接。作为一般建议,IPv6中的所有链接前缀都应为/64
。
ISP路由器将发送通告该前缀的路由器广告,CPE将使用SLAAC为指向ISP路由器内ISP路由器的外部接口构造地址/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
其链路前缀的数据包时,它将执行邻居发现以在内找到主机的MAC地址/64
。
这样,ISP路由器将需要为链接前缀内的每个IP地址使用单独的邻居缓存条目。
当ISP路由器收到2001:db8:1::/48
其路由前缀的数据包时,它会执行邻居发现以找到网关的MAC地址2001:db8:0:1:42:ff:fe00:42
。
这样,ISP路由器只需要网关的一个邻居缓存条目即可将数据包路由到路由前缀内的任何IP地址。此属性对于Internet的可伸缩性至关重要。
解决缺少路由前缀的问题
有时,客户发现自己陷入了仅提供链接前缀而没有路由前缀的ISP的困境。在这种情况下,客户可能会安装守护程序,该守护程序对链接前缀的特定子范围内的所有IP地址的邻居发现做出响应。这将具有类似于将该前缀配置为路由前缀的效果。但是它有几个缺点:
/64
,但是响应邻居发现请求的守护程序只能创建一个长于的“路由”前缀/64
。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地址。但是,这是一个愚蠢的破解,因为它仍然引入了一些缺点,以解决不存在的问题。
也可能根本不给点对点链接分配任何前缀。只要每个端点都具有在其上具有全局地址的另一个接口,则在点对点链接上进行通信时,它们可以使用分配给另一个接口的地址。我不知道这种方法有什么缺点,因此,如果您发现这种点对点链接的方法简化了您的网络配置,请随时使用它,但不要将其用作保存地址的措施。
路由前缀的用例
最后一点的更详细示例是DNS递归。由于直到我们完成与IPv4的对抗后,我才认为DNSSEC不会获得太大的吸引力,因此需要采取其他措施来防止DNS中毒。已经尽力使熵尽可能多地进入查询。ID和端口号最多可以容纳32位熵,如果要解析的域名中混合使用大小写,则请求中可以保留另外几位。这样,您很少会获得超过48位的数据。将完整/64
的域名分配给DNS递归将使熵一次增加64位,这比所有其他努力的总和还多。
/48
结果内部任何未使用地址的数据包都导致目标IP的邻居请求数据包,那么确实听起来像提供商将其配置/48
为链接前缀。/48
不建议将a 配置为链接前缀,但是我听说提供商还是这样做。如果它是路由前缀,则无论/48
数据包内的哪个IP地址被定位为目标,您每次看到的邻居请求都将针对相同的IP地址。并且,一旦您对此做出回应,您将不会再看到邻居的请求。
路由器和ISP之间使用链接前缀。
路由前缀在网络内部使用。
如果您从ISP收到/ 64路由前缀,则只需让路由器在LAN上发布该前缀即可。如果您的前缀小于/ 64(也许是/ 48?),则应考虑如何以合理的方式对该前缀进行子网划分,以供组织中的所有路由器使用。
在Wireshark的,这取决于在那里你捕获的数据包,您可能会看到正在使用的只有路由前缀(如果你的局域网上捕获),或者你可能会看到使用(如果你在WAN捕捉)两个前缀。
关于邻居发现协议,它也取决于链接。在ISP和路由器之间的链路上,NDP用于发现路由器的WAN接口的MAC地址和ISP的上游路由器的MAC地址。在您的LAN接口上,NDP用于发现您的LAN网段上的主机的MAC地址。
希望这可以帮助。
If you received a /64 from your ISP, then you would simply have your router advertise that prefix on your LAN
如果您明确指出该句子/64
是指路由前缀,则该句子不太可能会被误解。