跳转到内容
启涵的小破站
返回

DN42 网络探索指南

DN42 是一个主要由爱好者运营的去中心化自治网络,你可以把它理解成一个大型的实验性互联网。它用和公网一样的 IP 分配机制和 BGP 路由协议,区别在于这些地址不会出现在真正的互联网上——它们是私有地址,只在 DN42 内部路由。

这篇记录了我从注册到完成 ASN 申请的全过程,踩了些坑,也学到不少东西。

DN42 是什么,为什么要玩

DN42(Decentralized Network 42)是一个由社区成员维护的 VPN 网络,2011 年左右创建的。它模拟了一个真实互联网的样子:

你可以在上面练习 BGP 路由策略配置,测试各种隧道协议(WireGuard、OpenVPN、GRE),搭建你自己的 DNS 服务,运行自己的网站和内部服务。

而且因为 DN42 的定位本来就是实验性网络,你在上面搞坏了什么也不会影响真正的互联网。这种随便折腾的性质,是生产环境给不了的。

注册和 Fork Registry

第一步是在 git.dn42.dev 注册一个账号。这个 Git 服务是整个 DN42 的 Registry 管理平台——所有 IP 地址段、ASN 号、联系人信息都以文件形式存放在一个 Git 仓库里。跟 IANA/RIR 用数据库或 API 管理资源不同,DN42 用的是 Pull Request 机制。

注册完账号后,需要 fork dn42/registry 仓库。后续我们在自己的 fork 里创建对象文件,提交后提 PR 到主仓库,审批通过就生效了。

这个流程跟 GitHub 的开源贡献一模一样,只不过这里用的是 Gitea,Git 操作稍微有点不一样。

规划地址和 ASN

在创建对象之前,要先搞清楚你需要什么资源:

DN42 有一个自动分配脚本(contrib/assign.py),能帮你找到一个未被占用的地址段。不过我习惯手动去 registry 里搜一下——看看别人都用了什么地址范围,心里有个数。

创建对象文件

Registry 由四种核心对象组成,需要按顺序来。每个对象建好文件后,用 git add 加上提交就行,不用急着 push。

1. MNTNER(维护者对象)

这是你的身份标识,所有其他对象都通过 MNTNER 来关联。文件放在 data/mntner/ 目录,文件名跟对象名一致。

参考模板:

mntner:            你的-MNT        # 维护者名称,全大写
admin-c:           你的-nic-hdl    # 管理联系人
 tech-c:           你的-nic-hdl    # 技术联系人
mnt-by:            你的-MNT        # 由谁维护,指向自身
source:            DN42            # 固定值

我的实际配置(仅供参考):

mntner:            QIHAN-MNT
admin-c:           QIHAN-DN42
tech-c:            QIHAN-DN42
mnt-by:            QIHAN-MNT
source:            DN42

2. PERSON(联系人对象)

需填写你的真实姓名、联系邮箱和 SSH 公钥。文件放在 data/person/

参考模板:

person:            你的姓名
nic-hdl:           你的-nic-hdl    # 这个值会在其他对象中引用
e-mail:            你的邮箱
mnt-by:            你的-MNT
source:            DN42

我的实际配置(仅供参考):

person:            Qihan Chen
nic-hdl:           QIHAN-DN42
e-mail:            nuo66688@163.com
mnt-by:            QIHAN-MNT
source:            DN42

3. ASN(自治系统号)

声明你拿到的 ASN。文件放在 data/aut-num/

参考模板:

aut-num:           AS424242XXXX      # 你的 ASN 号
as-name:           你的-AS-NAME      # AS 名称,通常简写
admin-c:           你的-nic-hdl
tech-c:            你的-nic-hdl
mnt-by:            你的-MNT
source:            DN42

我的实际配置(仅供参考):

aut-num:           AS4242420665
as-name:           QIHAN-AS
admin-c:           QIHAN-DN42
tech-c:            QIHAN-DN42
mnt-by:            QIHAN-MNT
source:            DN42

4. inetnum / inet6num(IP 地址段)

IPv4 段放在 data/inetnum/,IPv6 段放在 data/inet6num/。注意范围要和 CIDR 对齐。

参考模板:

