加入DN42网络

本文介绍如何加入DN42网络。

注意事项

本文仅仅作为技术介绍,不承担你导致的任何后果和法律风险,你应该遵守你所在国家的要求和法规。

WARNING

根据中国大陆法律要求,你不应该在任何中国大陆境内的服务器上试图接入DN42,大多数用户也不会接受来自中国大陆的Peer(对等互联),我也不建议你与任何来自中国大陆的服务器进行Peer。

什么是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段、域名

  1. 前往dn42 git,注册一个账号,这将是你日后操作个人信息提交个人资料的地方,也是存放了DN42其他用户信息的地方。(记得验证邮件可能会出现在垃圾邮件分类里面)

  2. 前往dn42/registry仓库,Fork这个仓库。

  3. 点击进入你Fork到自己账户的那个仓库,然后Clone它,千万不要Clone dn42/registry原仓库!

  4. 在data/mntner中创建一个文件 {你的昵称}-MNT,比如 EXAMPLE-MNT,这将是你日后使用的名字,而文件内容应该如下 (不要自己从头写这个文件,一定要修改值而不破坏这个文件的结构和空格!)

    1
    2
    3
    4
    5
    6
    7
    8
    mntner:             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 文档

        1. 下载GnuPG程序,根据你的操作系统安装。

        2. 打开终端,生成密钥对,如果你使用的GPG版本>=2.1.17,运行:

          1
          gpg --full-generate-key
        3. 密钥类型、大小以及过期时长可以直接 Enter接受默认值,也可以按照你自己的要求修改。

        4. 验证你的选择,输入你的用户ID信息,输入电子邮件时请使用你注册dn42 git时给出的Email。

        5. 输入密码。

        6. 将GPG公钥上传至Ksyserver中,这里我们将GPG公钥上传至Ubuntu的Keyserver,首先:

          1
          gpg --list-keys

          之后复制给出的公钥ID。

        7. 上传:

          1
          gpg --keyserver hkp://keyserver.ubuntu.com --send-keys {你之前得到的ID}

          你可能会好奇为什么我们这里只需要上传到Ubuntu的Keyserver,因为在Keyserver之间有公钥的交换,因此只要上传到一个,其他的也都会得知你的公钥。

        8. 最后把 ID 填写到 auth 中,格式如 pgp-fingerprint {ID}

      • SSH:

        1. 对于Linux和macOS只需要 ssh-keygen -t ed25519,当然,你也可以用RSA。
        2. 生成完成后,你需要到 ~/.ssh 目录下,找到 id_ed25519.pub 或者 id_rsa.pub并把里面的公钥以 ssh-ed25519 {公钥} 或者 ssh-rsa {公钥} 格式添加到 auth
    • remarks:只是一个备注。
  5. 前往 data/person目录,创建一个 {昵称}-DN42的文件,对于上文并没有按要求将维护者、技术人员信息填写为该格式的需要自己解决,文件内容应该是:

    1
    2
    3
    4
    5
    6
    person:             EXAMPLE
    e-mail: example@example.com
    contact: example
    nic-hdl: EXAMPLE-DN42
    mnt-by: EXAMPLE-MNT
    source: DN42

    你需要将所有 EXAMPLE改为你的昵称,同时 e-mail字段改为你自己的电子邮件,contact改为你的其他联系方式。

  6. 决定一个ASN,你当然可以选择手动从4242420000到4242423999中选择一个没被使用过的ASN,但如果你觉得麻烦,你可以用DN42 Free Explorer-ASN并从中选择一个。在选择好后,新建一个文件 data/aut-num/{你的ASN},文件内容应该如下:

    1
    2
    3
    4
    5
    6
    7
    aut-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的程序的问题,不太建议。

  7. 选择一段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
    13
    inetnum:            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地址块的名字,随便取,但最好保持这个格式。
    • remarksdescr:都是简介。
    • 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
    5
    route:              {你的IP地址块,比如172.23.167.32/27}
    descr: {简介}
    origin: {你的ASN}
    mnt-by: {你的昵称}-MNT
    source: DN42

    按照要求修改即可。

  8. 现在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
    12
    inet6num:           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: DN42

    IPv6的地址很好算,其他地方的填写和IPv4都很类似,inet6num处你只需要把fdc3:b0fb:78c7换成你选择的块的就可以,记得替换cidr的地址块和nserver的域名。
    然后再创建一个文件data/route6/fdc3:b0fb:78c7::_48,和IPv4的注册也非常的像:

    1
    2
    3
    4
    5
    route6:             fdc3:b0fb:78c7::/48
    descr: {简介}
    origin: {你的ASN}
    mnt-by: {你的昵称}-MNT
    source: DN42

    这样IPv6的注册你也完成了。

  9. 接下来你要注册域名了,还记得我们上面提到的nserver吗,我们现在把之前决定的域名给注册了,在此之前你需要再次确认在你注册时候你要注册的域名没被任何人注册,我们以example举例,创建文件data/dns/example.dn42

    1
    2
    3
    4
    5
    6
    7
    8
    9
    domain:             example.dn42
    admin-c: {你的昵称}-DN42
    tech-c: {你的昵称}-DN42
    mnt-by: {你的昵称}-MNT
    nserver: ns1.miaonet.dn42 172.20.3.34
    nserver: ns1.miaonet.dn42 fd30:5eca:777a:0000:0000:0000:0000:0003
    nserver: ns2.miaonet.dn42 172.20.3.35
    nserver: ns2.miaonet.dn42 fd30:5eca:777a:0000:0000:0000:0000:0004
    source: DN42

    在这里你nserver后面的IP地址一定是你所有的(正常来说),你也可以加IPv6的地址,取决于你的需要。

  10. 我们终于填写好了所有我们需要写的材料了,接下来就是提交你的材料并交给管理员进行审核,这一步骤依旧用到Git,所以你应该确保你还在Linux/macOS或者WSL等环境下。

    注意:如果你使用WSL。

    你应该使用:

    1
    export GPG_TTY=$(tty)

    来解决git commit时候签名失败的问题

    首先回到仓库根目录,执行:

    1
    2
    git add .
    git commit -S

    注意!这里的git commit -S要用你之前生成的GPG进行签名!,如果你之前commit过,你应该执行./squash-my-commits来合并你的commit。
    因为填写资料会花费很多时间,而DN42网络相对来说很活跃,你在提交之前应该更新别人的更改:

    1
    2
    3
    4
    5
    git fetch origin master
    git checkout {你的DN42 git账户名}/register
    # 输入这行命令后会出现一个编辑器,保留第一行的pick。
    # 把之后的所有存在的pick全部改成 squash,保存并退出。
    git rebase -i -S origin/master

    执行git push -f上传你的更改。
    回到dn42/registry,发PR,等待管理员检查你的材料并合并,如果有错误你要配合管理员进行修改,你只需要git commitgit push,无需开新的PR。
    当你的请求被合并,你就正式的注册进了DN42网络,可以开始和其他人Peer了。

