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

你可以通过加入 Telegram 群组 或者 IRC 频道 来寻求帮助。

请注意,DN42 是一个测试网络,所有人都在帮助所有人。即使你不小心搞砸了,也没有人会指责你。

也欢迎大家来和我进行对接,可以在 dn42.dgy.xyz 获取更多信息。

注册 DN42

这个流程其实我感觉是加入dn42网络中最为繁琐的一步,(如果你后面没有遇到奇奇怪怪的bug的话),并且对你的基本能力要求还是比较高的,下面列出的仅仅是基本要求,未来在你研究逐渐深入的时候要求也会逐步上升:

  1. 拥有一个Linux环境,我个人是使用VPS来完成整个注册流程的;
  2. 能够使用常用的Linux命令(如:cd, ls, mv, vi等等),知道基本的包管理命令(如:apt, yum等);
  3. 能进行基本的git操作(如:clone, push, pull, commit);
  4. 有一定的网络知识,能了解基本的交换机,路由器工作原理,能够运用基本的网络调试命令(如:ping, traceroute等);
  5. 有基本的网络搜索能力,对于上述不会的内容或者将来出现的问题能够使用谷歌,必应等搜索引擎解决问题;
  6. 有基本的英文能力。

现在,让我们开始吧!

你在任何时候都可以参考官方的注册流程,并且在任何时候出现问题都请以官方注册流程为准:

  1. 你需要在 https://git.dn42.dev/ 注册属于自己的账户,如果你有使用GitHub的经验,那么就应该对于下面的操作比较熟练,可以选择略过:
    (1). 如果你的vps上没有安装git的话,需要安装git,相关命令为:
    yum install git (cent os)
    或者
    apt install git (debian)
    (2). 你需要设置git的全局(下面的设置是我的设置,请改为你自己刚才注册的):
    git config --global user.name dgy
    git config --global user.email dgy@dgy.xyz
    ssh-keygen -t rsa -C "dgy@dgy.xyz
    将输出的内容复制到增加ssh密钥中;
    (3). 你需要生成gpg密钥对自己的提交进行验证:
    运行:
    gpg --full-gen-keygpg --generate-key gpg --gen-key
    其中之一,请注意,不同版本的gpg生成密钥的默认命令不一样,之后按照流程生成自己的密钥即可。
    然后在ssh中运行下列命令:
    gpg --list-secret-keys --keyid-format LONG
    输出应当如图所示:
    img
    然后使用以下命令进行导出:
    gpg --armor --export 145BB196C917B616
    之后需要在git中通过相关命令设置签名:
    git config --global user.signingkey 145BB196C917B616
    同时,你还需要把你的密钥上传的一个公共查询服务器上:
    gpg --keyserver hkp://keyserver.ubuntu.com --send-key [密钥ID]
  2. 找一个合适的地方,运行:
    git clone git@git.dn42.dev:dn42/registry.git
    之后你需要新建一个分支,命名格式类似 [昵称]-[日期,YYYYMMDD]/[自定义的分支名称]。
    假设我要在 2020 年 9 月 1 日注册,那么分支名就叫 dgy-20210818/registry。
    运行这两行命令来创建分支,并将分支上传。记得替换你自己的分支名:
    git checkout -b dgy-20210818/registry
    git push --set-upstream origin dgy-20210818/registry
  3. 在你新clone 下的仓库里新建一系列的文件:
    (1). 在 data/mntner 文件夹下创建一个名为 [昵称]-MNT 的文件,这个文件代表你的账户,用来认证你以后的操作。
    下面是我的注册信息:
