DN42网络入坑指南

本文最后更新于 2026年4月18日 晚上

DN42网络入坑指南

DN42是什么

DN42 全称 Decentralized Network 42(42 号去中心网络),是一个大型、去中心化的 VPN 网络。但是与其它传统 VPN 不同的是,DN42 本身不提供 VPN 出口服务,即不提供规避网络审查、流媒体解锁等类似服务。相反,DN42 的目的是模拟一个互联网。它使用了大量在目前互联网骨干上应用的技术(例如 BGP 和递归 DNS),可以很好地模拟一个真实的网络环境。

简而言之,DN42:

不适合单纯想要保护隐私、规避网络审查的用户
不适合在网内消耗大量流量,例如用于解锁流媒体服务的用户
适合想要研究网络技术,练习服务器、路由器等网络设备配置,甚至后续在真实互联网建立 AS 的用户
适合拥有真实 AS,但担心自己配置错误广播出错误路由、干掉半个互联网,希望有个地方测试的用户。
正因为此,使用 DN42 的门槛比较高。就像在真实互联网中一样,你要扮演一个 ISP(互联网服务提供商),注册自己的个人信息,ASN 号码,IPv4 和 IPv6 的地址池,并且使用 BGP 在自己的服务器上广播它们。你还要和其它的用户联系,和他们做 Peering(对接),一步步进入完整的 DN42 网络。

DN42 在 172.20.0.0/14 和 fd00::/8 上运行,而这两个 IP 段都是分配给内网使用的。换句话说,你在 DN42 上怎么折腾,都不会影响到服务器其它的互联网连接。

准备

加入DN42网络需要您有以下的相关能力:

  • 一个长期在线的Linux机器(电脑,服务器、ECS云服务器、VPS、NAS甚至路由器(OpenWrt)都行)
  • 使用Linux的能力,常用命令,会使用至少一个编辑器(图形化的 gedit、vscode,或者命令行的 vim、nano 都可以)
  • 会用Git(会Clone,Pull,Push,Commit就行)
  • 了解网络知识(知道IP、MAC是啥,知道交换机和路由器都是干啥的,会ping/traceroute)
  • 能看懂英文(会用翻译软也行)
  • 有耐心

如果您不具备上述能力,您可能在配置过程中出现问题,给DN42中的其他用户带来麻烦。

注册流程

DN42 的 Gitea 地址为 https://git.dn42.dev

按照平常你在其他网站注册的思路,在 DN42 的 Gitea 注册一个账号,很简单

然后,从 DN42 主仓库 Fork 一份到自己的账号上,比如:

https://git.dn42.dev/YourUserName/registry

生成 GPG 密钥

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
gpg --full-generate-key
请选择您要使用的密钥类型:
(1) RSA 和 RSA
(2) DSA 和 Elgamal
(3) DSA(仅用于签名)
(4) RSA(仅用于签名)
(9) ECC(签名和加密) *默认*
(10) ECC(仅用于签名)
14)卡中现有密钥
您的选择是?
请选择您想要使用的椭圆曲线:
(1) Curve 25519 *默认*
(4) NIST P-384
(6) Brainpool P-256
您的选择是?
请设定这个密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)
密钥永远不会过期
这些内容正确吗? (y/N) y

GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名: BioniCosmos
电子邮件地址: admin@moecm.com
注释:
您选定了此用户标识:
“BioniCosmos <admin@moecm.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? O

真实姓名(用户名)和电子邮件地址使用 DN42 GIT 上的注册信息,其他保持默认。

填写后会要求设定 GPG 密钥的验证密码。

1
2
3
4
5
gpg --list-secret-keys --keyid-format=long
sec ed25519/03E84B5D8BC9255E 2022-03-30 [SC]
209A091A4428B203E77F212803E84B5D8BC9255E
uid [ 绝对 ] BioniCosmos <admin@moecm.com>
ssb cv25519/A45FFAC1025F5497 2022-03-30 [E]

