警告:
本人只是一名高三学生,在此之前对于BGP等技术一无所知,因此,本文可能包含但不限于 笔误/错误/小白理解 请大佬勿喷,如果能指正出来那就更好啦

再次警告:
如果您能接受的话,可以继续看下去,如果不能接受,建议现在就关闭此文章


前言

为什么要入坑DN42?

出于对于未来职业可能的考虑,以及对于技术的好奇,我开始在网上搜索关于BGP/Anycast的相关知识,但是为了国际互联网的安全 其实是ASN/服务器太贵了 ,决定先入坑DN42练好技术再上真货 也可能不上了就

什么是DN42?

dn42是一个大型的动态VPN,它采用了互联网技术(BGP、whois数据库、DNS等)。参与者使用网络隧道(GREOpenVPNWireGuardTincIPsec)相互连接,并通过边界网关协议(Border Gateway Protocol)交换路由。网络地址分配在 172.20.0.0/14 范围内,并使用私有AS号(参见registry),以及使用ULA范围(fd00::/8)的IPv6地址。

——引用自 DN42 Wiki

DN42的初衷是为互联网工作者提供一个用于模拟真实网络环境的沙盒,因此使用 DN42 的门槛比较高。就像在真实互联网中一样,你要扮演一个 ISP(互联网服务提供商),注册自己的个人信息,ASN 号码,IPv4 和 IPv6 的地址池,并且使用 BGP 在自己的服务器上广播它们。你还要和其它的用户联系,和他们做 Peering(对接),一步步进入完整的 DN42 网络。

你能在DN42里干什么?

Do whatever is fun and interesting for you
做任何对你来说有趣和有趣的事情

—— burble

加入DN42!

加入DN42的前置要求

  • 你至少有一个 24/7 全天候运行的路由器。任何 Linux 或 BSD 设备都可以变成路由器。如果你的家用路由器运行的是 OpenWRT,你可以考虑用它来连接 dn42。

  • 您的路由器能够通过互联网建立网络隧道(Wireguard、GRE、OpenVPN、IPSec、Tinc 等)。请注意,您的网络运营商可能会过滤此类流量,例如在学校或大学。

  • 您通常对网络和路由有一定了解(例如,您听说过 BGP、IGP、转发,并且愿意配置 BGP 路由器,例如 FRR 或 Bird)

如果您不具备上述能力,您可能在配置过程中出现问题,给DN42中的其他用户带来麻烦。

如何注册DN42的AS

DN42的注册过程比较繁琐,可能需要几天(但是没有注册真实的AS那么麻烦),提交信息(发PR),之后可能会被要求修改几次,耐心配合即可。

本文信息可能随DN42政策的改变而过时,请优先参考DN42的官方注册流程,此处仅为参考。
官方Wiki

注册流程大致如下:

  • 这里注册一个Git账户。这相当于 DN42 内的 GitHub,账户信息就存放在其中的一个仓库里。

  • Frok官方仓库

  • 进入你账户里Frok的那个仓库,把它 Clone 下来。

  • 这个网站选择一个你喜欢的IPv4,IPv6以及ASN

    你在 DN42 内能申请的最小地址块是 /29,即 8 个 IP,其中除去第一个 IP 标记地址块,最后一个 IP 作为地址块内广播(broadcast)不可用以外,可以分给 6 个服务器和设备。

    对于 「只想简单玩玩」 的用户,/29 已经够了。

    如果你满足下列一项,那么 /29 不够你用,需要申请更大的地址块:

    • 服务器、设备多,超过了 6 个
    • 你准备自己配置些 Anycast 之类的,需要占用更多的 IP
    • 你使用的一些设备(例如 Mikrotik 路由器),在 Peering(对接)阶段建立隧道时,只能使用 /30 地址块。
      • 在后续 Peering(对接)阶段,Linux 服务器可以配置单个 IP 到单个 IP 的隧道。同时,我这端的一个地址可以同时用在多个隧道中,这意味着我可以同时设置任意多的隧道,与任意多的人 Peer,而不需要额外的 IP。
      • 但如果你的设备要求使用 /30 地址,意味着一个隧道就需要占用 4 个 IP 地址,并且你这端的地址无法重复使用,比较浪费。
      • 此时你需要预留较多的地址,因为 DN42 内物理路由器较少见,与你对接的另一位一般也没有预留这么多地址,这个 /30 地址块需要由你出。

    DN42 一般建议申请 /27,你能直接申请的最大地址块是 /26。

  • 生成一个 GPG 公钥 或 SSH 公钥(群友推荐SSH)

    必须在 GPG 公钥和 SSH 公钥中添加至少一种。
    如果你准备添加 GPG 公钥:

    • 首先你需要创建一个(如果你之前没有的话),例如参照 GitHub 的这份教程操作。后续提交过程也会用到这个公钥。
    • 你还需要将你的 GPG 公钥上传到公共查询服务器,称为 Keyserver。
    • 上传步骤请参考阮一峰的这份教程,并将 keyserver 参数替换成 hkp://keyserver.ubuntu.com,例如:gpg --keyserver hkp://keyserver.ubuntu.com --send-key [密钥ID]

    如果你准备添加 SSH 公钥:

    • 首先你需要创建一个(如果你之前没有的话)。
    • Mac 和 Linux 一般运行 ssh-keygen -t ed25519 即可,但如果你的 SSH 版本特别老不支持 ED25519 密钥,也可以使用 RSA,ssh-keygen -t rsa
    • Windows 可以下载 PuTTY,使用其中的 puttygen 工具生成。
    • 生成完成后,将公钥(Mac 和 Linux 一般在 ~/.ssh 目录下,名为 id_ed25519.pub 或者 id_rsa.pub;Windows 下 puttygen 会直接在窗口上显示公钥)
    • 此外,DN42 上有些服务会以此处的 SSH 公钥来验证你的身份。

    提示:
    可以阅读 DN42 官方的身份认证 Wiki 页面获取更多信息。

  • 想一个全英文昵称,可以是你名字的音译/拼音或其他,总之,必须是全英文且为被DN42中的其他人使用

  • 将刚刚的所有信息整合,你有了:Nickname,ASN,IP,IPv6,Key(GPG or SSH),计算出你IPv4的起始与终止IP,你也可以用IP地址计算器算出StartIP,EndIP

  • 使用一个你喜欢且能联系到你的邮箱记作 EMAIL,选择一个你喜欢的且能联系到你的联系方式记作 contact

  • 假设你已经进入本地clone的目录中,将下面的内容复制到记事本中,使用Ctrl+F全字替换为你自己的信息,然后在Terminal中粘贴。如果不想,也可以将你的信息写入系统变量中,然后直接在Terminal中粘贴,并进行少量修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
