初探 DN42 网络

初探 DN42 网络

DN42 全称 Decentralized Network 42(42 号去中心网络),是一个大型、去中心化的 BGP 网络。DN42 的目的是模拟一个互联网。它使用了大量在目前互联网骨干上应用的技术(例如 BGP 和递归 DNS),可以很好地模拟一个真实的网络环境。

DN42 适合以下类别的用户:

DN42 不适合以下类别的用户:

  • 单纯想要保护隐私、规避网络审查的用户
  • 在网内消耗大量流量,例如用于解锁流媒体服务的用户

所以,DN42 的使用门槛还是比较高的。这与在真实互联网中一样,你要扮演一个 ISP(互联网服务提供商),注册自己的个人信息,ASN 号码,IPv4 和 IPv6 的地址池,并且使用 BGP 在自己的服务器上广播它们。你还要和其它的用户联系,和他们做 Peering(对等互联),一步步进入完整的 DN42 网络。

DN42 在 172.20.0.0/14fd00::/8 上运行,而这两个 IP 段都是分配给内网使用的。换句话说,你在 DN42 上怎么折腾,都不会影响到服务器其它的互联网连接。

你可以通过加入这个 非官方 Telegram 群组 或者 IRC 频道 来寻求帮助。

注意:DN42 是一个测试网络,所有人都在帮助所有人。即使你不小心搞砸了,也没有人会指责你。

注册 DN42

在注册过程中会大量使用到一些 UNIX 工具(如 Git、GnuPG 等),所以最好使用 Linux 或者 macOS 系统完成整个流程,如果你正在使用 Windows 系统,那么可以使用 WSL

首先在 DN42 Git 中注册一个账户,并将 dn42/registry 这个仓库 clone 到本地。

新建一个名为 [用户名]-[日期, YYYYMMDD]/[自定义名称] 的分支。

git checkout -b renbaoshuo-20210403/register
git push --set-upstream origin lantian-20210403/register

在仓库内新建以下文件:

  • data/mntner/[昵称]-MNT
    • mntner :Maintainer(维护者),这个账户的名称,与文件名相同。
    • admin-c :Admin Contact(管理员联系信息),需要指向后续创建的 person 文件,一般为 [昵称]-DN42
    • tech-c :Tech Contact(技术员联系信息),需要指向后续创建的 person 文件,一般为 [昵称]-DN42
    • mnt-by :Maintain by(由谁维护),指向这个账户本身。
    • source :固定为 DN42
    • auth :身份验证信息,接受 SSH 公钥GPG 公钥
    • remarks :备注信息,可以不填。
  • data/person/[昵称]-DN42
    • person :昵称。
    • contact :你的联系方式,一般是你的邮箱。
    • nic-hdl :NIC handle,指向文件本身,与文件名相同。
    • mnt-by :Maintain by(由谁维护),由谁维护,指向你的 mntner 文件,[昵称]-MNT
    • source :固定为 DN42
  • data/aut-num/[ASN]
    • aut-num :AS 号。
      • 在国际互联网上,ASN 范围 4200000000 - 4294967294 是被保留作私下使用(private use)的,DN42 占用的就是其中的一块:4242420000 - 4242423999。只需要在这个区间内挑选一个你喜欢的、没有被他人占用的号码即可。
      • 如果你有自己的公网 ASN 的话,也可以直接在 DN42 中使用。
    • 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
  • data/inetnum/[IPv4 Block]
    • inetnum :这个地址块的范围。
    • cidr :这个地址块的范围,与 inetnum 相同,只是以 CIDR 方式表示。
    • netname :这个地址块的名称。可以设置为 [昵称]-IPV4
    • descr :简介,随意填写。
    • country :你的国家代号,填 CN 代表中国大陆。
    • admin-c :Admin Contact(管理员联系信息),指向你的 person 文件,[昵称]-DN42
    • tech-c :Tech Contact(技术员联系信息),指向你的 person 文件,[昵称]-DN42
    • mnt-by :Maintain by(由谁维护),由谁维护,指向你的 mntner 文件,[昵称]-MNT
    • nserver :IP 地址反向解析的 DNS 服务器。如果你不知道/不需要反向DNS,可以去掉。
    • status :固定为 ASSIGNED
    • source :固定为 DN42
    • remarks :备注信息,可以不填。
  • data/route/[IPv4 Block]
    • route :这个地址块的范围。
    • descr :简介,随意填写。
    • origin :填写你的 AS 号。
    • mnt-by :Maintain by(由谁维护),由谁维护,指向你的 mntner 文件,[昵称]-MNT
    • source :固定为 DN42
  • data/inet6num/[IPv6 Block]
    • 与 IPv4 并无太大区别,只需将 inetnum 字段改为 inet6num 即可。
  • data/route6/[IPv6 Block]
    • 与 IPv4 并无太大区别,只需将 route 字段改为 route6 即可。

