这篇文章算记录向,当然也有教学向用途,请酌情阅读。

本文中所有[]和<>在实际应用到配置文件的时候不需要保留!

本文随时改进。现处版本:3。

1
2
3
4
5
define OWNAS = [你的AS号,不带AS前缀];
define OWNIP = [你正在操作的机器的DN42 IP];
define OWNIPv6 = [你正在操作的机器的DN42 IPv6];
define OWNNET = [CIDR格式,你拥有的DN42 IP段];
define OWNNETv6 = [CIDR格式你拥有的DN42 IPv6段];

众所周知,咱最近几天沉迷于DN42网络无法自拔,Peer数量也是稳步增加。

但是这里有个问题,我一直没有把内网搞好。

前期一边继续扩展Peer一边尝试RouteReflector

结果RR死也配置不了,还造成了我心态崩掉直接重装所有系统的悲剧:

此条在DN42 Unofficial Telegram有记录,如果有看到的可以评论区说一下看到的感受)

于是乎就和AS4242421817进行了深入的意见交换

最终选定了babeld+iBGP FullMesh的组合方式

在本文开始之前,我想送给各位几句:

Peer和内网建设一定要并行!一定!一定!

莫相信某些人说的先把自己网路建设好再来!没有别人的路由表怎么设置都是摸瞎!

不要学我!不要学我!不!要!学!我!

我也是刚进入DN42的新人,难免有考虑不周,如有错误请直接指出!

babeld的设置

机器间可以不FullMesh,IGP会帮你的。

在正式跳入这个环节之前,先介绍一下几种IGP

对了如果你要喊“iBGP + eBGP Confederation YES”请立刻滚到下一章节

好了,继续。

在这部分开始之前,请检查好你是否已经在各机器间搭建好了WireGuard,保证各机器间能间接联通

