DN42 初探

加入 DN42 实验性网络

按照惯例,一般在接入 dn42 网络之后会写一些关于如何加入的博客教程,但是鉴于网上相关的教程已经有很多了, 而且我也有点懒,我就不再赘述了。我就放一些我参考的博客和文章好了。

  • dn42 wiki
    dn42 的官方 wiki,内容很多也很全面,对于想要折腾的人是一个很好的参考资料来源。

  • lantian’s blog
    lantian 写的一篇很详细的教程,如果不想看英文的 wiki 的话可以直接看这篇。

顺带一提,我在申请 DN42 的 IPv6 的地址的时候好像搞错了 inet6numroute6 cidr 的概念((
inet6num 的地址是必须用 0 填充的,而 cidr 表示的时候可以省略地址中的 0。

什么是 DN42 实验性网络?

DN42 全称 Decentralized Network 42(42 号去中心网络),是一个大型、去中心化的 VPN 网络。 但是与其它传统 VPN 不同的是,DN42 本身不提供 VPN 出口服务,即不提供规避网络审查、流媒体解锁等类似服务。 相反,DN42 的目的是模拟一个互联网。它使用了大量在目前互联网骨干上应用的技术(例如 BGP 和递归 DNS),可以很好地模拟一个真实的网络环境。 ————摘自 Lantian 关于 DN42 网络的介绍

dn42 logo

配置 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


 

f3rmata

I’m just sittin’ here watching the wheels going round and round.