准备好你的设备

  1. 把所有的UFW等简单配置iptables的工具关掉并手动配置。

  2. 开启你的服务器的Linux内核的数据包转发功能,同时关掉Linux 内核 rp_filter 的严格模式:

    1
    2
    3
    4
    5
    6
    7
    8
    echo "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),接下来的教程也都会使用它进行。
对于Bird 2的安装,你可以参考如何在 Linux 上安装最新版本的 BIRD? | BIRD 中文文档上的内容来安装。

安装好之后看起来应该像:

1
2
root@miao:~# birdc -v
0001 BIRD 2.17.2 ready.

你应该按照howto/Bird2上的要求来完成bird2的配置和安装。

配置好内网

如果你的内网用了一些路由协议来实现无需每台机器都互联,那你应该保证你的配置正确而不会导致劫持DN42网络的路由。
对于其他互联,你也应该保证对DN42网络不会有负面影响甚至是劫持。

换言之,来自DN42的外部路由都应该由BGP处理。

开始Peer

Peer有非常多不同的可以的方式,这里我们使用WG作为隧道连接,Bird2作为BGP软件,采用MP-BGP on IPv6、IPv6 LLA、Extended next hop进行对等互联。

什么是MP-BGP on IPv6?

简单来说就是,所有的BGP全部通过IPv6传输,包括IPv4的部分,也就是通过 IPv6 BGP 会话交换 IPv4 路由,这样就只需要配置IPv6,而IPv4的部分不需要额外配置了。

当然,如果你想,你其实也可以MP-BGP on IPv4。

什么是IPv6 LLA

是IPv6链路本地地址,原则上只在两台设备链路中有效,非常方便。

寻找邻居

你可以在很多地方找到邻居,包括DN42的一些在线群组和网站,我建议你作为新手先不要使用Autopeer,即便使用,你也应该先手动配置过几次Peer确保你能在Autopeer程序出错时及时解决。

