警告:
本人只是一名高三学生,在此之前对于BGP等技术一无所知,因此,本文可能包含但不限于 笔误/错误/小白理解 请大佬勿喷,如果能指正出来那就更好啦

再次警告:
如果您能接受的话,可以继续看下去,如果不能接受,建议现在就关闭此文章


前言

之前的文章中,我们注册了ASN,并与他人peer,同时组建了iBGP网络.但是传统的iBGP有一个巨大(我觉得)的局限性,那就是接入网的任意两台服务器都必须两两打通隧道,组成fullmesh网络.
随着我接入DN42的设备变得越来越多,fullmesh网络的弊端越来越明显,它需要大量的隧道(n*(n-1)/2条),而一条隧道需要2个配置文件,即使使用了python辅助生成配置文件,这仍然是一项大工程.
而且,为了避免可能的问题,我的CN服务器与Global服务需要尽可能的隔离,这样一来,fullmesh就无法组成了,为了解决这个问题,我们就需要引入动态路由.

什么是动态路由?

动态路由是一种网络技术,它让路由器能够自动地学习、更新并共享网络路径信息。与需要手动配置路由的静态路由不同,动态路由协议让路由器能够适应网络的变化,从而实现更灵活、更高效的数据传输。

如何配置动态路由?

根据网络规模和需求,选择合适的动态路由协议(如 OSPF 适用于大型网络,RIP 适用于小型网络),并编写对应的配置文件。

开始配置动态路由!

选择合适的协议

实现动态路由的协议有很多, 例如: OSPF,IS-IS,EIGRP,RIP,Babeld等.
我们应该选择哪种呢?
在DN42中,我见过最多的便是OSPF和Babel,我使用的是Babel,它的配置真的太简单了.(其实是OSPF试了三次没一次成功)

什么是Babel?

Babel 是一种先进的距离矢量路由协议,专为动态且可能不可靠的网络环境设计,例如无线网状网络。它通过快速收敛、避免路由循环以及灵活的度量值计算(如考虑无线链路质量)来确保路由的稳健性。Babel 同时支持 IPv4 和 IPv6,使其成为去中心化、自组织网络中高效、适应性强的路由解决方案。

1.修改bird.conf

首先,我们要在bird.conf中插入Babel的配置,我使用include外部文件实现,在bird.conf文件的末尾, include '/etc/bird/peer/*'与ibgp前,插入include '/etc/bird/babel.conf'

2.编写配置文件

在我的网络中,iBGP都是以 iBGP(Global间互通) / CN_iBGP(CN服务器) / Global_IBGP(CN向Global) 开头

我的/etc/bird/babel.conf如下,请按照自己的实际情况进行修改.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    protocol direct {
ipv4;
ipv6;
interface "dn42-dummy";
};

protocol babel int_babel {
ipv4 {
import where source != RTS_BGP && is_self_net();
export where source != RTS_BGP && is_self_net();
};
ipv6 {
import where source != RTS_BGP && is_self_net_v6();
export where source != RTS_BGP && is_self_net_v6();
};
interface "CN_IBGP*" {};
interface "IBGP*" {};
};
```
在配置文件中,我并没有设置每个接口的```rxcost```,因为Babeld可以动态的设置它的值,如需设置,可以在```interface```后面的花括号中添加,例如:
>interface "IBGP*" {
>rxcost 40;
>};

## 3.确认dn42-dummy接口
在DN42的[官方文档](https://dn42.dev/howto/Bird2)中,我们添加了一个```dn42-dummy interface```
>```conf
>ip link add dn42-dummy type dummy
>ip link set dev dn42-dummy up
>ip addr add dev dn42-dummy <router ip>/<subnet>

tips: 服务器的DN42 IPv4和DN42 IPv6都要绑定上去

如果你的dn42-dummy interface无误,那么便可以进行下一步了

4.修改iBGP对应WireGuard隧道的conf文件

提示:
因为我们将DN42的IP绑定到了dn42-dummy端口上,在iBGP的连接中,我们便不能使用这些ip,因此我们需要找一个不在DN42的IP范围内的IP段作为本地IP.

在Part2中,我们的配置文件是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Interface]
PrivateKey = 我的私钥
ListenPort = 监听端口 #通常为对端ASN后5位
Table = off #一定要加
PostUp = ip addr add 本地IPv6 Link-local地址 dev %i
PostUp = ip addr add 本端DN42的ipv6 dev %i
PostUp = ip addr add 本端DN42的ipv4 dev %i
PostUp = sysctl -w net.ipv6.conf.%i.autoconf=0

[Peer]
PublicKey = 对端公钥
Endpoint= 对端公网接入点
AllowedIPs = 10.0.0.0/8, 172.20.0.0/14, 172.31.0.0/16, fd00::/8, fe80::/64 #DN42的网络范围

现在,我们需要修改一部分内容(关于DN42 IP的内容),修改后的文件长这样:

1
2
3
4
5
6
7
8
9
10
11
[Interface]
PrivateKey = 我的私钥
ListenPort = 监听端口 #通常为对端ASN后5位
Table = off #一定要加
Address = 本地IP, 本地IPv6 Link-local地址 # eg.192.70.0.2, fe80::0070:2/64
PostUp = sysctl -w net.ipv6.conf.%i.autoconf=0

[Peer]
PublicKey = 对端公钥
Endpoint= 对端公网接入点
AllowedIPs = 10.0.0.0/8, 172.20.0.0/14, 172.31.0.0/16, fd00::/8, fe80::/64 #DN42的网络范围

修改完成保存后,使用wg-quick down 接口名称 && wg-quick up 接口名称重启隧道,你可以使用birdc show protocols all int_babelbirdc show route protocol int_babel all查看信息以确认是否成功配置.

5.推广到整个内网

一旦确认部署完成,你便可以在你所有节点上部署!从而实现网络的高可用性

参考文献

感谢以下文章对本小白踏入 DN42 提供了巨大的帮助!
DN42 实验网络介绍(2020 版)
BIRD 与 BGP 的新手开场
Multiple servers on dn42: iBGP and IGPs
萌新入坑 DN42 之 —— 多服务器互联