iEdon-Net 2021 年改造计划(一):BGP Confederation 改造

作者: iEdon 分类: 文章列表 发布时间: 2021-01-24 21:24

前言

iEdon-Net 建立至今已经接近两年。目前已经具备大大小小节点 8 处,其中设有核心交换节点 2 处。当前拥有互联者 16 个。网内设有 Git, Docker, 文件同步, 虚拟化, Web 服务, Portal 等大大小小多个服务。然而随着时间的推移,现有架构显得越来越臃肿与复杂——我不得不治理分散化的服务与进行零碎的故障响应。我显然没有这些时间来经常打理。因此建设一个高可靠、高自动化地系统是非常有必要的。

具体计划

  • [私有云] 基于 Kubernetes 建设容器私有云
  • [私有云] 基于 MinIO 建设私有对象存储
  • [私有云] 基于 N8N.IO 建设私有工作流系统
  • [私有云] 集成 Drone CI 至 Git 系统
  • [基础设施] 建设自用用户管理系统
  • [基础设施] 迁移或改进自由微服务网关系统
  • [基础设施] 核心数据的迁移与备份
  • [基础设施] MySQL 多备
  • [网络] BGP 从 RR 架构迁移至 Confederation
  • [网络] 建设自有 WHOIS 与 Registry 服务
  • [网络] DNS 服务从 Microsoft DNS 迁移至 PowerDNS
  • [网络] 网络架构调整(长期)
  • [网络] Looking Glass 升级
  • [网络] 建设全网信息服务(自用)
  • [网络] 建设 Auto peering 系统(长期)

本次将进行第一项改造计划,将网络从现有的 Route Reflector 架构迁移至 Confederation。

为什么

先从 iBGP 的特性说起:

如果一条路由是同一个 AS 的路由器发来的,这条路由就不会被宣告给同一个 AS 下的其它路由器。

这个特性原本是为了避免网络环路,如果需要启用传递外部网络信息,内部网络节点必须做到两两相连。如果不能做到,会导致外部网络的路由信息不能正确地在内部网络传递。为了解决这个问题,我以前选择了比较简单的实现:Route Reflector(RR)。但使用 RR 并不符合互联网的“去中心化”原则,且需要多处部署以避免单点故障问题,因此我决定迁移到 Confederation。

有大佬做出了非常详细的介绍,这里抄袭一下笔记(出处在参考资料):

  • 在 BGP Confederation 中,每个路由器同样会获得不同的 ASN。但是与 4 不同的是,这些 ISP 内部使用的私有 ASN 没有必要找 NIC 申请。
    • ASN 4200000000 – 4294967295 这一段号码是预留作“内部使用”的,也就是 ISP 可以直接在其内部使用这些 ASN。当然,这些 ASN 也不被 NIC 承认,(一般)不能被广播到其它 ISP。
  • 于是 ISP 给每个路由器从这一段中分配了一个内部使用的 ASN。虽然 BGP 的路由信息只记录了经过的 ASN,但是因为每个路由器的 ASN 都不同,就相当于记录了经过哪些路由器,也就不怕环路了。
  • 但是这些私有 ASN 不被其它网络承认,甚至可能与其它网络产生冲突(其它 ISP 正在用它们做测试),因此在将路由信息发给其它 ISP 的路由器时,就需要把这一段私有 ASN 都删掉,换成这个 ISP 从 NIC 申请下来的 ASN。
  • 但是每台路由器的 ASN 都不同,如何知道哪些路由器是“友军”(属于自己这个 ISP),哪些是“敌军”(属于其它 ISP)?可以给 ISP 内部的所有路由器分配一个统一的编号(称为 Confederation Identifier),用它来识别敌我。
  • 假设我们有如下的网络拓扑:CONFEDERATION
    • 其中 A 属于 AS1, B、C、D 属于 AS2,E 属于 AS3。
    • AS2 中设置了 BGP Confederation,B、C、D 的私有 ASN 分别是 21、22、23。
    • A 广播 10.0.0.0/8,B、C、D 接收后,各自获得以下路径:
      • B:AS21 -> AS1
      • C:AS22 -> AS21 -> AS1 或者 AS22 -> AS23 -> AS21 -> AS1
      • D:AS23 -> AS21 -> AS1 或者 AS23 -> AS22 -> AS21 -> AS1
    • 此时 C 在发送给 E 路由信息时,删掉了 AS2 内部 Confederation 的路径,替换成 AS2 这样一个整体的编号。
      • E:AS3 -> AS2 -> AS1
    • 如果天灾降临,B、D 之间的连接中断,D 仍然可以从 C 获得 AS23 -> AS22 -> AS21 -> AS1 这条路由,从而保证数据转发正常。
  • 这样既最大化保留了互联网去中心化的特点、避免了单点故障,同时也降低了 NIC 的信息处理压力。

部署

BGP Confederation 对内表现为互不相关的子自治域,对外则“抱团”展现为一个整体,这种做法非常美观直接,易于治理。我将 8 个节点分配了子 ASN。

节点 内部 ASN 网关地址
1 4221890001 172.23.91.2
2 4221890002 172.23.91.42
3 4221890003 172.23.91.116
4 4221890004 172.23.91.114
5 4221890005 172.23.91.125
6 4221890006 172.23.91.161
7 4221890007 172.23.91.65
8 4221890008 10.127.21.33

由于我采用了 BIRD 作为路由套件,我需要使用以下命令开启 Confederation:

confederation <对外 ASN>;

confederation member yes;

然后将本地 ASN 从 <对外 ASN> 改为 <内部 ASN>。这样形成一个效果:所有内部网络互相认为对方是外部网络,但遇到真正的外部网络时则团结在一起,表示自己是 <对外 ASN>。由于内部网络彼此认为对方是“外部网络”,因此不必担心真正外部网络的路由信息的传递。

效果

在正确设置好 BGP Confederation 后,可以在 Looking Glass 里面看到 内部 ASN 已经被括号标注:

参考资料

  1.  Bird 配置 BGP Confederation,及模拟 Confederation , Lantian, https://lantian.pub/article/modify-website/bird-confederation.lantian/