邻居的服务器物理位置应该离你很近才对,比如一台在香港的服务器也应该寻找一个在香港的邻居,如果你的邻居在新加坡,延迟合理的情况下也是可以接受的,但如果你的邻居在美国,而且延迟非常巨大,我不建议你这样Peer。

配置隧道

你的邻居可能会给你类似如下的Peer信息:

1
2
3
4
5
6
7
8
9
10
11
DN42 IPv4: 172.23.13.33
DN42 IPv6: fdc3:b0fb:78c7:0000:0000:0000:0000:0002
ASN: AS4242421213
Public Key: 88E4WU0vdXlGQyNFcm2h2JRx9k5pYH18lVGvY0ZC534=
IPv4: xxx.xxx.xxx.xxx
IPv6: xxxx::xxxx
Extended next hop: enabled
MP-BGP: enabled (on IPv6)
WireGuard Port: last 5 digits of your ASN
IPv6 LLA: fe80::1213
Bandwidth: 10G

根据他告诉我们的信息(这其实是我的信息,隐去了公网IPv4和IPv6),我们知道WG的端口号应该是我们ASN的后五位,他的IPv6 LLA是fe80::1213,通常来说你的IPv6 LLA应该是fe80::你ASN的后五位,这里他还告诉了我们他的DN42的IPv4和IPv6,但其实因为我们的配置方式所以这些信息并没有用处,当然如果你想要IPv6连通性,可以把IPv6加上。

配置文件如下,配置文件应该放在/etc/wireguard下,比如example.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Interface]
# 你的 WireGuard 私钥
PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
# 你的邻居的端口号
ListenPort = 2XXXX
Table = off

# Link-local IPv6 地址(用于 MP-BGP 通信) ,改为你的IPv6 LLA!!!
PostUp = ip addr add fe80::1213/64 dev %i

# DN42 IPv6 地址(可选,如果你们需要 IPv6 连通性),改为你的DN42 IPv6地址!!!
PostUp = ip addr add fdc3:b0fb:78c7:0000:0000:0000:0000:0002/128 dev %i

PostUp = sysctl -w net.ipv6.conf.%i.autoconf=0

[Peer]
# 你的Peer的公钥
PublicKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
# 你的 Peer 的服务器地址和端口号,端口号一般为你的 ASN 的后五位
Endpoint = xxx.xxx.xxx.xxx:21313
AllowedIPs = 10.0.0.0/8, 172.20.0.0/14, 172.31.0.0/16, fd00::/8, fe80::/10

务必修改所有要求修改的内容,对于没有要求的一律不得修改。

配置Bird2

/etc/bird/peers下新建文件,比如dn42_example.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protocol bgp dn42_example from dnpeers {
neighbor fe80::1213 % 'example' as 4242421213;
ipv4 {
import all;
export all;
extended next hop;

};

ipv6 {
import all;
export all;
next hop self;
};
};

dn42_example改为你喜欢的名字,fe80::1213改为你邻居的IPv6 LLA,example改为你刚才WG的隧道文件名(不包括.conf!!!),4242421213改为你邻居的ASN。

添加DN42 dummy

务必添加,不懂请搜索引擎搜索。如果用netplan请在netplan里面也写。

1
2
3
4
ip link add dn42-dummy type dummy
ip link set dev dn42-dummy up
ip addr add dev dn42-dummy <router ip>/<subnet>
ip addr add dev dn42-dummy <router ip6>/<subnet>

<router ip>/<subnet>,对于IPv4172.20.3.33则为172.20.3.33/32

<router ip6>/<subnet>,对于IPv6fd30:5eca:777a::2则为fd30:5eca:777a::2/128

如果你知道你在做什么,也可以按需修改。

运行隧道和Bird2

执行:

1
2
3
wg-quick up example
systemctl stop bird
systemctl start bird

systemctl处自行修改,但不要用restart!!!

尝试ping 172.23.0.80,这是DN42 wiki在DN42中的IPv4地址,如果成功了,那么再尝试ping一个内网的IPv6地址,都成功了就基本意味着你成功接入了DN42网络。

配置DNS

有很多种配置DNS的方法,我们在这里直接用DN42官方提供的Anycast DNS服务器:

1
2
# 编辑 resolv.conf(临时)
echo "nameserver 172.23.0.53" > /etc/resolv.conf

尝试ping wiki.dn42,这是DN42 wiki在DN42网络的域名。

配置自己的域名权威服务器

待完成。

作者

Moecat

发布于

2025-11-26

更新于

2025-12-30

许可协议