前言
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),用它来识别敌我。
- 假设我们有如下的网络拓扑:
- 其中 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
。
- B:
- 此时 C 在发送给 E 路由信息时,删掉了 AS2 内部 Confederation 的路径,替换成
AS2
这样一个整体的编号。- E:
AS3 -> AS2 -> AS1
。
- E:
- 如果天灾降临,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 已经被括号标注:
Table master4: 172.20.***.***/26 unicast [IBGP_CORE 20:55:52.118] * (100) [AS********88i] via 172.23.91.** on ****** Type: BGP univ BGP.origin: IGP BGP.as_path: (4221890001 4221890003) ********88 ********88 BGP.next_hop: 172.23.91.** BGP.local_pref: 1650 BGP.community: (64511,1) (64511,24) (64511,33) BGP.large_community: (********88, 1, 190)
参考资料
- Bird 配置 BGP Confederation,及模拟 Confederation , Lantian, https://lantian.pub/article/modify-website/bird-confederation.lantian/
Leave a Reply