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 在 172.20.0.0/14
和 fd00::/8
上运行,而这两个 IP 段都是分配给内网使用的。换句话说,你在 DN42 上怎么折腾,都不会影响到服务器其它的互联网连接。
你可以通过加入 Telegram 群组 或者 IRC 频道 来寻求帮助。
请注意,DN42 是一个测试网络,所有人都在帮助所有人。即使你不小心搞砸了,也没有人会指责你。
也欢迎大家来和我进行对接,可以在 dn42.dgy.xyz 获取更多信息。
注册 DN42
这个流程其实我感觉是加入dn42网络中最为繁琐的一步,(如果你后面没有遇到奇奇怪怪的bug的话),并且对你的基本能力要求还是比较高的,下面列出的仅仅是基本要求,未来在你研究逐渐深入的时候要求也会逐步上升:
- 拥有一个Linux环境,我个人是使用VPS来完成整个注册流程的;
- 能够使用常用的Linux命令(如:cd, ls, mv, vi等等),知道基本的包管理命令(如:apt, yum等);
- 能进行基本的git操作(如:clone, push, pull, commit);
- 有一定的网络知识,能了解基本的交换机,路由器工作原理,能够运用基本的网络调试命令(如:ping, traceroute等);
- 有基本的网络搜索能力,对于上述不会的内容或者将来出现的问题能够使用谷歌,必应等搜索引擎解决问题;
- 有基本的英文能力。
现在,让我们开始吧!
你在任何时候都可以参考官方的注册流程,并且在任何时候出现问题都请以官方注册流程为准:
- 你需要在 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
输出应当如图所示:
然后使用以下命令进行导出:
gpg --armor --export 145BB196C917B616
之后需要在git中通过相关命令设置签名:
git config --global user.signingkey 145BB196C917B616
同时,你还需要把你的密钥上传的一个公共查询服务器上:
gpg --keyserver hkp://keyserver.ubuntu.com --send-key [密钥ID]
- 找一个合适的地方,运行:
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
- 在你新clone 下的仓库里新建一系列的文件:
(1). 在 data/mntner 文件夹下创建一个名为 [昵称]-MNT 的文件,这个文件代表你的账户,用来认证你以后的操作。
下面是我的注册信息:
1 | mntner: DGY-MNT |
- 其中各项的含义如下:
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 | person: Guoyi Dai |
- 各项含义如下:
person
:你的昵称。e-mail
:你的邮箱。contact
:可选,你的其它联系方式,例如 IRC、Telegram 等。nic-hdl
:NIC handle
,指向文件本身,与文件名相同,[昵称]-DN42
。mnt-by
:maintain 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 | aut-num: AS4242420826 |
- 各项含义如下:
aut-num
:AS 号。as-name
:AS 的名称,一般只在 DN42 的一些网络结构示意图中看到。可以设置为[昵称]-AS
。descr
:AS 简介,一般只在结构图中看到,随意填写。admin-c
:admin contact(管理员联系信息)
,指向你的 person 文件,[昵称]-DN42
。tech-c
:tech contact(技术员联系信息)
,指向你的 person 文件,[昵称]-DN42
。mnt-by
:maintain 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 | inetnum: 172.23.196.0 - 172.23.196.31 |
- 各项含义如下:
inetnum
:你的这个地址块的范围,如果你不会算,那么可以根据你的地址块前后的用户推出,或者直接用 IP 地址计算器。netname
:你的这个地址块的名称,没什么用,随便取(但一般建议保持[昵称]-IPV4
格式)。remarks
:简介,随意填写。descr
:简介,随意填写。country
:你的国家代号,填 CN 代表中国大陆。admin-c
:admin contact(管理员联系信息)
,指向你的 person 文件,[昵称]-DN42
。tech-c
:tech contact(技术员联系信息)
,指向你的 person 文件,[昵称]-DN42
。mnt-by
:maintain by(由谁维护)
,由谁维护,指向你之前的 mntner 文件,[昵称]-MNT
。nserver
:IP 地址反向解析的 DNS 服务器。如果你不知道这个是什么,或者不需要这个,可以去掉。status
:固定为ASSIGNED
。cidr
:你的地址块的范围,与inetnum
相同,只是以 CIDR 方式表示。source
:固定为DN42
。
- 注册 IP 的过程还没结束,你还需要创建一个 route 对象,授权某个 AS 使用这个地址。在 data/route 文件夹创建对应文件,例如我的是
data/route/172.23.196.0_27
:
1 | route: 172.23.196.0/27 |
- 各项含义如下:
route
:你的这个地址块的范围。descr
:简介,随意填写。origin
:你授权哪个 AS 使用这个地址块,填写你的 AS 编号。mnt-by
:maintain by(由谁维护)
,由谁维护,指向你之前的 mntner 文件,[昵称]-MNT
。source
:固定为DN42
。
- 现在都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 | inet6num: fd11:552f:74db:0000:0000:0000:0000:0000 - fd11:552f:74db:ffff:ffff:ffff:ffff:ffff |
- 各项含义如下:
inet6num
:你的这个地址块的范围。IPv6 的范围算起来很简单,从全 0 到全 f。netname
:你的这个地址块的名称,没什么用,随便取(但一般建议保持[昵称]-IPV6
格式)。remarks
:简介,随意填写。descr
:简介,随意填写。country
:你的国家代号,填 CN 代表中国大陆。admin-c
:admin contact(管理员联系信息)
,指向你的 person 文件,[昵称]-DN42
。tech-c
:tech contact(技术员联系信息)
,指向你的 person 文件,[昵称]-DN42
。mnt-by
:maintain by(由谁维护)
,由谁维护,指向你之前的 mntner 文件,[昵称]-MNT
。nserver
:IP 地址反向解析的 DNS 服务器。如果你不知道这个是什么,或者不需要这个,可以去掉。status
:固定为ASSIGNED
。cidr
:你的地址块的范围,与inetnum
相同,只是以 CIDR 方式表示。source
:固定为DN42
。
- 与上面的IPV4一样,你还需要在
data/route6
中创建一个route6
的对象,授权你自己的AS使用,例如我的就是data/route6/fd11:552f:74db::_48
:
1 | route6: fd11:552f:74db::/48 |
每项含义和IPV4相同,此处不再赘叙。
- 你可能还需要一个域名?(第一次注册的时候可以先略过,后续再补充)
在dn42中,所有的域名都是以*.dn42
结尾的,你可能需要搭建自己的权威dns服务器(如bind, powerdns等)。
创建data/dns/dgy.dn42
然后填写:
1 | domain: dgy.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 | # 获取更新 |
- 然后执行
git push -f
上传自己的修改。 - 回到 dn42/registry 发起pull request, 等待merge哦~
请注意:虽然部分管理员是中国人,但是dn42的官方语言是英语,请使用英语发起pr哦。
如果你的pr有问题,管理员会给你回复,修改好之后直接push就可以,不需要再次提交pr了。
联系:
有什么问题请发送邮件至 i@dgy.xyz 或者去非官方 Telegram 群组寻找帮助。