inetnum:           起始IP - 结束IP    # 例如 172.20.x.x - 172.20.x.x
netname:           你的名字-NET
admin-c:           你的-nic-hdl
tech-c:            你的-nic-hdl
mnt-by:            你的-MNT
source:            DN42

我的实际配置(仅供参考):

inetnum:           172.20.13.128 - 172.20.13.159
netname:           QIHAN-NET
admin-c:           QIHAN-DN42
tech-c:            QIHAN-DN42
mnt-by:            QIHAN-MNT
source:            DN42

IPv6 用 inet6num: 开头,格式差不多,只是起始和结束地址换成 IPv6 地址。

5. ROUTE / ROUTE6(路由宣告)

宣告你的 IP 段路由,IPv4 放在 data/route/,IPv6 放在 data/route6/

参考模板(ROUTE):

route:             你的IPv4段/CIDR    # 跟你 inetnum 定义的完全一致
origin:            AS424242XXXX        # 你的 ASN
mnt-by:            你的-MNT
source:            DN42

我的实际配置(仅供参考):

route:             172.20.13.128/27
origin:            AS4242420665
mnt-by:            QIHAN-MNT
source:            DN42

ROUTE6 参考模板:

route6:            你的IPv6段/CIDR
origin:            AS424242XXXX
mnt-by:            你的-MNT
source:            DN42

我的实际配置(仅供参考):

route6:            fd42:e9:f0::/48
origin:            AS4242420665
mnt-by:            QIHAN-MNT
source:            DN42

Commit 签名

DN42 Registry 要求 commit 必须签名。PGP 和 SSH 签名都支持。我用的是 SSH 签名,因为它不需要额外配置密钥服务器:

git config gpg.format ssh
git config user.signingkey ~/.ssh/id_ed25519.pub

之后用 git commit -S 就能签名提交了。注意这里的 -S 是大写,不是小写——小写的 -s 是 sign-off,不是 GPG 签名,我一开始就搞混了。

提交 PR

Push 到自己的 fork 之后,就可以提 PR 了。可以用 Gitea 网页界面操作,也可以用 API。

参考命令(记得替换为你自己的信息):

gh api repos/dn42/registry/pulls \
  -X POST \
  -f title="你的-MNT registration" \
  -f head="你的Gitea用户名:你的分支名" \
  -f base="master"

我的实际命令(仅供参考):

gh api repos/dn42/registry/pulls \
  -X POST \
  -f title="QIHAN-MNT registration" \
  -f head="Qihan:main" \
  -f base="master"

注意 headbase 的分支名——官方主仓库用的是 master 分支而不是 main,而你的 fork 默认可能是 main。提交成功后,等着审批通过就行。

踩坑记录

几个容易翻车的地方:

1. 对象文件名不区分大小写,但习惯上大写 比如 QIHAN-MNTqihan-mnt 会被当成同一个文件,但社区习惯用全大写。MNTNER 文件要跟对象名完全一致。

2. SSH 签名第一次用需要注册公钥 在 Gitea 设置里上传你的公钥,并记下它的 ID。确认上传的 key 指纹是对的——我就因为传错了公钥导致签名验证失败,浪费了不少时间。

3. ROUTE 对象的 CIDR 要算准 IPv4 段是 172.20.13.128/27,范围是 172.20.13.128 - 172.20.13.159,这两个必须匹配。写错一个就通不过验证脚本。

4. PR 只接受一个 commit Registry 维护者希望每个 PR 是干净的、只有一个 commit。如果 push 了多个 commit,得用 git rebase -i 合并成一个再提交。

5. 邮箱要注意 DN42 的 whois 数据是公开的,有人可能会顺着 whois 里的邮箱联系你。最好用一个专门用于 DN42 的邮箱,别用私人邮箱。

下一步

PR 合并之后,就可以开始配置路由了。大致流程是:找几个愿意跟你建立对等连接的 DN42 用户,通过 WireGuard 创建隧道,在 Bird 或 FRR 里配置 BGP 会话,然后宣告你的路由段。

先连上两三个 Peer,跑通 BGP 之后就能跟整个 DN42 网络通信了。

如果你也在折腾 DN42,或者有什么问题,欢迎来聊聊。


分享本文:

上一篇
Git 实用技巧:从日常到线上救急
下一篇
systemd journal 使用指北

加载评论区中...