我们记第一行中的 03E84B5D8BC9255E 为 GPG 密钥 ID,第二行的字符串为 GPG 密钥指纹

贴下面的文本(替换为您要使用的 GPG 密钥 ID)。 在本例中,GPG 密钥 ID 为 3AA5C34371567BD2:

1
gpg --armor --export  03E84B5D8BC9255E

复制以 —–BEGIN PGP PUBLIC KEY BLOCK—– 开头并以 —–END PGP PUBLIC KEY BLOCK—– 结尾的 GPG 密钥。

并在 DN42 Gitea Setting 导入自己的 PGP 密钥

PS: 注意是 管理 GPG 密钥 不是 管理 SSH 密钥

你还需要将你的 GPG 公钥上传到公共查询服务器,称为 Keyserver。

1
gpg --keyserver hkp://keyserver.ubuntu.com --send-key [密钥ID]

添加 SSH KEY

这一步和其他的 Git 服务都差不多,在本地生成好公钥与密钥并直接导入 DN42 Gitea Setting 即可

1
ssh-keygen -C [YourEmail]

一路回车

随后,在 ~/.ssh/id_[加密].pub 储存着你的公钥,将其导入 DN42 Gitea Setting

1
cat /home/UserName/.ssh/id_ed25519.pub

PS: 注意是 管理 SSH 密钥 不是 管理 GPG 密钥

将 Fork 的仓库 Clone 到本地

将你刚才 Fork 的仓库 Clone 到本地,比如我的 Clone 链接就是 git@git.dn42.dev:GenshinMinecraft/registry.git

1
git clone git@git.dn42.dev:YourUsername/registry.git && cd registry

填写注册文件

注意:

以下所有操作需在克隆下来的 Git 仓库(文件夹)registry 内进行。
文件中每一项的值都应该从第 20 列开始填写。
文件中所有空白分隔处应使用空格填充而非 tab。

详细内容参考

https://lantian.pub/article/modify-website/dn42-experimental-network-2020.lantian/

提交

1
2
3
4
5
6
项目包含多个脚本,可检查格式是否正确\合并提交\签名:
fmt-my-stuff <FOO>-MNT自动修复轻微的格式错误
check-my-stuff <FOO>-MNT:根据注册表架构验证您的对象
check-pol origin/master <FOO>-MNT检查是否存在违反政策的行为
squash-my-commits自动更新并合并本地提交
sign-my-commit使用 PGP 密钥或标准 SSH 签名对您的提交进行签名

恭喜你创建完了所有需要的文件,接下来 cd 到 Git 仓库的根目录,执行一次 git add .,然后执行 git commit -S,使用你先前创建的 GPG 密钥,创建一份带 GPG 签名的 commit

  • 如果你操作快已经 commit 完了,你可以执行 git commit --amend -S 修改之前的 commit,将其签名。

然后执行

1
2
./squash-my-commits
git push -f

其中,./squash-my-commits 的作用为合并 Commits,因为 DN42 要求必须在同一个 Commit 内完成所有的操作。

随后,回到 DN42 Gitea,在官方仓库 PR 界面创建一个 PR 提交

  • 如果你的操作或者填写的内容有问题,管理员会回复你的 Pull Request,根据他们的要求修改即可。
  • 但注意,按照要求修改完成后,**不用关闭原先的 Pull Request 再重新开一个。**你只需要照常 git commitgit push -f,你后续的变更会被自动添加到原先这个 Pull Request 里。
    • 一次注册/修改信息行为只需要发一个 Pull Request 就够了。
  • 发 Pull Request 请用英文!

之后耐心等待人工审核,在这期间好好睡上一觉,醒来后 PR 就会被合并啦。(或者被要求修改错误。)

在您的PR被合并之后,您就拥有了自己的AS和地址块,接下来就可以去找人Peer了

网络配置

在机器上安装好必要依赖

本文以 Debian 系列系统作为演示

本文以 Debian 系列系统作为演示,其他系统自己看着办

