A LITTLE CORNER OF MY WORLD

慢慢读,不着急

想到哪儿写到哪儿,未必都对。

返回所有文章
教程

DN42网络速成指北(注册篇)

DN42 全称 Decentralized Network 42,是一个大型、去中心化的 VPN 网络,它用 BGP 和递归 DNS 等技术模拟一个真实的互联网环境,但不提供规避网络审查、流媒体解锁等类似服务。本文记录注册 DN42 的完整流程。

文章目录
  1. DN42实验网络介绍
  2. 注册 DN42
  3. 发起PR!
  4. 联系:

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的话),并且对你的基本能力要求还是比较高的,下面列出的仅仅是基本要求,未来在你研究逐渐深入的时候要求也会逐步上升:

  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
    输出应当如图所示:

    然后使用以下命令进行导出:
    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 的文件,这个文件代表你的账户,用来认证你以后的操作。
    下面是我的注册信息:
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 文件如下:

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-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文件如下:

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-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 内能申请的最小地址块是 /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:
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-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。
  1. 注册 IP 的过程还没结束,你还需要创建一个 route 对象,授权某个 AS 使用这个地址。在 data/route 文件夹创建对应文件,例如我的是data/route/172.23.196.0_27:
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-by:maintain 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:
    下面是我的注册信息,仅供参考:
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-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。
  1. 与上面的IPV4一样,你还需要在data/route6 中创建一个route6的对象,授权你自己的AS使用,例如我的就是data/route6/fd11:552f:74db::_48:
route6:             fd11:552f:74db::/48
descr:              Peer with me at dgy@dgy.xyz
origin:             AS4242420826
mnt-by:             DGY-MNT
source:             DN42

每项含义和IPV4相同,此处不再赘叙。
8. 你可能还需要一个域名?(第一次注册的时候可以先略过,后续再补充)
在dn42中,所有的域名都是以*.dn42结尾的,你可能需要搭建自己的权威dns服务器(如bind, powerdns等)。
创建data/dns/dgy.dn42然后填写:

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并签名,具体操作如下:
# 获取更新
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 群组寻找帮助。

✿

谢谢你读到这里,愿这一趟没白走。

戴郭轶
戴郭轶 / ntdgy

写代码,也写日子。想聊的话,邮箱一直开着。