我有 2 个路由器向不同的提供商宣布 /22 子网(一个提供商连接到 2 个路由器中的每一个)。我已将 /22 分成两个 /23,以在每个路由器上宣布一个 /23 加上 /22(提供商将采用更具体的路由)。这允许我进行故障转移并保持 /23 内的流量进出同一提供商。
还有哪些其他方法可以让我仅通过两个路由器宣布 /22 并让来自路由器后面网络上服务器的数据包返回它们来自的同一路由器?
编辑:
我遇到的主要问题(最终用户和客户抱怨最多的问题)是最少跳路由有时不是“最佳”路由。就我而言,我知道提供商 B 可能对 X 国家有更好的延迟。但是当数据包从提供商 B 进来时,它们可能会从提供商 A 或提供商 B 出去。反之亦然。如果我从提供者 A 向 X 国家发送数据包,即使它可能有更多的返回跳数,数据包也可能来自提供者 B(对于这个国家可能有更高的延迟、数据包丢失等)
严格来说,当您向多个提供商宣布您的前缀时,您将失去对入站路由路径的完全控制,因为在下游为返回流量做出了独立的路由决策。此外,您的公告甚至可以在您发送后被下游提供商修改。
例子
这是可能发生的情况之一。假设您有 AS 777,它拥有 2.2.0.0/22。您拥有一家拥有路由器 A 的公司需要访问的服务...我们还假设 AS 100 与您之间的链接不佳(也许由于您无法修复的物理层问题,它会间歇性地破坏流量). 所以你自己想,“我会把我所有的公告都放在带有大量 ASN 的 AS100 之前,这样在我解决这个问题之前,没有人会喜欢 AS100 链接”。
问题是您只能完全控制出站路由决策。您无法完全控制入站...所以让我们假设路由器 A 的管理员不知道您到 AS100 的链接是坏的。它们是 AS200 和 AS100 的双宿主,但 AS100 提供更便宜的传输,每 Mbps;因此,路由器 A 的工程师从 AS100 获取完整路由,仅使用 AS200 作为备份(仅从它们获取默认值)。
作为 AS 777 的管理员,您可以强制通过 AS 200 到路由器 A 的流量,但从路由器 A 到 2.2.0.0/22 的流量仍将采用 AS 100(因为最佳路由是通过 AS 100,在路由器 A)。
可能的解决方案
通常不对称路径很重要,因为接收流量的负载平衡器或防火墙。一些可能的解决方案:
如果您提供有关服务和问题的性质的更多详细信息,我们可能会提供更具体的建议。
你为什么要这个?或者更准确地说,您为什么要强制执行此行为(因为由于路由的魔力,通常会发生这种情况)?
BGP 和构成现代互联网的分布式路由层次结构的全部意义在于,您的数据包将采用最佳可用路由到达目的地。如果一个数据包过来
Route A
但Route B
由于某种原因是回复的更好选择那么为什么你不想通过最佳路由发送你的回复?我能看到的唯一原因是想让您的流量远离更昂贵的运营商(在这种情况下有更好的方法)。
在这里实现对称的方法实际上与其说是 BGP 的功能,不如说是 NAT 的功能。让我们假设您继续使用从两个路由器通告 /22 以及从每个路由器通告一个 /23 的方案。设置出站 NAT,使离开给定边界路由器的流量在该路由器的 /23 中获得源地址。为了实现入站流量的对称,您还需要源 NAT 将来自全局源的连接转换为分配给每个边界路由器的单独池。
您将无法在服务器级别了解连接的实际来源,但可以通过 Netflow 或类似机制从路由器检索该信息。
这里引入了很大程度的潜在复杂性,这也将转化(没有双关语意)到您为服务器放置默认网关的位置和方式。这可能需要具有适当策略的 BGP 通信路由器的中间层,以保持本地发起的流量沿正确的方向前进。但是,一般来说,当您从多个路由器通告具有相同指标的相同路由时,没有优雅的方法来确保对称路由 - 而且,老实说,超出对状态感知设备(如某些防火墙或负载平衡器)的特定要求,这只是不是大多数网络的典型设计目标。