Files
MyBlog-Next/src/content/posts/DN42网络探索指南.mdx
T

214 lines
7.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: DN42 网络探索指南
description: 从零加入 DN42 自治网络的全记录,包括注册流程、对象创建、SSH 签名提交,以及路由配置的踩坑分享
pubDatetime: 2026-08-14
modDatetime: 2026-08-14
featured: false
draft: false
tags:
- 网络
- DN42
- BGP
---
DN42 是一个主要由爱好者运营的去中心化自治网络,你可以把它理解成一个大型的实验性互联网。它用和公网一样的 IP 分配机制和 BGP 路由协议,区别在于这些地址不会出现在真正的互联网上——它们是私有地址,只在 DN42 内部路由。
这篇记录了我从注册到完成 ASN 申请的全过程,踩了些坑,也学到不少东西。
## DN42 是什么,为什么要玩
DN42Decentralized Network 42)是一个由社区成员维护的 VPN 网络,2011 年左右创建的。它模拟了一个真实互联网的样子:
- 有自己的 IP 地址空间(IPv4 172.20.0.0/14 和 IPv6 ULA 地址)
- 跑 BGP 协议做路由交换
- 用 Registry 系统管理资源(类似 RIR,只不过全球只有一个)
- 有 DNS 服务,有自己的 whois 数据库
你可以在上面练习 BGP 路由策略配置,测试各种隧道协议(WireGuard、OpenVPN、GRE),搭建你自己的 DNS 服务,运行自己的网站和内部服务。
而且因为 DN42 的定位本来就是实验性网络,你在上面搞坏了什么也不会影响真正的互联网。这种随便折腾的性质,是生产环境给不了的。
## 注册和 Fork Registry
第一步是在 [git.dn42.dev](https://git.dn42.dev) 注册一个账号。这个 Git 服务是整个 DN42 的 Registry 管理平台——所有 IP 地址段、ASN 号、联系人信息都以文件形式存放在一个 Git 仓库里。跟 IANA/RIR 用数据库或 API 管理资源不同,DN42 用的是 Pull Request 机制。
注册完账号后,需要 fork [dn42/registry](https://git.dn42.dev/dn42/registry) 仓库。后续我们在自己的 fork 里创建对象文件,提交后提 PR 到主仓库,审批通过就生效了。
这个流程跟 GitHub 的开源贡献一模一样,只不过这里用的是 Gitea,Git 操作稍微有点不一样。
## 规划地址和 ASN
在创建对象之前,要先搞清楚你需要什么资源:
- ASN:DN42 分配的是私有 ASN,范围是 4242420000 到 4242429999。我自己选了 4242420665。
- IPv4 地址段:172.20.0.0/14 内,一般新用户能拿到 /27 或 /28 的段。我拿的是 172.20.13.128/27。
- IPv6 地址段:使用 ULA,我拿了 fd42:e9:f0::/48。
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 / inet6numIP 地址段)
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 地址。另外还需要在 `data/route/` 和 `data/route6/` 下创建 ROUTE / ROUTE6 对象来宣告路由:
```
route: 172.20.13.128/27
origin: AS4242420665
mnt-by: QIHAN-MNT
source: DN42
```
ROUTE6 格式类似,地址换成 IPv6 段就行。
## Commit 签名
DN42 Registry 要求 commit 必须签名。PGP 和 SSH 签名都支持。我用的是 SSH 签名,因为它不需要额外配置密钥服务器:
```bash
git config gpg.format ssh
git config user.signingkey ~/.ssh/id_ed25519.pub
```
之后用 `git commit -S` 就能签名提交了。注意这里的 `-S` 是大写,不是小写——小写的 `-s` 是 sign-off,不是 GPG 签名,我一开始就搞混了。
## 提交 PR
Push 到自己的 fork 之后,通过 API 提 PR
```bash
gh api repos/dn42/registry/pulls \
-X POST \
-f title="QIHAN-MNT registration" \
-f head="Qihan:main" \
-f base="master"
```
注意 head 和 base 的分支名可能不同——官方主仓库用的是 `master` 分支而不是 `main`。提交成功后,等着审批通过就行。
## 踩坑记录
几个容易翻车的地方:
**1. 对象文件名不区分大小写,但习惯上大写**
比如 `QIHAN-MNT` 和 `qihan-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,或者有什么问题,欢迎来聊聊。