加入 DN42 实验性网络
按照惯例,一般在接入 dn42 网络之后会写一些关于如何加入的博客教程,但是鉴于网上相关的教程已经有很多了,
而且我也有点懒,我就不再赘述了。我就放一些我参考的博客和文章好了。
dn42 wiki
dn42 的官方 wiki,内容很多也很全面,对于想要折腾的人是一个很好的参考资料来源。lantian’s blog
lantian 写的一篇很详细的教程,如果不想看英文的 wiki 的话可以直接看这篇。
顺带一提,我在申请 DN42 的 IPv6 的地址的时候好像搞错了 inet6num
和 route6 cidr
的概念((inet6num
的地址是必须用 0 填充的,而 cidr
表示的时候可以省略地址中的 0。
什么是 DN42 实验性网络?
DN42 全称 Decentralized Network 42(42 号去中心网络),是一个大型、去中心化的 VPN 网络。 但是与其它传统 VPN 不同的是,DN42 本身不提供 VPN 出口服务,即不提供规避网络审查、流媒体解锁等类似服务。 相反,DN42 的目的是模拟一个互联网。它使用了大量在目前互联网骨干上应用的技术(例如 BGP 和递归 DNS),可以很好地模拟一个真实的网络环境。 ————摘自 Lantian 关于 DN42 网络的介绍
配置 BGP 信息
更改一下系统配置
不同的操作系统的配置方法可能会不太一样,不过我这里就以 Linux 为例了。
首先,你必须保证你的主机开启了包转发。
在 /etc/sysctl.conf
中写入
net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
# 开启包转发
之后,你需要关掉 Linux 内核的 rp_filter
检查
还是在 /etc/sysctl.conf
中写入以下内容
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
# 禁用 rp_filter 功能
最后执行一下 sysctl -p
使配置生效。
配置 BIRD v2
因为我用的是 BIRD 来进行 BGP 通信,我这里就还是以 BIRD 的配置过程为例好了
参考: dn42 wiki 中关于 BIRD2 的介绍
Debian 12 中的软件源默认就含有比较新的 Bird2 版本,直接用 apt install bird2
就可以安装了。
安装完之后就可以按照官方 wiki 上的示例配置 bird 了。
bird2 的配置文件默认在这里👉 /etc/bird/bird.conf
################################################
# Variable header #
################################################
define OWNAS = <OWNAS>; # 这里替换成你的 DN42 ASN
define OWNIP = <OWNIP>; # 这里替换成你的主机的 DN42 IPv4
define OWNIPv6 = <OWNIPv6>; # 这里替换成你的主机的 DN42 IPv6
define OWNNET = <OWNNET>; # 这里替换成你申请的 DN42 IPv4 网络段 (CIDR格式)
define OWNNETv6 = <OWNNETv6>; # 这里替换成你申请的 DN42 IPv6 网络段 (CIDR 格式)
define OWNNETSET = [<OWNNET>+]; # 同理,把 <OWNNET> 里的内容替换成你申请的 DN42 IPv4 网络段就可以了
define OWNNETSETv6 = [<OWNNETv6>+]; # 与上面是一样的,把 <OWNNETv6> 替换成你申请的 DN42 IPv6 网络段
################################################
# Header end #
################################################
router id OWNIP;
protocol device {
scan time 10;
}
/*
* Utility functions
*/
function is_self_net() {
return net ~ OWNNETSET;
}
function is_self_net_v6() {
return net ~ OWNNETSETv6;
}
function is_valid_network() {
return net ~ [
172.20.0.0/14{21,29}, # dn42
172.20.0.0/24{28,32}, # dn42 Anycast
172.21.0.0/24{28,32}, # dn42 Anycast
172.22.0.0/24{28,32}, # dn42 Anycast
172.23.0.0/24{28,32}, # dn42 Anycast
172.31.0.0/16+, # ChaosVPN
10.100.0.0/14+, # ChaosVPN
10.127.0.0/16+, # neonetwork
10.0.0.0/8{15,24} # Freifunk.net
];
}
roa4 table dn42_roa;
roa6 table dn42_roa_v6;
# 之后我们需要配置一下这里的 ROA 规则
protocol static {
roa4 { table dn42_roa; };
include "/etc/bird/roa_dn42.conf";
};
protocol static {
roa6 { table dn42_roa_v6; };
include "/etc/bird/roa_dn42_v6.conf";
};
function is_valid_network_v6() {
return net ~ [
fd00::/8{44,64} # ULA address space as per RFC 4193
];
}
protocol kernel {
scan time 20;
ipv6 {
import none;
export filter {
if source = RTS_STATIC then reject;
krt_prefsrc = OWNIPv6;
accept;
};
};
};
protocol kernel {
scan time 20;
ipv4 {
import none;
export filter {
if source = RTS_STATIC then reject;
krt_prefsrc = OWNIP;
accept;
};
};
}
protocol static {
route OWNNET reject;
ipv4 {
import all;
export none;
};
}
protocol static {
route OWNNETv6 reject;
ipv6 {
import all;
export none;
};
}
template bgp dnpeers {
local as OWNAS;
path metric 1;
ipv4 {
import filter {
if is_valid_network() && !is_self_net() then {
if (roa_check(dn42_roa, net, bgp_path.last) != ROA_VALID) then {
# Reject when unknown or invalid according to ROA
print "[dn42] ROA check failed for ", net, " ASN ", bgp_path.last;
reject;
} else accept;
} else reject;
};
export filter { if is_valid_network() && source ~ [RTS_STATIC, RTS_BGP] then accept; else reject; };
import limit 9000 action block;
};
ipv6 {
import filter {
if is_valid_network_v6() && !is_self_net_v6() then {
if (roa_check(dn42_roa_v6, net, bgp_path.last) != ROA_VALID) then {
# Reject when unknown or invalid according to ROA
print "[dn42] ROA check failed for ", net, " ASN ", bgp_path.last;
reject;
} else accept;
} else reject;
};
export filter { if is_valid_network_v6() && source ~ [RTS_STATIC, RTS_BGP] then accept; else reject; };
import limit 9000 action block;
};
}
include "/etc/bird/peers/*";
# 我们之后可以在这个目录下添加 peer。
添加一个 Peer
为你的 peer 在 /etc/bird/peers/
目录下添加一个新的配置文件。
# /etc/bird/peers/<NEIGHBOR_NAME>.conf
protocol bgp <NEIGHBOR_NAME> from dnpeers {
neighbor <NEIGHBOR_IP> as <NEIGHBOR_ASN>;
}
# 对于支持 Multiprotocol BGP 的 Peer 来说可以不需要上面的内容
protocol bgp <NEIGHBOR_NAME>_v6 from dnpeers {
neighbor <NEIGHBOR_IPv6>%<NEIGHBOR_INTERFACE> as <NEIGHBOR_ASN>;
# Or:
# neighbor <NEIGHBOR_IPv6> as <NEIGHBOR_ASN>;
# interface <NEIGHBOR_INTERFACE>;****
# 注: <NEIGHBOR_IPv6> 是对方的 IPv6 Link-local 地址,
# <NEIGHBOR_INTERFACE> 是你的主机和对面 Peer 通讯时用的网卡名称,
# <NEIGHBOR_ASN> 是对方的 DN42 ASN
}
添加 ROA 规则
DN42 wiki 上给出了一些社区贡献的规则列表,你可以设置一个 crontab 或者 systemd-timer 来定时更新它们。
以 crontab 配置为例:
*/15 * * * * curl -sfSLR {-o,-z}/etc/bird/roa_dn42.conf https://dn42.burble.com/roa/dn42_roa_bird2_4.conf && birdc configure > /dev/null
*/15 * * * * curl -sfSLR {-o,-z}/etc/bird/roa_dn42_v6.conf https://dn42.burble.com/roa/dn42_roa_bird2_6.conf && birdc configure > /dev/null
检查 BGP 连接状态
在终端输入 birdc show protocols
,就能看到现在 BGP 的连接状态了。
如果配置没问题的话,Info 那一列应该就会出现 Established
的字样。
$ birdc show protocols
BIRD 2.0.12 ready.
Name Proto Table State Since Info
device1 Device --- up 2025-01-21
static1 Static dn42_roa up 2025-01-21
static2 Static dn42_roa_v6 up 2025-01-21
kernel1 Kernel master6 up 2025-01-21
kernel2 Kernel master4 up 2025-01-21
static3 Static master4 up 2025-01-21
static4 Static master6 up 2025-01-21
iedon_v6 BGP --- up 2025-02-01 Established
moe233_v6 BGP --- up 2025-02-15 Established
potat0_v6 BGP --- up 2025-02-17 Established
恭喜你,你成功加入 DN42 网络了!
如果你还想试试看其他东西的话,我建议可以去看看你的 Peer 的 Looking glass(如果有的话),
或者探索一下 DN42 的内部服务,甚至在 DN42 内申请一个域名,搭建你自己的服务了!
我的 Peer 信息
如果你想和我 Peer,欢迎发邮件联系我 ([email protected]
),并附上你的 Peer 信息,
我看到之后就会联系你来和你 Peer 了。
SAST-NETWORK
- ASN: 4242420721
目前的 Peer 有:
- Patot0
- iedon
- moe233
全都是不需要直接联系对方的 Peer(
P1 San Fransisico (Digital Ocean)
- DN42 IPv4:
172.21.74.1/32
- DN42 IPv6:
fda7:a114:4f0e::1/128
- Endpoint:
do-sf.h2o.moe
- Publickey:
HBn/8dyDkC8z4kY5tGZsG3d7iyyc8SWwl5c93po580w=
- IPv6 Link-local:
fe80::721:1