加入DN42网络
本文介绍如何加入DN42网络。
注意事项
本文仅仅作为技术介绍,不承担你导致的任何后果和法律风险,你应该遵守你所在国家的要求和法规。
什么是DN42?
DN42是一个网络,使用几个保留的IP段和ASN段来模拟真实的互联网,换言之,在你真的开始注册真的ASN并试图成为ISP之前,DN42是很好的练习场,减少直接开干炸掉半个互联网的风险。但这就意味着在DN42中注册和连接与在现实世界中非常相似,你需要提交材料、选择ASN和IP段、注册域名,然后亲自和其他用户协商进行Peer(也可能是和他们的Auto Peer程序)。
DN42不是一个出口服务的网络,他的目的是测试和学习。
设备要求
- 你至少需要一台能够7x24不间断的服务器或路由器,由于作者本人使用的是Linux服务器来完成,而且大多数DN42用户也都使用Linux服务器进行路由,我建议你使用同样的方式。
- 你的设备必须能够接入互联网并与其他设备建立连接,这意味着你必须有公网IP。
因此显然,比较好的选择就是租赁一台能够稳定运行的Linux服务器。
前期准备
如果你使用Windows操作系统,请安装WSL或者使用Linux/macOS等,因为在接下来的某些文件会涉及到与Windows文件规范相悖的文件。
注册DN42的ASN、IP段、域名
前往dn42 git,注册一个账号,这将是你日后操作个人信息提交个人资料的地方,也是存放了DN42其他用户信息的地方。(记得验证邮件可能会出现在垃圾邮件分类里面)
前往dn42/registry仓库,Fork这个仓库。
点击进入你Fork到自己账户的那个仓库,然后Clone它,千万不要Clone dn42/registry原仓库!
在data/mntner中创建一个文件
{你的昵称}-MNT,比如EXAMPLE-MNT,这将是你日后使用的名字,而文件内容应该如下 (不要自己从头写这个文件,一定要修改值而不破坏这个文件的结构和空格!):1
2
3
4
5
6
7
8mntner: EXAMPLE-MNT
admin-c: EXAMPLE-DN42
tech-c: EXAMPLE-DN42
mnt-by: EXAMPLE-MNT
source: DN42
auth: pgp-fingerprint exampleexample........
auth: ssh-rsa exampleexample........
remarks:这里所有的EXAMPLE都应该替换为你文件名中的昵称,
auth中的内容和remarks中的内容我们在下文指导你填写,其实,其中一部分可以采用别的名字,但对于个人注册者完全没有任何必要,各项含义如下,了解含义后你就知道哪些是可能采用别的名字的而哪些不行:mntner:即维护者,必须与文件名一致admin-c:即管理员信息,这个需要和后续创建的person文件完全一致,一般来说保持EXAMPLE-DN42的格式。tech-c:即技术人员信息,同样在后续指向person文件,一般来说也保持EXAMPLE-DN42的格式。mnt-by:即维护者,指向账户自己,最好和mntner一致。source:显然在这里只能是DN42.auth:极其重要的一部分,会在后续用于验证你是你,有两种可接受的方式,一种是GPG,另一种是SSH,都为公钥,一定不要把你的私钥泄露出去!!!在这里我建议你同时提交GPG和SSH两种,因为在资料提交中GPG还会用到,而很多Auto peer两者都会支持,多一种验证方式可以减少别人的工作,让他们自己选择更方便的方式。GPG:(此部分内容部分来自生成新 GPG 密钥 - GitHub 文档)
下载GnuPG程序,根据你的操作系统安装。
打开终端,生成密钥对,如果你使用的GPG版本>=2.1.17,运行:
1
gpg --full-generate-key
密钥类型、大小以及过期时长可以直接
Enter接受默认值,也可以按照你自己的要求修改。验证你的选择,输入你的用户ID信息,输入电子邮件时请使用你注册dn42 git时给出的Email。
输入密码。
将GPG公钥上传至Ksyserver中,这里我们将GPG公钥上传至Ubuntu的Keyserver,首先:
1
gpg --list-keys
之后复制给出的公钥ID。
上传:
1
gpg --keyserver hkp://keyserver.ubuntu.com --send-keys {你之前得到的ID}
你可能会好奇为什么我们这里只需要上传到Ubuntu的Keyserver,因为在Keyserver之间有公钥的交换,因此只要上传到一个,其他的也都会得知你的公钥。
最后把 ID 填写到
auth中,格式如pgp-fingerprint {ID}。
SSH:
- 对于Linux和macOS只需要
ssh-keygen -t ed25519,当然,你也可以用RSA。 - 生成完成后,你需要到
~/.ssh目录下,找到id_ed25519.pub或者id_rsa.pub并把里面的公钥以ssh-ed25519 {公钥}或者ssh-rsa {公钥}格式添加到auth。
- 对于Linux和macOS只需要
remarks:只是一个备注。
前往
data/person目录,创建一个{昵称}-DN42的文件,对于上文并没有按要求将维护者、技术人员信息填写为该格式的需要自己解决,文件内容应该是:1
2
3
4
5
6person: EXAMPLE
e-mail: example@example.com
contact: example
nic-hdl: EXAMPLE-DN42
mnt-by: EXAMPLE-MNT
source: DN42你需要将所有
EXAMPLE改为你的昵称,同时e-mail字段改为你自己的电子邮件,contact改为你的其他联系方式。决定一个ASN,你当然可以选择手动从4242420000到4242423999中选择一个没被使用过的ASN,但如果你觉得麻烦,你可以用DN42 Free Explorer-ASN并从中选择一个。在选择好后,新建一个文件
data/aut-num/{你的ASN},文件内容应该如下:1
2
3
4
5
6
7aut-num: {你的ASN}
as-name: EXAMPLE-AS
descr: {写点简介}
admin-c: EXAMPLE-DN42
tech-c: EXAMPLE-DN42
mnt-by: EXAMPLE-MNT
source: DN42仍然把
EXAMPLE改为你自己的昵称,其他值根据我的提示修改。虽然可以在DN42中用真实ASN,但会有些麻烦,还会有一些Auto peer的程序的问题,不太建议。
选择一段IPv4段,你可以直接申请的最大块为
/26,高达62个IP地址,如果你不需要那么多的IP地址,我建议你申请/27,而最小可申请的块是/29,只有8个IP地址,考虑到你日后可能会接入多台设备,/27对于很多用户而言已经绰绰有余。但如果你真的要申请特别多的IP地址(甚至超过了62个),你可以去IRC或者邮件列表给出理由并请求大家同意,如果你没那个需求,一定不要注册太大的地址块。即使你真的获得了/24这样的大地址块,当你不需要的时候也应该将其释放。随后你要去DN42 Free Explorer-IPv4上找一段可用的地址块,一定不要手动去选!!!!!当你选择好IP地址块之后就要去创建文件了,比如对于172.23.167.32/27(我随意找的,你一定要从工具上找可用的地址块),你要创建一个文件data/inetnum/172.23.167.32_27,然后如果你不会算IP地址块的范围或者你懒得算,你可以找一个IP计算器,然后开始填写这个文件:1
2
3
4
5
6
7
8
9
10
11
12
13inetnum: 172.23.167.33 - 172.23.167.62
netname: EXAMPLE-IPV4
remarks: {简介}
descr: {简介}
country: CN
admin-c: EXAMPLE-DN42
tech-c: EXAMPLE-DN42
mnt-by: EXAMPLE-MNT
nserver: ns1.example.dn42
nserver: ns2.example.dn42
status: ASSIGNED
cidr: 172.23.167.32/27
source: DN42这个文件对新手而言有些难以理解,接下来我会仔细介绍每一个你需要填写的项目,当然所有的
EXAMPLE依旧要替换为你自己的昵称,除了nserver的那两项!!!!!:inetnum:地址块的地址范围,当你把地址块输入给计算器之后,计算器会告诉你地址从哪开始从哪结束,你只需要按照他告诉你的填写,比如在这里就是从172.23.167.33开始到172.23.167.62结束。netname:你的IP地址块的名字,随便取,但最好保持这个格式。remarks和descr:都是简介。country:你的国家。nserver:你可能不知道这是什么,但我非常建议你预留好,并且你应该确保example处替换的域名没被人注册过,你可以在DN42 Registry Explorer处找到是否有人注册过。cidr:非常简单,就是你的地址块,在这里就是172.23.167.32/27。
但还没完,你还需要新建一个文件例如
data/route/172.23.167.32_27,这是为了告诉别人这段IP属于哪个AS:1
2
3
4
5route: {你的IP地址块,比如172.23.167.32/27}
descr: {简介}
origin: {你的ASN}
mnt-by: {你的昵称}-MNT
source: DN42按照要求修改即可。
现在IPv6正在逐渐的推广(或许可以说已经很广了),尽管在DN42网络中IPv4还很充足,但是现实互联网的IPv4早已耗尽,因此你应该注册IPv6。
你不应该自定义一个IPv6地址段,你一定要随机生成一个,用类似DN42 Free Explorer-IPv6这样的工具。然后我们还是需要填写类似IPv4注册时的两个文件,这里我以fdc3:b0fb:78c7::/48作为演示,创建一个文件
data/inet6num/fdc3:b0fb:78c7::_48:1
2
3
4
5
6
7
8
9
10
11
12inet6num: fdc3:b0fb:78c7:0000:0000:0000:0000:0000 - fdc3:b0fb:78c7:ffff:ffff:ffff:ffff:ffff
netname: {你的昵称}-IPV6
descr: {简介}
country: CN
admin-c: {你的昵称}-DN42
tech-c: {你的昵称}-DN42
mnt-by: {你的昵称}-MNT
nserver: ns1.example.dn42
nserver: ns2.example.dn42
status: ASSIGNED
cidr: fdc3:b0fb:78c7::/48
source: DN42IPv6的地址很好算,其他地方的填写和IPv4都很类似,
inet6num处你只需要把fdc3:b0fb:78c7换成你选择的块的就可以,记得替换cidr的地址块和nserver的域名。
然后再创建一个文件data/route6/fdc3:b0fb:78c7::_48,和IPv4的注册也非常的像:1
2
3
4
5route6: fdc3:b0fb:78c7::/48
descr: {简介}
origin: {你的ASN}
mnt-by: {你的昵称}-MNT
source: DN42这样IPv6的注册你也完成了。
接下来你要注册域名了,还记得我们上面提到的
nserver吗,我们现在把之前决定的域名给注册了,在此之前你需要再次确认在你注册时候你要注册的域名没被任何人注册,我们以example举例,创建文件data/dns/example.dn42:1
2
3
4
5
6
7domain: example.dn42
admin-c: {你的昵称}-DN42
tech-c: {你的昵称}-DN42
mnt-by: {你的昵称}-MNT
nserver: ns1.example.dn42 172.23.167.34
nserver: ns2.example.dn42 172.23.167.35
source: DN42在这里你
nserver后面的IP地址一定是你所有的(正常来说),你也可以加IPv6的地址,取决于你的需要。我们终于填写好了所有我们需要写的材料了,接下来就是提交你的材料并交给管理员进行审核,这一步骤依旧用到Git,所以你应该确保你还在Linux/macOS或者WSL等环境下。
首先回到仓库根目录,执行:
1
2git add .
git commit -S注意!这里的
git commit -S要用你之前生成的GPG进行签名!,如果你之前commit过,你应该执行./squash-my-commits来合并你的commit。
因为填写资料会花费很多时间,而DN42网络相对来说很活跃,你在提交之前应该更新别人的更改:1
2
3
4
5git fetch origin master
git checkout {你的DN42 git账户名}/register
# 输入这行命令后会出现一个编辑器,保留第一行的pick。
# 把之后的所有存在的pick全部改成 squash,保存并退出。
git rebase -i -S origin/master执行
git push -f上传你的更改。
回到dn42/registry,发PR,等待管理员检查你的材料并合并,如果有错误你要配合管理员进行修改,你只需要git commit和git push,无需开新的PR。
当你的请求被合并,你就正式的注册进了DN42网络,可以开始和其他人Peer了。
准备好你的设备
把所有的UFW等简单配置iptables的工具关掉并手动配置。
开启你的服务器的Linux内核的数据包转发功能,同时关掉Linux 内核
rp_filter的严格模式:1
2
3
4
5
6
7
8echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.forwarding=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
sysctl -p
echo "net.ipv4.conf.default.rp_filter=0" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.rp_filter=0" >> /etc/sysctl.conf
sysctl -p
准备好桥接软件
如果你用的是Linux的VPS或者服务器,并且VPS不是OpenVZ或者LXC虚拟化,那你可以用WireGuard,对于OpenVZ或者LXC,可以尝试wireguard-go,但据说有稳定性问题。
对于对于OpenVZ或者LXC的VPS可以用OpenVPN,但由于作者除了Wireguard都没用过,本文只能介绍如何用Wireguard连接。
当然还有很多其他种类的连接方式,你可以自行探索或者查阅其他教程。
准备好BGP软件
作者在这里只介绍和使用一种,BIRD Internet Routing Daemon (v2),接下来的教程也都会使用它进行。
配置好内网
如果你的内网用了一些路由协议来实现无需每台机器都互联,那你应该保证你的配置正确而不会导致劫持DN42网络的路由。
对于其他互联,你也应该保证对DN42网络不会有负面影响甚至是劫持。
换言之,来自DN42的外部路由都应该由BGP处理。