1
2
3
4
5
6
7
mntner:             DGY-MNT
admin-c: DGY-DN42
tech-c: DGY-DN42
mnt-by: DGY-MNT
source: DN42
auth: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCAjtKaya6ytppR/Vng5XUIq5UigI7w2oEYiN+d2FVXtPIAhC1TK6LAsgOowEee5N5qEuf+Jioziq3/xo0ECtjSGE/UYaVe5L7ITgtdBiYbYLIYD/z83z4XmQXMEB0D7W65pR4GE0ERvlAkEWBilKM/yk9i6Bw1pYSxCn06r5YDffvLRagMFQkpRYWUXr7O8wGQo8vJfJILOLvwalW98P9Q97eZcNEDXpllvnFeJID29nj7jQ1GJMbtuflmFAypN5RXq8iPnp7lQX77OxsaUI9sKF+3tr8D3F3CFv3wEmugLw16yLzrh4ybA1FL5qSXZ9DMLZMFEKG0VZl3Mp1lBbh dgy@dgy.xyz
auth: pgp-fingerprint A91FDEC8B00C1C5139892E67585D94C8F4013AB3
  • 其中各项的含义如下:
    • mntner:即 maintainer(维护者),说明这个账户的名称,与文件名相同。
    • admin-c:即 admin contact(管理员联系信息),需要指向后续创建的 person 文件,一般为 [昵称]-DN42
    • tech-c:即 tech contact(技术员联系信息),需要指向后续创建的 person 文件,一般也为 [昵称]-DN42
    • mnt-by:即 maintain by(由谁维护),指向这个账户本身,一般为 [昵称]-MNT
    • source:固定为 DN42
    • ayth: 你的个人认证信息。一般接受两种类型:GPG 公钥和 SSH 公钥。 你必须在 GPG 公钥和 SSH 公钥中添加至少一种。这两个公钥我们已经在上面生成过了,填入即可。
  • 注意:**各个项目的名称和值之间有一长串空格。这段空格的长度**不是自己可以随意修改的,也不能替换成 Tab**。名称 + 冒号 + 空格的长度必须是 20 个字符**。

(2). 在data/person 文件夹下也创建一个 [昵称]-DN42 的文件,代表你的个人信息。说是个人信息,但其实只需要一个邮箱。例如我的 person 文件如下:

1
2
3
4
5
6
person:             Guoyi Dai
e-mail: dgy@dgy.xyz
contact: +1 (385) 645-0542
nic-hdl: DGY-DN42
mnt-by: DGY-MNT
source: DN42
  • 各项含义如下:
    • person:你的昵称。
    • e-mail:你的邮箱。
    • contact:可选,你的其它联系方式,例如 IRC、Telegram 等。
    • nic-hdlNIC handle,指向文件本身,与文件名相同,[昵称]-DN42
    • mnt-bymaintain by(由谁维护),由谁维护,指向你之前的 mntner 文件,[昵称]-MNT
    • source:固定为 DN42

(3). 接下来你要给自己选择一个 AS 编号,即 ASN。在国际互联网上,ASN 范围 4200000000 - 4294967294 是被保留作私下使用(private use)的,DN42 占用的就是其中的一块,4242420000 - 4242423999(注意范围是 4000 个,不是 10000 个,剩下 6000 个暂未开放注册) 在这 4000 个号码中挑选一个你喜欢的,并且没有被占用的,然后进入 data/aut-num 文件夹,创建文件。例如我的AS文件如下:

1
2
3
4
5
6
7
aut-num:            AS4242420826
as-name: DGY-AS
descr: Peer with me at dgy@dgy.xyz
admin-c: DGY-DN42
tech-c: DGY-DN42
mnt-by: DGY-MNT
source: DN42
  • 各项含义如下:
    • aut-num:AS 号。
    • as-name:AS 的名称,一般只在 DN42 的一些网络结构示意图中看到。可以设置为 [昵称]-AS
    • descr:AS 简介,一般只在结构图中看到,随意填写。
    • admin-cadmin contact(管理员联系信息),指向你的 person 文件,[昵称]-DN42
    • tech-ctech contact(技术员联系信息),指向你的 person 文件,[昵称]-DN42
    • mnt-bymaintain by(由谁维护),由谁维护,指向你之前的 mntner 文件,[昵称]-MNT
    • source:固定为 DN42
  • 如果你拥有真实互联网的ASN,可以填入自己的ASN号,并且在source里填入自己的RIR名称。但是我不知道相关流程会不会更为复杂,也欢迎给我补充。