Nickname 昵称  
ASN 此处ASN为AS后的数字
IP
StartIP 起始IP
EndIP 终止IP
IPv6 此处iPv6为::/48的前的内容
EMAIL 可联系到的邮箱
contact 联系方式
Key : GPG or SSH

echo '
mntner: ${Nickname}-MNT
admin-c: ${Nickname}-DN42
tech-c: ${Nickname}-DN42
mnt-by: ${Nickname}-MNT
source: DN42
auth: ${Key}
remarks: peer with me at ${EMAIL}'>data/mntner/${Nickname}-MNT

echo '
person: ${Nickname}
e-mail: ${EMAIL}
contact: ${contact}
nic-hdl: ${Nickname}-DN42
mnt-by: ${Nickname}-MNT
source: DN42'>data/person/${Nickname}-DN42

echo '
aut-num: ${ASN}
as-name: ${Nickname}-AS
descr: Peer with me at ${EMAIL}
admin-c: ${Nickname}-DN42
tech-c: ${Nickname}-DN42
mnt-by: ${Nickname}-MNT
source: DN42'>data/aut-num/AS${ASN}

echo '
inetnum: ${StartIP} - ${EndIP}
netname: ${Nickname}-IPV4
remarks: Peer with me at ${EMAIL}
descr: Peer with me at ${EMAIL}
country: CN
admin-c: ${Nickname}-DN42
tech-c: ${Nickname}-DN42
mnt-by: ${Nickname}-MNT
status: ASSIGNED
cidr: ${IP}
source: DN42'>data/inetnum/${IP} #此处需要将IP中的 / 替换为 _

echo '
route: ${IP}
descr: Peer with me at ${EMAIL}
origin: ${ASN}
mnt-by: ${Nickname}-MNT
source: DN42'>data/route/${IP} #此处需要将IP中的 / 替换为 _

echo '
inet6num: ${IPv6}:0000:0000:0000:0000:0000 - ${IPv6}:ffff:ffff:ffff:ffff:ffff
netname: ${Nickname}-IPV6
descr: Peer with me at ${EMAIL}
country: CN
admin-c: ${Nickname}-DN42
tech-c: ${Nickname}-DN42
mnt-by: ${Nickname}-MNT
status: ASSIGNED
cidr: ${IPv6}::/48
source: DN42'>data/inet6num/{IPv6}::_48

echo '
route6: ${IPv6}::/48
descr: Peer with me at ${EMAIL}
origin: ${ASN}
mnt-by: ${Nickname}-MNT
source: DN42'>data/route6/{IPv6}::_48
  • 现在,您建立完了所有需要的文件,首先在仓库根目录运行./fmt-my-stuff 你的mntner名字格式化您的所有文件
  • 然后git add .git commit -S来签名commit您的更改
  • 如果您已经commit了多次,注意DN42的PR只接受单个commit,所以需要运行./squash-my-commits -S来扁平化您的commit
  • 执行git push -f将更改推送至服务器,然后去网页上创建PR
    • 一次注册/信息修改只用发一个PR
    • 如果被要求修改,改完并squash了之后直接git push -f就行,不用关闭并开新的PR
    • 发PR用英文

在您的PR被合并之后,您就拥有了自己的AS和地址块,接下来就可以去找人Peer了

参考文献

感谢以下文章对本小白踏入 DN42 提供了巨大的帮助!
DN42 实验网络介绍(2020 版)
BIRD 与 BGP 的新手开场
Multiple servers on dn42: iBGP and IGPs
萌新入坑 DN42 之 —— 多服务器互联