1
apt install bird2 wireguard

随后,生成 WireGuard 的 公钥以及密钥

1
wg genkey | tee privatekey | wg pubkey > publickey

打开 Kernel 中的数据包 Forward 功能,关闭 Kernel 中的 rp_filter 严格模式

1
2
3
4
5
6
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.forwarding=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
echo "net.ipv4.conf.default.rp_filter=0" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.rp_filter=0" >> /etc/sysctl.conf
sysctl -p

在 Potat0 机器人创建 Peer 信息

本文采用了 DN42 中的热心人 Potat0 创建的 Bot 来进行配网,非常感谢 Ta 的付出

转到 Telegram:@Potat0_DN42_Bot

登录
确认ASN

发送 ‘/login’ 以登录你的 ASN

1
2
3
Enter your ASN, without prefix AS
请输入你的 ASN,不要加 AS 前缀
4242420223
通过邮箱验证

随后通过邮箱验证

1
2
3
4
5
6
7
8
9
Select the email address to receive the verification code.
选择接收验证码的邮箱。
admin@huangetech.com
Verification code has been sent to your email.
验证码已发送至您的邮箱。
Please contact @Potat00000 if you can not receive it.
如果无法收到请联系 @Potat00000
Enter your verification code:
请输入验证码:

然后在邮箱等待验证码,发送回 Bot

1
2
欢迎你!
HUANGETECH AS4242420223
创建一个 Peer

对 Bot 发送 /peer

选择一个节点
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
You will peer with me through the following identity:  
你将通过以下身份与我 Peer:

AS4242420223


If it is wrong, please use /cancel to interrupt the operation.
如果有误请输入 /cancel 终止操作。

Any problems with the AutoPeer process, please contact @Potat00000
AutoPeer 过程中产生任何问题,请联系 @Potat00000

Node List 节点列表
-

US1 | Las Vegas, USA | BuyVM


✔️ Open For Peer
✔️ Capacity: 52 / Unlimited
✔️ IPv4: Yes
✔️ IPv6: Yes

-

HK1 | Hong Kong | Skywolf


✔️ Open For Peer
✔️ Capacity: 41 / Unlimited
✔️ IPv4: Yes
✔️ IPv6: Yes

-

NO1 | Sandefjord, Norway | Terrahost


✔️ Open For Peer
✔️ Capacity: 27 / Unlimited
✔️ IPv4: Yes
✔️ IPv6: Yes

Which node do you want to choose?
你想选择哪个节点?
US1 | Las Vegas, USA | BuyVM
配置 DN42 内网 IP
1
2
3
4
5
What routes do you want to transmit with me?  
你想和我传递哪些路由?
IPv4 only
Input your DN42 IPv4 address, without /L suffix.
请输入你的 DN42 IPv4 地址,不包含 /L 后缀。

然后,在你的 IP 段内挑选一个 IP,请注意,IP 段中的第一个 IP 以及最后一个 IP 都是不可用

比如我挑选了 172.21.70.18 ,发送给 Bot

1
172.21.70.18
配置公网 IP && Port
1
2
3
4
5
6
7
8
Input your clearnet address for WireGuard tunnel, without port.  
请输入你用于 WireGurad 隧道的公网地址,不包含端口。

You can use IPv4 or IPv6 to establish a tunnel with me.
你可以使用 IPv4 或者 IPv6 与我建立隧道。

If you don't have a static clearnet address or is behind NAT, please contact @Potat00000
如果你没有静态公网地址,或你的服务器在 NAT 网络中,请联系 @Potat00000

然后输入你的公网地址,可以是域名,也可以是 IP,当然也允许 IPv6

为了隐私,我把我的 IP 打码了

1
2
3
xx.xx.xx.xx
Input your port for WireGuard tunnel.
请输入你用于 WireGurad 隧道的端口。

选择一个 你具有完全访问权限的端口,为什么要着重说出来呢,主要是部分 Nat 机器只有一定数量的端口,非全端口,只能选择暴露在公网的端口