你可以查看我提交的注册信息:Add AS141776 (#673)

注意:各个项目的名称和值之间有一长串空格。这段空格的长度是不能随意修改的,当然也不能替换成 Tab。名称 + 冒号 + 空格的总长度 必须是 20 个字符

创建完成之后,切换到仓库的根目录,执行 git add . 暂存更改。

你可以使用 git commit -S 使用 GPG 对提交进行签名,或者暂时不对提交进行签名,使用 SSH 公钥进行验证:在 commit 之后执行 git rev-parse HEAD | ssh-keygen -Y sign -f ~/.ssh/id_rsa -n dn42 命令,将输出的信息贴到 Pull Request 里面。

执行 git push -f 命令,将修改上传到服务器上。

使用黄色高亮标记出的菜单切换到你的分支,然后点击 New Pull Request 新建一个 Pull Request 即可。

注意:请使用英文发 Pull Request ,否则审核人员会看不懂。

DN42 WireGuard 使用入门

安装 WireGuard

apt install wireguard wireguard-tools -y

系统配置

打开 Linux 内核的数据包转发功能:

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

关闭 Linux 内核 rp_filter 的严格模式:

echo "net.ipv4.conf.default.rp_filter=2" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.rp_filter=2" >> /etc/sysctl.conf

关闭 UFW 等帮你配置 iptables 的工具。

生成公钥和私钥

先使用 wg genkey 命令生成一个私钥,然后使用 echo "<PUBLIC_KEY>" | wg pubkey 算出所对应的公钥。

这是 WireGuard 隧道中双方的唯一认证方式,务必将其保管好,不要泄漏。

添加配置

新建一个文件:/etc/wireguard/dn42-<PEER_NAME>.conf

将下方示例中用 <> 括住的内容替换为实际信息,然后写入文件。

[Interface]
PrivateKey = <PRIVATE_KEY>
ListenPort = <PORT>
Address = <YOUR_IPv4>/32, <YOUR_IPv6>/128
PostUp = /usr/sbin/ip addr del dev dn42-<PEER_NAME> <YOUR_IPv4>/32 && /usr/sbin/ip addr add dev dn42-<PEER_NAME> <YOUR_IPv4>/32 peer <PEER_IPv4>/32
PostUp = /usr/sbin/ip addr del dev dn42-<PEER_NAME> <YOUR_IPv6>/128 && /usr/sbin/ip addr add dev dn42-<PEER_NAME> <YOUR_IPv6>/128 peer <PEER_IPv6>/128
Table = off

[Peer]
PublicKey = <PEER_PUBLIC_KEY>
Endpoint = <IP/DOMAIN>:<PORT> # 仅当你向对方发起连接时才需要填写此项配置
AllowedIPs = 0.0.0.0/0,::/0

然后启动对应的 WireGuard 隧道:

systemctl start wg-quick@dn42-<PEER_NAME>

使用 systemctl status wg-quick@dn42-<PEER_NAME> 查看启动状态。

之后就可以使用 wg 命令查看隧道状态了。

与他人进行对等互联(Peer)

安装 BIRD2

apt install bird2 -y

安装完成后先停止 bird2 的服务:

systemctl stop bird

编写配置文件

可以在 howto/Bird2 - DN42 Wiki 页面上找到一份示例配置文件。

apt 安装的 bird2 的配置文件一般是 /etc/bird/bird.conf

然后下载 ROA 配置文件:

curl -sfSLR {-o,-z}/etc/bird/roa_dn42.conf https://dn42.burble.com/roa/dn42_roa_bird2_4.conf
curl -sfSLR {-o,-z}/etc/bird/roa_dn42_v6.conf https://dn42.burble.com/roa/dn42_roa_bird2_6.conf
birdc configure

ROA 配置文件的自动下载与更新

添加下面两个 crontab 定时任务:

*/15 * * * * curl -sfSLR {-o,-z}/etc/bird/roa_dn42.conf https://dn42.burble.com/roa/dn42_roa_bird2_4.conf && chronic birdc configure
*/15 * * * * curl -sfSLR {-o,-z}/etc/bird/roa_dn42_v6.conf https://dn42.burble.com/roa/dn42_roa_bird2_6.conf && chronic birdc configure

建立对等互联

/etc/bird/peers 目录下新建名为 <PEER_NAME>.conf 的文件,填入以下内容:

protocol bgp <NEIGHBOR_NAME> from dnpeers {
    neighbor <NEIGHBOR_IP> as <NEIGHBOR_ASN>;
    direct;
    # 在 IPv4 BGP 中禁用 IPv6 路由传递
    ipv6 {
        import none;
        export none;
    };
}

protocol bgp <NEIGHBOR_NAME>_v6 from dnpeers {
    neighbor <NEIGHBOR_IPv6> as <NEIGHBOR_ASN>; # 或 neighbor <NEIGHBOR_LINK_LOCAL_IP> % 'dn42-<PEER_NAME>' as <NEIGHBOR_ASN>;
    direct;
    # 在 IPv6 BGP 中禁用 IPv4 路由传递
    ipv4 {
        import none;
        export none;
    };
}

当然,BIRD2 也是支持多协议会话的,只需要像下面这样写就可以同时建立 IPv4 和 IPv6 会话了:

protocol bgp <NEIGHBOR_NAME> from dnpeers {
    neighbor <NEIGHBOR_IPv6> as <NEIGHBOR_ASN>; # 或 neighbor <NEIGHBOR_LINK_LOCAL_IP> % 'dn42-<PEER_NAME>' as <NEIGHBOR_ASN>;
}

配置完成后就可以开启 bird2 服务了:

systemctl start bird

Enjoy it!

我的 DN42 网络信息

如果看不到上方的嵌入式页面,请访问 https://as141776.net/dn42.html

参考资料

初探 DN42 网络
本文作者
宝硕
发布于
2021-04-04
更新于
2021-04-18
许可协议
喜欢这篇文章?为什么不考虑打赏一下作者呢?
爱发电
文章目录
  1. 注册 DN42
  2. DN42 WireGuard 使用入门
    1. 安装 WireGuard
    2. 系统配置
    3. 生成公钥和私钥
    4. 添加配置
  3. 与他人进行对等互联(Peer)
    1. 安装 BIRD2
    2. 编写配置文件
    3. ROA 配置文件的自动下载与更新
    4. 建立对等互联
  4. 我的 DN42 网络信息
  5. 参考资料