DN42系列 0x02:Peering

先前说到了已经在DN42 Registry注册了AS和IP段,但在进行Peer前,网络还没有到DN42的路由,而进行Peering需要另外的一套协议和机制。

查找 Peer

DN42 提供了一个 交友平台 Peer Finder 来查找最近的 Peer,只需要在上面输入需要 Peer 的服务器公网 IP,在等待一阵后就能找到 DN42 网络内最近的节点(ping 值最低),并提供了联系方式。

在接下来的章节内也会提到如何在自己的服务器上部署 Peer Finder 的客户端。

配置 WireGuard

WireGuard 是一个基于 Linux 内核实现的 VPN,具有快速、高效的特点。在 DN42 里被大多数 Peering 所使用。

一般安装

在安装 Debian 10 的服务器上进行操作,只需要安装 wireguard-dkmswireguard-tools 即可。

OpenVZ 安装

由于OpenVZ的虚拟化特性,虚拟机无法安装内核模块,可参照以下文章进行安装:

生成密钥

通过以下方式可以生成一对公钥/私钥,放置在当前文件夹:

1
wg genkey | tee wg-private.key | wg pubkey > wg-public.key

交换参数

通常一次 Peer 会把隧道、IP、BGP参数都同时提前进行交换,但这里为了保持文章的连贯性,会将隧道与 BGP 部分分开。

欲成功建立 WireGuard 隧道,需要双方交换以下几个东西:

  • 隧道的地址(通常是希望进行 Peer 的服务器公网 IP 地址及 WireGuard 端口号)
  • 隧道终结点,即双方为隧道分配的 DN42 IP 地址
  • 此外,若需建立 IPv6 隧道,需要再提供一个 link-local IPv6 地址

systemd-networkd

在服务的管理上,我自信地采用了 systemd-networkd(部分发行版可能需要手动安装)。

根据 Debian Wiki 上的介绍,对于每个接口,均需要创建一个 .netdev.network 文件。

/etc/systemd/network/wgi0.netdev

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[NetDev]
Name=<接口名称>
Kind=wireguard
Description=Wireguard Network

[WireGuard]
PrivateKey={私钥}
ListenPort={本地端口}

[WireGuardPeer]
PublicKey={对方公钥}
AllowedIPs=172.20.0.0/14
AllowedIPs=fd00::/8
Endpoint={对方公网IP}:{对方端口}

/etc/systemd/network/wgi0.network

1
2
3
4
5
6
7
8
9
10
11
12
13
[Match]
Name = {接口名称}

[Address]
Address = {隧道对端IPv4}/32
Peer = {隧道本地IPv4}/32

[Address]
Address = {隧道对端IPv6}/128
Peer = {隧道本地IPv6}/128

[Address]
Address = {link-local地址}

在完成上述步骤后,使用 systemctl restart systemd-networkd 即可完成配置。若需进行测试,直接 ping 隧道对端 IP 即可。

配置 BIRD

BIRD 是一种开源实现,用于在类似 Unix 的操作系统上路由 Internet 协议数据包。它是作为布拉格查尔斯大学数学与物理学院的一个学校项目开发的,并根据 GNU 通用公共许可证发行。 BIRD 通过运行单独的守护程序来支持 Internet 协议版本 4 和版本 6。
– Wikipedia: Bird Internet routing daemon

总而言之,BIRD 是一个路由软件。由于使用的服务器均没有类似于 Arch 的发行版,所有安装的版本均为 1.6。

基本配置

DN42 在网站上提供了一个 模板配置文件

/etc/bird/bird.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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
protocol device {
scan time 10; # 扫描周期 10 秒
}

protocol static {
route 172.20.158.128/26 via 172.20.158.130;
route 172.20.168.128/25 via 172.20.158.130;
# 宣告两个 IPv4 段的路由
import all;
export none;
};

include "/etc/bird/local4.conf"; # 本地的配置文件,每个服务器均不相同

##include "/etc/bird/filter4.conf"; # IPv4 的路由过滤规则文件,暂不使用

protocol kernel {
scan time 20;
import none;
export filter {
if source = RTS_STATIC then reject; # 如果有隧道连接被断开,则 reject 该条路由
krt_prefsrc = OWNIP; # 使用指定的 IP 作为源 IP
accept;
};
};

# DN42 BGP 模板
template bgp dnpeers {
local as OWNAS;
path metric 1; # 单跳即可连接
import keep filtered; # 保留被过滤路由,方便检查
import filter {
if is_valid_network() && !is_self_net() then {
accept; # 仅接受属于 DN42 网络且不是自身网络的路由
}
reject;
};
export filter {
if is_valid_network() then {
accept; # 仅导出属于 DN42 网络的路由
}
reject;
};
import limit 1000 action block; # 仅接受最大 1000 条路由
};

include "/etc/bird/peers4/*"; # 加载 BGP 配置文件
include "/etc/bird/ospf4/*"; # 加载 OSPF 配置文件

IPv6 的配置文件 /etc/bird/bird6.conf 与上述内容大同小异。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
router id 172.20.158.130;  # 路由器 ID,通常以 IP 地址命名

define OWNAS = 4242421331; # 自身的 ASN
define OWNIP = 172.20.158.130; # 自身的 IP 地址

function is_self_net() { # 检验是否位于自身网络中
return net ~ [172.20.158.128/26+,172.20.168.128/25+];
}

function is_valid_network() { # 检验是否在 DN42 网络中
return net ~ [
172.20.0.0/14{21,29}, # dn42
172.20.0.0/24{28,32}, # dn42 Anycast
172.21.0.0/24{28,32}, # dn42 Anycast
172.22.0.0/24{28,32}, # dn42 Anycast
172.23.0.0/24{28,32}, # dn42 Anycast
172.31.0.0/16+, # ChaosVPN
10.100.0.0/14+, # ChaosVPN
10.0.0.0/8{15,24} # Freifunk.net
];
}

IPv6 的配置文件 /etc/bird/local6.conf 与上述内容大同小异。

在完成后,使用 systemd 可以启动这 IPv4 和 IPv6 的服务(不要忘记 enable):

1
2
systemctl start bird
systemctl start bird6

Peering 配置

完成一次 BGP Peering,需要双方交换以下内容:

  • 双方的 ASN

完成交换后,即可在 /etc/bird/peers4 和/或 /etc/bird/peers6 中加入以下文件内容

/etc/bird/peers{4,6}/{NAME}

1
2
3
4
protocol bgp <NAME> from dnpeers {
neighbor {隧道对端 IP} as {对方 ASN};
# neighbor {IPv6 link-local IP} % '{接口名称}' as {对方 ASN}; # 这是使用 link-local 方式进行 IPv6 Peering 的配置
};

之后,使用 birdc configure 和/或 birdc6 configure 重载配置。

使用 birdc show protocol 和/或 birdc6 show protocol 查看状态,如果一切配置正常,即可看到状态是 Established。

等待一段时间后,在 nixnodes 的 DN42 网络地图 上可以看到一条 Link 已经建立。


以上就是建立 BGP Peer 的一般步骤,在 AS 内部也可以使用(双方具有相同 ASN)。

以下是目前由我负责的 Niantic Network 的 Peering 联系方式:

  • 邮件: dn42@strexp.net / Charles@0x7f.cc
  • ASN: AS424242 1331
  • IP: 172.20.158.128/26 (骨干网)
  • Peer Finder 对应: Ox7f (IRC)
  • 在下一章节,将会建立 Peer Finder 客户端和 Looking Glass 服务,这将成为首批对外提供的服务。