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