(4). 接下来就是选择自己的IP。进入 data/inetnum 文件夹,挑选一块空闲的地址块给自己使用

  • DN42 的 IPv4 地址在 172.20.0.0/14 范围,即 172.20.0.0 - 172.23.255.255

  • 你在 DN42 内能申请的最小地址块是

    1
    /29

    ,即 8 个 IP,其中除去第一个 IP 标记地址块,最后一个 IP 作为地址块内广播(broadcast)不可用以外,可以分给 6 个服务器和设备。

    • 对于 “只想简单玩玩” 的用户,/29 已经够了。
  • DN42 一般建议申请 /27,你能直接申请的最大地址块是 /26

  • 可以先申请一块较小的地址块,再逐步扩大。

  • 选好地址块之后,在 data/inetnum 文件夹创建 IPv4 地址对应的文件。例如我的其中一个地址块是 172.23.196.0/27,对应的文件就是 data/inetnum/172.23.196.0_27

1
2
3
4
5
6
7
8
9
10
11
12
13
inetnum:            172.23.196.0 - 172.23.196.31
netname: DGY-IPV4
remarks: Peer with me at dgy@dgy.xyz
descr: Peer with me at dgy@dgy.xyz
country: CN
admin-c: DGY-DN42
tech-c: DGY-DN42
mnt-by: DGY-MNT
nserver: ns1.dgy.dn42
nserver: ns2.dgy.dn42
status: ASSIGNED
cidr: 172.23.196.0/27
source: DN42
  • 各项含义如下:
    • inetnum:你的这个地址块的范围,如果你不会算,那么可以根据你的地址块前后的用户推出,或者直接用 IP 地址计算器
    • netname:你的这个地址块的名称,没什么用,随便取(但一般建议保持 [昵称]-IPV4 格式)。
    • remarks:简介,随意填写。
    • descr:简介,随意填写。
    • country:你的国家代号,填 CN 代表中国大陆。
    • admin-cadmin contact(管理员联系信息),指向你的 person 文件,[昵称]-DN42
    • tech-ctech contact(技术员联系信息),指向你的 person 文件,[昵称]-DN42
    • mnt-bymaintain by(由谁维护),由谁维护,指向你之前的 mntner 文件,[昵称]-MNT
    • nserver:IP 地址反向解析的 DNS 服务器。如果你不知道这个是什么,或者不需要这个,可以去掉。
    • status:固定为 ASSIGNED
    • cidr:你的地址块的范围,与 inetnum 相同,只是以 CIDR 方式表示。
    • source:固定为 DN42
  1. 注册 IP 的过程还没结束,你还需要创建一个 route 对象,授权某个 AS 使用这个地址。在 data/route 文件夹创建对应文件,例如我的是data/route/172.23.196.0_27:
1
2
3
4
5
route:              172.23.196.0/27
descr: Peer with me at dgy@dgy.xyz
origin: AS4242420826
mnt-by: DGY-MNT
source: DN42
  • 各项含义如下:
    • route:你的这个地址块的范围。
    • descr:简介,随意填写。
    • origin:你授权哪个 AS 使用这个地址块,填写你的 AS 编号。
    • mnt-bymaintain by(由谁维护),由谁维护,指向你之前的 mntner 文件,[昵称]-MNT
    • source:固定为 DN42
  1. 现在都2021年了,真不考虑一下IPV6吗?可以没有IPV4,但是不能没有IPV6呢 在 data/inet6num 中创建文件。
  • DN42 的 IPv6 地址在 fd00::/8 范围,位于私有 IPv6 地址段。
  • DN42 内 IPv6 地址块一般只以 /48 的大小存在,足够任何人使用。
  • 最好的选择是随机生成一个地址块。你可以使用一些随机生成前缀的工具
  • 请注意: dn42不允许自定义IPV6 ULA
  • 与其定义一个好记的地址,不如注册一个好记的域名。(此处应该有教程)
  • 生成完地址块后,类似的在 data/inet6num 中创建文件,例如我的地址块是 fd11:552f:74db::/48,文件名就是 data/inet6num/fd11:552f:74db::_48
    下面是我的注册信息,仅供参考:
1
2
3
4
5
6
7
8
9
10
11
12
inet6num:           fd11:552f:74db:0000:0000:0000:0000:0000 - fd11:552f:74db:ffff:ffff:ffff:ffff:ffff
netname: DGY-IPV6
descr: Peer with me at dgy@dgy.xyz
country: CN
admin-c: DGY-DN42
tech-c: DGY-DN42
mnt-by: DGY-MNT
nserver: ns1.dgy.dn42
nserver: ns2.dgy.dn42
status: ASSIGNED
cidr: fd11:552f:74db::/48
source: DN42
  • 各项含义如下:
    • inet6num:你的这个地址块的范围。IPv6 的范围算起来很简单,从全 0 到全 f。
    • netname:你的这个地址块的名称,没什么用,随便取(但一般建议保持 [昵称]-IPV6 格式)。
    • remarks:简介,随意填写。
    • descr:简介,随意填写。
    • country:你的国家代号,填 CN 代表中国大陆。
    • admin-cadmin contact(管理员联系信息),指向你的 person 文件,[昵称]-DN42
    • tech-ctech contact(技术员联系信息),指向你的 person 文件,[昵称]-DN42
    • mnt-bymaintain by(由谁维护),由谁维护,指向你之前的 mntner 文件,[昵称]-MNT
    • nserver:IP 地址反向解析的 DNS 服务器。如果你不知道这个是什么,或者不需要这个,可以去掉。
    • status:固定为 ASSIGNED
    • cidr:你的地址块的范围,与 inetnum 相同,只是以 CIDR 方式表示。
    • source:固定为 DN42
  1. 与上面的IPV4一样,你还需要在data/route6 中创建一个route6的对象,授权你自己的AS使用,例如我的就是data/route6/fd11:552f:74db::_48
1
2
3
4
5
route6:             fd11:552f:74db::/48
descr: Peer with me at dgy@dgy.xyz
origin: AS4242420826
mnt-by: DGY-MNT
source: DN42

每项含义和IPV4相同,此处不再赘叙。

  1. 你可能还需要一个域名?(第一次注册的时候可以先略过,后续再补充)

在dn42中,所有的域名都是以*.dn42结尾的,你可能需要搭建自己的权威dns服务器(如bind, powerdns等)。
创建data/dns/dgy.dn42然后填写:

1
2
3
4
5
6
7
8
9
domain:             dgy.dn42
admin-c: DGY-DN42
tech-c: DGY-DN42
mnt-by: DGY-MNT
nserver: ns1.dgy.dn42 172.23.196.1
nserver: ns2.dgy.dn42 172.23.196.2
nserver: ns1.dgy.dn42 fd11:552f:74db::1
nserver: ns2.dgy.dn42 fd11:552f:74db::2
source: DN42
  • 这里的nsserver就是你的权威域名服务器了,注意,这里需要添加glue record,也就是需要有ip的解析结果。

完成了这些之后你需要检查自己提交的格式,可以使用dn42自带的脚本:
fmt-my-stuff DGY-MNT
check-my-stuff DGY-MNT
check-pol origin/master DGY

发起PR!

这个时候就要恭喜你了,你已经基本上完成了dn42的注册了,剩下就需要提交本地修改了。接下来 cd 到 Git 仓库的根目录,执行一次 git add .,然后执行 git commit -S,使用你先前创建的 GPG 密钥,创建一份带 GPG 签名的 commit

  • 如果你操作快已经 commit 完了,你可以执行 git commit --amend -S 修改之前的 commit,将其签名。
  • 如果你先前 commit 了多次,你需要把所有变更合并到一次 commit 里,直接运行 Registry 根目录下的 ./squash-my-commits -S --push 脚本即可。
  • 注意:脚本在某些时候会出现bug,需要手动合并自己的commit并签名,具体操作如下:
1
2
3
4
5
6
7
8
# 获取更新
git fetch origin master
# 切换到你自己的分支
git checkout dgy-20210818/registry
# Rebase 你的分支,实际上就是将你的修改在最新的 Registry 上重新应用一遍
# 输入这行命令后会出现一个编辑器,你需要保留第一行的 pick,
# 并将第二行开始(如果有的话)的 pick 全部改成 squash,然后保存并退出编辑器就可以了
git rebase -i -S origin/master
  • 然后执行git push -f上传自己的修改。
  • 回到 dn42/registry 发起pull request, 等待merge哦~
    请注意:虽然部分管理员是中国人,但是dn42的官方语言是英语,请使用英语发起pr哦。
    如果你的pr有问题,管理员会给你回复,修改好之后直接push就可以,不需要再次提交pr了。

联系:

有什么问题请发送邮件至 i@dgy.xyz 或者去非官方 Telegram 群组寻找帮助。