一般来说,DN42 使用的 WireGuard 端口都是以 2[ASN 后四位] 来编写的,不过是可以自定义的,这只是一个习惯,比如我的第一个端口就为 21304

WireGuard 公钥
1
2
Input your WireGuard public key  
请输入你的 WireGuard 公钥

这个公钥储存在上方生成的 publickey 文件中,复制粘贴过来即可

为了隐私,我还是乱打(

1
xxxxxxxxxxxxxxxxxxxxxxxx
联系方式
1
2
3
Input your contact information (Telegram or Email)  
请输入你的联系方式(Telegram 或 Email)
@C1oudF1are

这部分写可以联系到自己的即可,问题不大

确认信息并建立
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
Please check all your information  
请确认你的信息


Region:
US1 | Las Vegas, USA | BuyVM
Basic:
ASN: 4242420223
Channel: IPv4 only
MP-BGP: Not supported
IPv6: Not enabled
IPv4: 172.21.70.18
Request-LLA: Not required due to not use LLA as IPv6
Tunnel:
Endpoint: xx.xx.xx.xx:20223
PublicKey: xxxxxxxxxxxxxxxxxxxxxxxx
Contact:
admin@huangetech.com


Please enter an yes to confirm. All other inputs indicate the cancellation of the operation.
确认无误请输入 yes,所有其他输入表示取消操作。
yes
Peer has been created
Peer 已建立
获取 Peer Info

向机器人发送 `/info

这样就算完成了 Peer 的建立,接下来就是配置你自己机器的环境咯!

配置 WireGuard

编写配置文件

这个配置当然是有模板的

配置文件一般储存于 /etc/wireguard/xxx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Interface]
PrivateKey = <自己的私钥>
ListenPort = <自己监听的端口,一般是对方ASN后五位>
PostUp = ip addr add <你的DN42 IPv4>/32 peer <对方的DN42 IPv4>/32 dev %i
# 如果用 IPv6 ULA
# PostUp = ip addr add <你的DN42 IPv6>/128 peer <对方的DN42 IPv6>/128 dev %i
# 如果用 link-local(推荐)
PostUp = ip addr add <link-local>/64 dev %i
Table = off

[Peer]
PublicKey = <对方的公钥>
Endpoint = <对方的公网地址>:<对方的端口,一般是自己ASN后五位>
AllowedIPs = 10.0.0.0/8, 172.20.0.0/14, 172.31.0.0/16, fd00::/8, fe80::/64

注意这里 Table = off 要加上,不然所有的流量,包括公网上的流量就都转发给你的 peer 了,这样可能你就连自己的机器都连不上了。

这里一般推荐用 link-local 地址 进行配置,除非双方约定好是用 ULA。

链路本地地址: IPv6 定义在 fe80::/10 地址块。一般就是 fe80::<你的ASN后四位>

potat0配置文件 /etc/wireguard/potat0.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Interface]
# 你的 WireGuard 私钥,存储于上方生成 privitekey 文件中
PrivateKey = [PrivateKey]

# 你的端口号,上方输入的公网 IP 与公网端口
ListenPort = [Port]
Table = off

# 第一个是你的 DN42 内的 IP,第二个是我的(或者你的 Peer 的)
PostUp = ip addr add [你的 DN42 IP] peer [Potat0 的 DN42 IP] dev %i
PostUp = sysctl -w net.ipv6.conf.%i.autoconf=0

[Peer]
PublicKey = [Potat0 的公钥]
Endpoint = [Potat0 的公网服务器 IP:Port]

AllowedIPs = 10.0.0.0/8, 172.20.0.0/14, 172.31.0.0/16, fd00::/8, fe80::/64

配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Interface]
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxx

ListenPort = 20223
Table = off

PostUp = ip addr add 172.21.70.18 peer 172.23.246.3 dev %i
PostUp = sysctl -w net.ipv6.conf.%i.autoconf=0

[Peer]
PublicKey = LUwqKS6QrCPv510Pwt1eAIiHACYDsbMjrkrbGTJfviU=
Endpoint = las.node.potat0.cc:20223

AllowedIPs = 10.0.0.0/8, 172.20.0.0/14, 172.31.0.0/16, fd00::/8, fe80::/64

这些配置,均可从上方的 Info 信息中获取到,编辑完保存并退出

开启 WireGuard 隧道
1
wg-quick up potat0

当无报错输出时,即为配置成功

1
2
3
4
5
6
[#] ip link add potat0 type wireguard
[#] wg setconf potat0 /dev/fd/63
[#] ip link set mtu 2720 up dev potato
[#] ip addr add [你的 DN42 IP] peer [Potat0 的 DN42 IP] dev potat0
[#] sysctl -w net.ipv6.conf.potat0.autoconf=0
net.ipv6.conf.potato.autoconf = 0
关闭 WireGuard 隧道
1
wg-quick down potat0
检查连接

你可以使用 wg 命令来查看目前所有运行着的隧道

如需开机自启,可以在测试无误后执行 systemctl enable wg-quick@<隧道名>

在目前,你可以通过 Ping Potat0 DN42 IP 的方式来检查是否已经通过 WireGuard 连接到 Potat0 的服务器

1
2
3
4
5
6
ping 172.23.246.4
PING 172.23.246.3 (172.23.246.4) 56(84) bytes of data.
64 bytes from 172.23.246.3: icmp_seq=1 ttl=64 time=428 ms
64 bytes from 172.23.246.3: icmp_seq=2 ttl=64 time=441 ms
64 bytes from 172.23.246.3: icmp_seq=3 ttl=64 time=417 ms
64 bytes from 172.23.246.3: icmp_seq=4 ttl=64 time=407 ms

有正常返回,说明是正常的。但这不代表你已经完全融入了 DN42,这只不过是你与 Potat0 建立了一个 VPN 而已

配置 Bird2

终于到本文章的重头戏了,Bird2 的配置是在 DN42 路上最难的一个部分,你需要对 BGP、路由等知识有最浅的了解

下载 Roa 文件

这个文件,主要是类似于分流的,如果你不了解,请谷歌

如果你认为没有必要去了解,直接运行以下命令就行

1
2
3
4
wget -4 -O /tmp/dn42_roa.conf https://dn42.burble.com/roa/dn42_roa_bird2_4.conf && mv -f /tmp/dn42_roa.conf /etc/bird/dn42_roa.conf
wget -4 -O /tmp/dn42_roa_v6.conf https://dn42.burble.com/roa/dn42_roa_bird2_6.conf && mv -f /tmp/dn42_roa_v6.conf /etc/bird/dn42_roa_v6.conf
mv /etc/bird/dn42_roa_v6.conf /etc/bird/roa_dn42_v6.conf
mv /etc/bird/dn42_roa.conf /etc/bird/roa_dn42.conf

该脚本来自于 High Ping Network 的小伙伴 sam,懒得改了,复制粘贴就能用不是很爽吗

加入定时任务,设置为每小时运行一次,否则不会更新到最新的 ROA ,每次更新后都需要使用 birdc c 命令重载 BIRD 配置。

1
crontab -e
1
0 * * * * wget -4 -q -O /tmp/dn42_roa.conf https://dn42.burble.com/roa/dn42_roa_bird2_4.conf && mv -f /tmp/dn42_roa.conf /etc/bird/dn42_roa.conf && wget -4 -q -O /tmp/dn42_roa_v6.conf https://dn42.burble.com/roa/dn42_roa_bird2_6.conf && mv -f /tmp/dn42_roa_v6.conf /etc/bird/dn42_roa_v6.conf && birdc configure
1
crontab -l
编写 Bird2 主配置文件

Bird2 的主配置文件默认放在 /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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
define OWNAS       = <AS 号>;
define OWNIP = <DN42 IPv4 地址>;
define OWNIPv6 = <DN42 IPv6 地址>;
define OWNNET = <DN42 IPv4 地址块, CIDR 格式>;
define OWNNETv6 = <DN42 IPv6 地址块, CIDR 格式>;
define OWNNETSET = [ <DN42 IPv4 地址块, CIDR 格式>+ ];
define OWNNETSETv6 = [ <DN42 IPv6 地址块, CIDR 格式>+ ];

router id OWNIP;

protocol device {
scan time 10;
}

function is_self_net() {
return net ~ OWNNETSET;
}

function is_self_net_v6() {
return net ~ OWNNETSETv6;
}

function is_valid_network() {
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.127.0.0/16{16,32}, # neonetwork
10.0.0.0/8{15,24} # Freifunk.net
];
}

roa4 table dn42_roa;
roa6 table dn42_roa_v6;

protocol static {
roa4 { table dn42_roa; };
include "/etc/bird/roa_dn42.conf";
};

protocol static {
roa6 { table dn42_roa_v6; };
include "/etc/bird/roa_dn42_v6.conf";
};

function is_valid_network_v6() {
return net ~ [
fd00::/8{44,64} # ULA address space as per RFC 4193
];
}

protocol kernel {
scan time 20;

ipv6 {
import none;
export filter {
if source = RTS_STATIC then reject;
krt_prefsrc = OWNIPv6;
accept;
};
};
};

protocol kernel {
scan time 20;

ipv4 {
import none;
export filter {
if source = RTS_STATIC then reject;
krt_prefsrc = OWNIP;
accept;
};
};
}

protocol static {
route OWNNET reject;

ipv4 {
import all;
export none;
};
}

protocol static {
route OWNNETv6 reject;

ipv6 {
import all;
export none;
};
}

template bgp dnpeers {
local as OWNAS;
path metric 1;

ipv4 {
import filter {
if is_valid_network() && !is_self_net() then {
if (roa_check(dn42_roa, net, bgp_path.last) != ROA_VALID) then {
print "[dn42] ROA check failed for ", net, " ASN ", bgp_path.last;
reject;
}
accept;
}
reject;
};

export filter {
if is_valid_network() && source ~ [RTS_STATIC, RTS_BGP] then accept;
reject;
};
import limit 1000 action block;
};

ipv6 {
import filter {
if is_valid_network_v6() && !is_self_net_v6() then {
if (roa_check(dn42_roa_v6, net, bgp_path.last) != ROA_VALID) then {
print "[dn42] ROA check failed for ", net, " ASN ", bgp_path.last;
reject;
}
accept;
}
reject;
};
export filter {
if is_valid_network_v6() && source ~ [RTS_STATIC, RTS_BGP] then accept;
reject;
};
import limit 1000 action block;
};
}


include "/etc/bird/peers/*";

你要修改的内容

1
2
3
4
5
6
7
define OWNAS       = <AS 号>;
define OWNIP = <DN42 IPv4 地址>;
define OWNIPv6 = <DN42 IPv6 地址>;
define OWNNET = <DN42 IPv4 地址块, CIDR 格式>;
define OWNNETv6 = <DN42 IPv6 地址块, CIDR 格式>;
define OWNNETSET = [ <DN42 IPv4 地址块, CIDR 格式>+ ];
define OWNNETSETv6 = [ <DN42 IPv6 地址块, CIDR 格式>+ ];

参阅: https://bird.xmsl.dev/docs/user-guide/3-1-introduction.html

设置对等节点

请注意:本节假设您已经建立了与对等伙伴之间的WG隧道。

首先,创建 /etc/bird/peers 目录:

1
mkdir -p /etc/bird/peers

每个对等体可以使用不同的方法建立对等连接。最常见的方法是建立两个独立的会话,一个用于 IPv4,一个用于 IPv6;或者使用具有扩展下一跳的多协议 BGP,如下文详述。

/etc/bird/peers/<NEIGHBOR>.conf对于具有独立 BGP 会话的情况

1
2
3
4
5
6
7
8
9
10
protocol bgp <NEIGHBOR_NAME> from dnpeers {
neighbor <NEIGHBOR_IP> as <NEIGHBOR_ASN>;
}

protocol bgp <NEIGHBOR_NAME>_v6 from dnpeers {
neighbor <NEIGHBOR_IPv6>%<NEIGHBOR_INTERFACE> as <NEIGHBOR_ASN>;
# Or:
# neighbor <NEIGHBOR_IPv6> as <NEIGHBOR_ASN>;
# interface <NEIGHBOR_INTERFACE>;****
}

对于基于 IPv6 的 MP-BGP 并启用增强功能的情况,此方案无需在链路接口中配置 IPv4 即可工作。

1
2
3
4
5
6
7
8
9
10
protocol bgp <NEIGHBOR_NAME> from dnpeers {
enable extended messages on;
neighbor <NEIGHBOR_IPv6>%<NEIGHBOR_INTERFACE> as <NEIGHBOR_ASN>;
# Or:
# neighbor <NEIGHBOR_IPv6> as <NEIGHBOR_ASN>;
# interface <NEIGHBOR_INTERFACE>;****
ipv4 {
extended next hop on;
};
};

由于 IPv6 具有特殊的链路本地地址,因此如果使用链路本地地址(建议使用链路本地地址),则必须使用 %<if><interface> 语法来指定接口。

以下是每个占位符的具体含义:


  1. 协议标识类
  • <NEIGHBOR_NAME>: 这是你给这个 BGP 会话起的一个内部名称
    • 用途:用于在 BIRD 内部区分不同的邻居,出现在 birdc show protocols 的输出中。
    • 注意:只能包含字母、数字或下划线,且不能重复。通常 IPv4 用名字,IPv6 用 名字_v6

  1. 网络参数类
  • <NEIGHBOR_IP>: 对方(邻居)的 IPv4 地址
    • 示例192.168.1.2 或 DN42 内部 IP 172.20.x.x
  • <NEIGHBOR_IPv6>: 对方(邻居)的 IPv6 地址
    • 注意:如果你使用的是 Link-Local 地址(以 fe80:: 开头),则通常必须配合接口名称使用。
  • <NEIGHBOR_INTERFACE>: 建立 BGP 会话所使用的物理或虚拟网卡接口名称
    • 示例wg0(WireGuard 接口)。
    • 作用:告诉 BIRD 从哪个网口去找这个邻居,特别是在使用 Link-Local 地址时非常关键。

  1. 自治系统类
  • <NEIGHBOR_ASN>: 对方(邻居)的 AS 号码(Autonomous System Number)
    • 示例424242xxxx

MBGP

BIRD2 是支持 Multiprotocol BGP 的,也就是可以在单独一个 IPv4/IPv6 BGP session 里建立 v4 和 v6 两条 channel

于是如果双方都支持 MP-BGP 的话,一般是用 link-local 建立一条 v6 的 BGP session 就好了。

由于 link-local 只是在连接双方的接口进行的,需要指定好接口。

1
2
3
4
protocol bgp dn42_424242xxxx_v6 from dnpeers {
neighbor fe80::xxxx % 'wg_424242xxxx' as 424242xxxx;
direct;
}

注意 fe80::xxxx 是对方的 link-local address,wg_424242xxxx 是你网络接口的名字。

Bird2? 启动!

启动 Bird2 仅需一行命令

1
birdc c

可以通过 birdc s p 查看 Bird2 的状态

1
peers      BGP        ---        up     13:01:51.314  Established

当输出显示 Established 时,也配置得差不多了

查看某条路由配置的详细信息。

1
birdc s p a dn42_424242xxxx_v6 

ALL DONE!

当你完成上述所有步骤,恭喜你,你即将完成好你第一次 DN42 之旅,现在只需要动动你的小手,在终端输入:

1
ping 172.20.0.53

当其可以正常输出

1
2
3
4
5
PING 172.20.0.53 (172.20.0.53) 56(84) bytes of data.
64 bytes from 172.20.0.53: icmp_seq=1 ttl=62 time=471 ms
64 bytes from 172.20.0.53: icmp_seq=2 ttl=62 time=412 ms
64 bytes from 172.20.0.53: icmp_seq=3 ttl=62 time=415 ms
64 bytes from 172.20.0.53: icmp_seq=4 ttl=62 time=435 ms

你就已经跨入了 DN42 的大门,Ping 命令所选的为 DN42 中的 DNS 服务器

快去和更多人Peer吧~

我的DN42

AS4242420223

详细内容看https://dn42.quickso.cn/

拓展内容

搭建 BIRD Looking Glass

IRD 是 Linux 上常用的一款 BGP 路由软件。bird-lg-go 是 蓝天 使用 Go 语言编写的 Looking Glass 程序,内存占用比原版 bird-lg 更低。它提供了一个网页面板,可以显示各个服务器上的 BIRD 路由软件的状态,以及查询到指定 IP 的路由。

安装 Docker 和 Docker Compose

http://getdocker.quickso.cn/

编排 Docker Compose 服务

在运行 web 的服务器上找个地方(如 /var/bird-lg/),将下面的内容修改后写入 docker-compose.yml 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: '3'

services:
bird-lg:
image: xddxdd/bird-lg-go
container_name: bird-lg
restart: always
environment:
- BIRDLG_SERVERS=us0,us1 # 节点列表,以逗号分隔
- BIRDLG_DOMAIN=dn42.quickso.cn # 节点 endpiont 后缀
- BIRDLG_TITLE_BRAND=Looking Glass # 标签栏上显示的名称
- BIRDLG_NAVBAR_BRAND=Looking Glass # 页面上显示的名称
- BIRDLG_WHOIS=whois.lantian.dn42 # Whois 服务器地址
- BIRDLG_DNS_INTERFACE=asn.dn42
ports:
- '5000:5000'
bird-lgproxy:
image: xddxdd/bird-lgproxy-go
container_name: bird-lgproxy
restart: always
volumes:
- '/var/run/bird/bird.ctl:/var/run/bird/bird.ctl'
ports:
- '8000:8000'

在各个节点上只需要写入下面内容即可:

1
2
3
4
5
6
7
8
9
10
11
version: '3'

services:
bird-lgproxy:
image: xddxdd/bird-lgproxy-go
container_name: bird-lgproxy
restart: always
volumes:
- '/var/run/bird/bird.ctl:/var/run/bird/bird.ctl'
ports:
- '8000:8000'

之后启动 Docker 容器:

1
docker-compose up -d

用caddy或者宝塔反向代理5000端口绑定域名

配置 DNS 解析

bird-lg-go 的节点 endpiont 生成逻辑是 http://[节点].[endpoint后缀]:8000 ,如 http://us0.dn42.quickso.cn:8000 ,所以只需要去配置对应的解析。

警告

建议解析到节点的公网 IP 上,以免 DN42 炸掉时 Looking Glass 也一并炸掉。

配置示例:

1
2
us0.dn42.quickso.cn.  3600    IN      A       xxx.xxx.xxx.xxx
us1.dn42.quickso.cn. 3600 IN CNAME xxx.abc.com

Prometheus监控

bird_exporter

https://github.com/czerwonk/bird_exporter

参考

https://dn42.dev/howto/Getting-Started

https://lantian.pub/article/modify-website/dn42-experimental-network-2020.lantian/

https://www.nodeseek.com/post-67786-1

https://blog.naivetomcat.cn/pages/9882a3/

https://moecm.com/getting-started-with-dn42-registration/

https://miaotony.xyz/2021/03/25/Server_DN42/

https://blog.baoshuo.ren/post/dn42-network/


DN42网络入坑指南
https://blog.quickso.cn/2026/04/15/DN42网络入坑指南/
作者
木子欢儿
发布于
2026年4月15日
许可协议