以下配置文件由刚刚喊过“iBGP + eBGP Confederation YES”的 AS4242423743 写成,至于这位会不会礼貌我另说(

1
2
3
4
5
6
7
8
9
ipv6-subtrees true
random-id true
interface <> type tunnel faraway true max-rtt-penalty 128
in ip <OWNNET> allow
in ip <OWNNETv6> allow
in deny
redistribute ip <OWNNET> allow
redistribute ip <OWNNETv6> allow
redistribute deny

以下内容请酌情结合babeld(8) — babeld — Debian testing — Debian Manpages理解

1
2
ipv6-subtrees true
random-id true

分别是随机Ronter-ID和原生IPv6转发的设置,其实并不重要。

1
interface <> type tunnel faraway true max-rtt-penalty 128

上面的<>中填入你搭建的WireGuard的端口,如果你忘了的话,赶紧的ip a

type选项用来指定这一条连线的类型,虽然默认自行检测,但是还是建议指定为隧道(tunnel)类型

其他内容现在也并不重要,如果好奇可以继续去Manpage阅读。

1
2
3
4
5
6
in ip <OWNNET> allow
in ip <OWNNETv6> allow
in deny
redistribute ip <OWNNET> allow
redistribute ip <OWNNETv6> allow
redistribute deny

此段落用于过滤babeld应该使用的路由表。

在本例当中,很明显,我们只需要babeld去处理我们网内的路由,

所以我们用in和redistribute指定babeld管理我们拥有段的路由。

但实际上“管理”只是一个总称,实际上babeld做的事情很多,这个也可以到Manpage阅读。

将这一段内容部署在每一台内网的机器的/etc/babeld.conf里面,然后启动babeld服务。

喝口茶,然后通过ip route get [任何接入这个内网的服务器的DN42 IP],查看babeld是否生效。

这是没有上线的我家里用来登录DN42服务的N4节点,只有和N1的连接,但是也得到了到N2的路由表。

到现在,你应该可以在任何一个节点ping 这个网路上其他节点的DN42 IP/IPv6 了。我们继续。

bird2

上鸟!

我们以 DN42给出的Bird示例文档为基础改动配置文件。

以下配置文件,介绍由 AS4242421817 写成,本人进行了部分整理

增加部分:

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
protocol direct {
ipv4;
ipv6;
interface "[你用于连接内网的WireGuard统一前缀,如果没有就去掉通配符逐条添加]*";
};
template bgp dnnodes {
local as OWNAS;
path metric on;
med metric on;
multihop;
enable extended messages on;
ipv4 {
gateway recursive;
import all;
export filter {
if net ~ OWNNETSET then reject;
accept;
};
};
ipv6 {
gateway recursive;
import all;
export filter {
if net ~ OWNNETSETv6 then reject;
accept;
};
};
};

增删部分

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
31
32
33
protocol kernel {
scan time 20;
learn;
ipv6 {
import filter {
if net ~ OWNNETSETv6 then accept;
reject;
};
export filter {
if source = RTS_STATIC then reject;
if net ~ OWNNETSETv6 then reject;
krt_prefsrc = OWNIPv6;
accept;
};
};
};

protocol kernel {
scan time 20;
learn;
ipv4 {
import filter {
if net ~ OWNNETSET then accept;
reject;
};
export filter {
if source = RTS_STATIC then reject;
if net ~ OWNNETSET then reject;
krt_prefsrc = OWNIP;
accept;
};
};
}

简单来说,这一些增删

  • 定义了dnnodes这一IGP协议模板

  • 将与原来和Kernel打交道的地方加上了learn;,以将babeld帮我们寻好的路写到master表里面以供IGP使用。

在写出路由表的时候我们滤掉了我们IP段的内容,以避免bird包含内网信息,传到对端时和babeld打架导致babeld实例崩掉。

在没有正确配置的情况下随意开启对Kernel路由表的learn十分危险

这有可能造成路由劫持

虽然DN42内ROA已经基本覆盖但是还是小心为上

一些具体实例可见 《如何引爆 DN42 网络(2020-08-28 更新)》

而配置与各FullMesh时只需要:

1
2
3
protocol bgp [] from dnnodes {
neighbor [远端DN42 IP] as <OWNAS>;
};

继承模板,填上远端,用自己AS开IGP,然后就可以birdc c

再喝一口茶,用birdc s r for [任何一个peer的DN42 IP/IPv6] all

恭喜你!你已经完成了基于babeld和iBGP FullMesh的DN42 内网搭建。

一些下一步建议

日下部 詩, [2022-02-03 6:12 PM]
接下來還有個東西要弄,內網metrics

日下部 詩, [2022-02-03 6:12 PM]
假如你同時香港和usa都和我peer

日下部 詩, [2022-02-03 6:12 PM]
廣州節點要知道香港比較近,usa比較遠

日下部 詩, [2022-02-03 6:13 PM]
加拿大節點則是要知道usa比較近,hk比較遠

日下部 詩, [2022-02-03 6:13 PM]
babeld知道距離關係,但是bird不知道

日下部 詩, [2022-02-03 6:14 PM]
有幾個方法,直接在bird config裡面寫上cost

日下部 詩, [2022-02-03 6:17 PM]
首先babeld好像要打開
reflect-kernel-metric true

日下部 詩, [2022-02-03 6:18 PM]
讓babeld把cost寫入kernel

kernel路由表有一個metric屬性

kernel import filter補上

igp_metric = krt_metric;

(by AS4242421817)

祝你有一个美好的DN42旅途!

附录:《ufw会挡babeld这件事》

_Eden Johnson, [2022-02-09 3:02 AM]
woc我似乎发现问题可能出现的地方了

_Eden Johnson, [2022-02-09 3:02 AM]
我换掉RU依然没有反应

日下部 詩, [2022-02-09 3:02 AM]
[ 😮 Sticker ]

_Eden Johnson, [2022-02-09 3:02 AM]
然后我一看

_Eden Johnson, [2022-02-09 3:02 AM]
好家伙

_Eden Johnson, [2022-02-09 3:02 AM]
谢谢你Vultr

_Eden Johnson, [2022-02-09 3:02 AM]
你他妈给我开ufw我谢谢你

_Eden Johnson, [2022-02-09 3:02 AM]
[ 🌿 Sticker ]