DN42 全称 Decentralized Network 42(42 号去中心网络),是一个大型、去中心化的 VPN 网络。但是与其它传统 VPN 不同的是,DN42 本身不提供 VPN 出口服务,即不提供规避网络审查、流媒体解锁等类似服务。相反,DN42 的目的是模拟一个互联网。它使用了大量在目前互联网骨干上应用的技术(例如 BGP 和递归 DNS),可以很好地模拟一个真实的网络环境。
简而言之,DN42:
- 不适合单纯想要保护隐私、规避网络审查的用户
- 不适合在网内消耗大量流量,例如用于解锁流媒体服务的用户
- 适合想要研究网络技术,练习服务器、路由器等网络设备配置,甚至后续在真实互联网建立 AS 的用户
- 适合拥有真实 AS,但担心自己配置错误广播出错误路由、干掉半个互联网,希望有个地方测试的用户。
正因为此,使用 DN42 的门槛比较高。就像在真实互联网中一样,你要扮演一个 ISP(互联网服务提供商),注册自己的个人信息,ASN 号码,IPv4 和 IPv6 的地址池,并且使用 BGP 在自己的服务器上广播它们。你还要和其它的用户联系,和他们做 Peering(对接),一步步进入完整的 DN42 网络。
请注意:建立中国大陆到中国大陆以外的跨境 VPN 连接可能违反法律。请自行衡量其中的风险。
DN42 在 172.20.0.0/14 和 fd00::/8 上运行,而这两个 IP 段都是分配给内网使用的。换句话说,你在 DN42 上怎么折腾,都不会影响到服务器其它的互联网连接。
前提条件
- 你有一个 Linux 环境(双系统 / 虚拟机 / VPS 都可以)。
- 你知道如何使用常见的 Linux 命令(例如
cd,ls等),知道在你的 Linux 上安装软件包(apt,yum等),以及会使用至少一个编辑器(图形化的gedit、vscode,或者命令行的vim、nano都可以)。如果你不会,建议先阅读这份教程。 - 你知道 Git 版本管理工具的基本命令,例如 push/pull/commit。如果你不会,建议先阅读这份教程。
- 你有一定程度的网络知识,知道 IP、MAC 地址是什么,知道交换机、路由器的工作原理,会在 Linux 下进行基本的网络调试(
ping,traceroute等),听说过 BGP/OSPF 等动态路由协议。如果你不会,建议先阅读这份大纲,并搜索大纲中提到的关键词学习相关知识。 - 你有基本的英语阅读能力(用翻译软件也可以)。
注意:请具有最基本的理解能力,否则你可能会给DN42网络中的其他人带去麻烦!!!
你可以通过加入 Telegram 群组 或者 IRC 频道 来寻求帮助。
请注意,DN42 是一个测试网络,所有人都在帮助所有人。即使你不小心搞砸了,也没有人会指责你。
注册流程
再次注意:DN42注册流程可能相对繁琐,这是为了尽可能真实的模拟现实互联网
由于本文无法做到随时更新,仅能保证在本文发布时的时效性,最新的注册流程请参考DN42的官方WIKI
在注册过程中会大量使用到一些 UNIX 工具(如 Git 、 GPG 等),所以最好使用 Linux 或者 macOS 系统完成整个流程,如果你正在使用 Windows 系统,那么可以使用 WSL 。
1.首先去 https://git.dn42.dev 注册一个账户,打开 dn42/registry 这个账户信息仓库,点右上角的 Fork,把仓库复制一份到你自己的账户
2.然后找到一个地方,新建文件夹,我命名为 dn42,下文 dn42 皆指你创建的这个文件夹,所有操作都将在里面进行
3.此时你应该已经进入了你自己账户里的那份复制,把它 Clone 下来。
4.在 Clone 下的仓库里创建一系列的文件,但是请先注意:
注释 1:Username 应该全大写!像 LONGTIANMU!
注释 2:所有内容严格匹配,前后都不能多 / 少空格
注释 3:务必使用后文提到的查询器生成地址,否则容易撞
注释 4:GPG 签名需要先导入至 git
注释 5:remarks 没什么好写的就可以把 remarks 一整行删掉
注释 6:本文需要大量文本编辑操作,建议使用一个阳间的文本编辑器,否则你会像我一样反反复复出错
5.在 data/mntner 文件夹下创建一个名为 [Username]-MNT 的文件,这个文件代表你的账户,用来认证你以后的操作。一份样例 mntner 文件如下:
mntner: Username
admin-c: Username-DN42
tech-c: Username-DN42
mnt-by: Username-MNT
source: DN42
auth: pgp-fingerprint Key ID
- mntner:即
maintainer(维护者),说明这个账户的名称,与文件名相同。 - admin-c:即
admin contact(管理员联系信息),需要指向后续创建的 person 文件,一般为[昵称]-DN42。 - tech-c:即
tech contact(技术员联系信息),需要指向后续创建的 person 文件,一般也为[昵称]-DN42。 - mnt-by:即
maintain by(由谁维护),指向这个账户本身,一般为[昵称]-MNT。 - source:固定为
DN42。 - auth:你的个人认证信息。一般接受两种类型:GPG 公钥和 SSH 公钥。
获取GPG公钥请参考 Github 的教程与阮一峰的教程
2.在 data/person 文件夹下创建一个 [昵称]-DN42 的文件,代表你的个人信息。这是一份样例文件:data/person/Username-DN42):
person: Username
e-mail: 1145141919810@hotmail.com
contact: QQ/Telegram/Phone
nic-hdl: Username-DN42
mnt-by: Username-MNT
source: DN42
- person:你的昵称。
- e-mail:你的邮箱。
- contact:可选,你的其它联系方式,例如 IRC、Telegram 等。
- nic-hdl:
NIC handle,指向文件本身,与文件名相同,[Username]-DN42。 - mnt-by:
maintain by(由谁维护),由谁维护,指向你之前的 mntner 文件,[Username]-MNT。 - source:固定为
DN42。
请点击这里,查看DN42网络中的空闲AS号和IPV4/IPV6地址
3.接下来你要给自己选择一个 AS 编号,即 ASN。在国际互联网上,ASN 范围 4200000000 – 4294967294 是被保留作私下使用(private use)的,DN42 占用的就是其中的一块,4242420000 – 4242423999。(注意范围是 4000 个,不是 10000 个,剩下 6000 个暂未开放注册) 在这 4000 个号码中挑选一个你喜欢的,并且没有被占用的,然后进入 data/aut-num 文件夹,创建文件。假设我是 AS4242422382, 文件就是 data/aut-num/AS4242422382
aut-num: AS4242422382
as-name: Username-AS
descr: 一段描述
admin-c: Username-DN42
tech-c: Username-DN42
mnt-by: Username-MNT
source: DN42
- aut-num:AS 号。
- as-num:AS 的名称,一般只在 DN42 的一些网络结构示意图中看到。可以设置为
[昵称]-AS。 - descr:AS 简介,一般只在结构图中看到,随意填写。
- admin-c:
admin contact(管理员联系信息),指向你的 person 文件,[Username]-DN42。 - tech-c:
tech contact(技术员联系信息),指向你的 person 文件,[Username]-DN42。 - mnt-by:
maintain by(由谁维护),由谁维护,指向你之前的 mntner 文件,[Username]-MNT。 - source:固定为
DN42。
4.IP 选择环节了。进入 data/inetnum 文件夹,里面是所有已被注册的 IPv4 地址块信息。你需要在其中挑选一块空闲的地址块占为己用。以下是注意事项:
和在真实互联网上一样,DN42 的 IPv4 地址资源也是十分紧缺的,因此 IPv4 的申请原则是「够用就好」。如果节点数量足够少,只申请 /28 或 /29 大小的地址块就够用了。
在仓库的 data/inetnum 目录下新建一个文件,命名为 IP 地址块的 CIDR 格式,并使用 _ 代替 /。
inetnum: 172.20.0.0 - 172.20.0.255
netname: Username-IPV4
remarks: 随便写点
descr: 随便写点
country: CN
admin-c: Username-DN42
tech-c: Username-DN42
mnt-by: Username-MNT
nserver: ns1.看注释.dn42
nserver: ns2.看注释.dn42
status: ASSIGNED
cidr: 172.20.0.0/24
source: DN42
- inetnum:你的这个地址块的范围,如果你不会算,那么可以根据你的地址块前后的用户推出,或者直接用 IP 地址计算器。
- netname:你的这个地址块的名称,没什么用,随便取(但一般建议保持
[Username]-IPV4格式)。 - remarks:简介,随意填写,不晓得写啥记得去掉一整行。
- descr:简介,随意填写。
- country:你的国家代号,填 CN 代表中国大陆。
- admin-c:
admin contact(管理员联系信息),指向你的 person 文件,[Username]-DN42。 - tech-c:
tech contact(技术员联系信息),指向你的 person 文件,[Username]-DN42。 - mnt-by:
maintain by(由谁维护),由谁维护,指向你之前的 mntner 文件,[Username]-MNT。 - nserver:IP 地址反向解析的 DNS 服务器。如果你不知道这个是什么,或者不需要这个,可以去掉一整行。
- status:固定为
ASSIGNED。 - cidr:你的地址块的范围,与
inetnum相同,只是以 CIDR 方式表示。 - source:固定为
DN42。
5.添加你 IPv4 的路由,允许你的 AS 使用你申请的 v4 地址。在 data/route 文件夹创建对应文件,文中假设你的是 data/route/172.20.0.0_24,同前面 IPv4 地址的文件名,事实上 v6 也是如此,IP 与 route 文件名相同。
route: 172.20.0.0/24
descr: 随便写点啥
origin: AS4242422382
mnt-by: Username-MNT
source: DN42
- route:你的这个地址块的范围。
- descr:简介,随意填写,不能删。
- origin:你授权哪个 AS 使用这个地址块,填写你的 AS 编号。
- mnt-by:
maintain by(由谁维护),由谁维护,指向你之前的 mntner 文件,[Username]-MNT。 - source:固定为
DN42。
鉴于已经 3202 年了,工信部都说要普及 IPv6 了,而且 DN42 内部 IPv6 普及率 >=100% 了,你也许该顺便注册下 IPv6,和上文 IPv4 两步骤基本相似。
6.注册IPV6地址
在国际互联网上, fc00::/7 是由 RFC4193 定义的 唯一本地地址,而 DN42 占用的就是其中的一块: fd00::/8 。目前 DN42 开放注册的地址块范围可以在 Address Space 页面上查看。
在仓库的 data/inet6num 目录下新建一个文件,命名为 IPv6 地址块的 CIDR 格式,并使用 _ 代替 /
inet6num: <起始 IPv6 地址> - <结束 IPv6 地址>
cidr: <IPv6 地址块的 CIDR 格式>
netname: <IPv6 地址块名称>
descr: <IPv6 地址块简介>
country: <IPv6 地址块所属国家>
admin-c: <NIC 句柄>
tech-c: <NIC 句柄>
mnt-by: <维护者>
status: ASSIGNED
source: DN42
inet6num:这个地址块的范围。cidr:使用 CIDR 格式表示的这个地址块的范围,含义与inet6num相同。netname:这个地址块的名称。可以设置为<昵称>-IPV6。descr:(选填)这个地址块的简介。nserver:(选填)IP 地址反向解析的 DNS 服务器。country:你的 ISO 3166 国家代码,填CN代表中国大陆地区。admin-c:管理员联系信息(Admin Contact),指向你在 注册联系人 一节中注册的 NIC 句柄。tech-c:技术员联系信息(Tech Contact),指向你在 注册联系人 一节中注册的 NIC 句柄。mnt-by:由谁维护(Maintain by),指向你在 注册维护者 一节中注册的的维护者信息。status:固定为ASSIGNED。source:固定为DN42。
7.为你的 IPv6 地址块添加路由,在 data/route6 创建一个与上面你选择的同名的文件即可。
route6: fd7a:f946:6722: :0/48
descr: <IPv6 地址块的 CIDR 格式>
origin: AS4242422382
mnt-by: Username-MNT
source: DN42
8.起来喝口水休息一下,马上搞定了
Git上传你的文件
完成以上步骤之后,使用 git diff 查看文件变动,检查无误后,使用 git add . 暂存。
运行仓库根目录下的 ./check-my-stuff <维护者> 检查文件内容是否有误,确定无误后,提交。
在提交时,如果需要使用 GPG 签名,需要在添加 -S 参数,如 git commit -S ;如果使用 SSH 签名,请直接使用 git commit 进行提交,待提交后再进行签名工作。
签名失败怎么办
这很有可能是因为您没有导入 GPG 密钥到 git。
首先git config --global user.signingkey 之前创建的Key ID
然后export GPG_TTY=$(tty)
现在,您应该可以创建了
如果你前面已经 commit 过几次了,你可以执行 git commit *--amend -S* 修改之前的 commit,将其签名。
执行 git push -f 将修改上传到 Git 服务器。
现在,回到 dn42/registry,发起 Pull Request,等待你的信息被合并。
PR 通过后,你就正式拥有自己的地址啦!并且可以和别人 peer!