Asjdf

一只在杭电摸鱼的小火鸡

使用 Bird2 + WireGuard 快速加入 DN11

2024-02-18 大约2164字 预计阅读5分钟

# 前言

鉴于本文被 DN11 群友评价为“误人子弟”,因此如果你想学习更好的配置流程,请向 DN11 群友请教。本文仅作为个人实践出来的配置方案分享,旨在和好友分享一个快速的配置流程,使其能够快速加入 DN11 而不是把时间花在研读晦涩、残缺的各类文档。

DN11 全称为 “11 号去中心化网络”(Decentralized Network 11),由杭州电子科技大学11号宿舍楼的同学们发起的实验性的、去中心化的 BGP 网络。 来自 https://dn11.top/

本文主要包含 Linux 下快速接入 DN11 情况下 系统、Bird2 与 WireGuard 的配置,下文中的命令默认您以 root 身份执行。

# 信息注册

在加入 DN11 之前,你需要在 注册中心 完成注册,由于本篇重点不在于注册,因此请参照 repo 中文档指示完成注册。

# 系统配置

在 DN11 网络中,没有绝对意义上的客户端,每个人都可能是他人的路由器,经常会出现数据包的来源网卡与回复使用的网卡不一致的情况,因此需要打开 Linux 内核的数据包转发功能。

打开 Linux 内核的数据包转发功能,即 ip_forwarding。 关闭 Linux 内核 rp_filter 的严格模式。

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
echo "net.ipv4.conf.default.rp_filter=0" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.rp_filter=0" >> /etc/sysctl.conf
sysctl -p

如果有帮助配置 iptables 防火墙的工具如 ufw 等请自行关闭。

# WireGuard 配置

安装 wireguard-tools:

apt install wireguard-tools

生成 WireGuard 私/公钥:

wg genkey | tee /dev/tty | wg pubkey

该命令执行完成后,上面一行是公钥。下面一行是私钥。

然后就是尝试与别人/自己建立对等连接,根据下面的配置模版在 /etc/wireguard/ 目录(如文件夹不存在请自行创建)下新建 WireGuard 配置文件,如“atomSh.conf”,使用 <> 包裹的内容均需要自行替换。

[Interface]
PrivateKey = <Your wireguard private-key>
ListenPort = <12345>
Table = off # 不要自动添加路由
# 如果使用IPV4-DN11 + IPV6-DN11:
# PostUp = /sbin/ip addr add dev %i <LocalIPv4>/32 peer <PeerIPv4>/32
# PostUp = /sbin/ip addr add dev %i <LocalIPv6>/128 peer <PeerIPv6>/128
# 如果使用IPV6-link-local:
# PostUp = /sbin/ip addr add fe80::1742/64 dev %i

[Peer]
Endpoint = <peer.addrs:12345>
PublicKey = <ddfgdfgdfgdfgdfgdfg=>
AllowedIPs = 0.0.0.0/0, ::/0
# PersistentKeepalive = 10

注意不要擅自改动配置中的Table = off,因为配置不当将会导致设备完全断网。

其中的三条 PostUp 命令在 DN11 通常只需要解除注释 # PostUp = /sbin/ip addr add dev %i <LocalIPv4>/32 peer <PeerIPv4>/32 并修改 <LocalIPv4><PeerIPv4>。在经过反复配置对等链接后,我推荐使用笔记软件来登记 IP 地址分配。(飞书的多维表格帮了大忙)我个人喜欢给隧道两端单独分配 IP 地址,同时也建议你这么做。

20240218225227-2024-02-18-22-52-27

20240218225332-2024-02-18-22-53-33

这里我新建的配置文件名为:atomSh.conf,这样使用 wg-quick 命令启动后,接口名称就是 atomSh(这样在我的 Bird 的 OSPF 配置中,Bird 就能识别到接口了)

配置完成后执行:

wg-quick up 你的配置文件名(不带.conf)

如果你是在组建内网的话,依次同理在另一个设备上进行设置。此外,如果当前设备没有公网IP,请别忘记取消注释 PersistentKeepalive 设置。

配置完成后

# Bird2配置

本文使用 Bird2 进行路由管理,因此先进行 Bird2 的安装

apt install bird2

Linux 中 Bird2 配置默认位于 /etc/bird/ 文件夹下。bird默认的配置文件很全,但是用不太上,你可以选择删除或者拷贝至其他地方。

然后我们新建一个 variable.conf 用于存储您的 ISP 信息,使用 <> 包裹的内容均需要自行替换。

nano /etc/bird/variable.conf

内容如下:

################################################
#               Variable header                #
################################################

define OWNAS =  <OWNAS>;
define OWNIP =  <OWNIP>;
define OWNNET = <OWNNET>;
define OWNNETSET = [<OWNNET>+];

################################################
#                 Header end                   #
################################################

示例:(这是我的 ISP 信息,请勿直接复制使用)

define OWNAS =  4220082866;
define OWNIP =  10.28.0.1;
define OWNNET = 10.28.0.0/24;
define OWNNETSET = [10.28.0.0/24+];

新建一个 bird.conf

nano /etc/bird/bird.conf

内容如下:

include "/etc/bird/variable.conf";

router id OWNIP;

protocol device {
    scan time 10;
}

ipv4 table OSPF_table;
ipv4 table BGP_table;

protocol pipe pipe_ospf_table{
    table master4;
    peer table OSPF_table;
    import filter {
        krt_prefsrc=OWNIP;
        accept;
    };
    export none;
}

protocol pipe pipe_bgp_table {
    table master4;
    peer table BGP_table;
    import filter {
        if source != RTS_BGP then reject;
        krt_prefsrc=OWNIP;
        accept;
    };
    export none;
}

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 {
        table BGP_table;
        import all;
        export none;
    };
}

template bgp dn11_ebgp_peers {
    local as OWNAS;

    ipv4 {
        table BGP_table;
        import all;
        export filter {
            if source ~ [RTS_STATIC, RTS_BGP] then accept;
            reject;
        };
    };
}

template bgp dn11_ibgp_peers {
    local as OWNAS;
    source address OWNIP;
    ipv4 {
        next hop self;
        igp table OSPF_table;
        table BGP_table;
        import all;
        export filter {
            if source = RTS_STATIC then reject;
            accept;
        };
    };
}


include "/etc/bird/include/*.conf";

随后建立 include 文件夹(我的个人习惯)

mkdir /etc/bird/include
cd /etc/bird/include

# 内网治理

配置内网 OSPF,使用 <> 包裹的内容均需要自行替换。(如果你只有个节点接入 DN11 同时也不关心内网,可以暂时不配置 OSPF)

nano /etc/bird/include/ospf.conf
protocol ospf v2 innernet {
        ipv4 {
                table OSPF_table;
                export all;
                import all;
        };
        area <areaID> {
                # change it
                interface <"atom*"> {
                        cost 10;
                        type ptp;
                };
                interface "lo" {
                        type bcast;
                };
        };
}

areaID 不要和其他人冲,比如我使用我申请的网段 10.28.0.0 作为 areaID。然后我 WireGuard 的接口名称统一使用 atom 作为开头,因此我这里直接设置匹配以 atom 开头的接口作为端到端的 OSPF 接口。

这里我们在回环口 lo 配置了 bcast 是为了将回环口的 ip 广播到 OSPF,不用担心 127.0.0.1 这个 IP 进路由表,bird 自己会过滤掉,也可以手动写 filter 过滤,这样显式一点。

对于这个 bcast,如果你想把这台机器的内网广播到 OSPF 的话,加一个把 lo 改成 br-lan 这种接口的配置就可以了,此时你的路由设备在 OSPF 的 IP 就是你 br-lan 接口上的 IP;如果你是云服务器,下面压根没有子网,这种时候建议手动在 lo 接口配置一个 ip 并通过广播 lo 接口的 ip 的方式把你的设备广播在你的OSPF里。

ip addr add <你的设备在你自己内网的IP> dev lo

比如我的:

ip addr add 10.28.0.1 dev lo

当然使用命令临时增加 IP 是无法持久化的,不同 Linux 发行版的配置方式不同,下面展示我自己使用的 netplan 的配置文件。

# nano /etc/netplan/70-lo.yaml
network:
  ethernets:
    lo:
      addresses: [10.28.0.1/32]
  version: 2

然后配置节点的 iBGP(如果你内网有多个节点想接入 DN11 或想访问 DN11)

nano /etc/bird/include/ibgp.conf

模版如下,使用 <> 包裹的内容均需要自行替换。

protocol bgp <sessionName> from dn11_ibgp_peers {
    neighbor <remoteIP> internal;
}

比如我的配置(我的内网内除了当前配置的节点,还有另外两个节点,因此需要在节点间两两建立iBGP):

protocol bgp IBGP_ix from dn11_ibgp_peers {
    neighbor 10.28.0.7 internal;
}

protocol bgp IBGP_mobile from dn11_ibgp_peers {
    neighbor 10.28.0.9 internal;
}

# ISP 间 BGP 会话建立

然后配置 ISP 间的 eBGP

nano /etc/bird/include/ebgp.conf

模版如下,使用 <> 包裹的内容均需要自行替换。

protocol bgp <sessionName> from dn11_ebgp_peers {
    neighbor <remoteIP> % <interfaceName> as <remoteASN>;
}

举个例子:

protocol bgp hakuya_tokyo_aws from dn11_ebgp_peers {
    neighbor 100.64.0.253 % 'hakuya-aws' as 4220081919;
}

配置完成刷新配置:

birdc c

# 参考链接

https://dn11.top/

https://baimeow.cn/posts/dn11/configureibgp/

https://blog.baoshuo.ren/post/dn42-network/

https://miaotony.xyz/2021/03/25/Server_DN42/

https://lantian.pub/article/modify-website/dn42-experimental-network-2020.lantian/

闽ICP备2022001901号-1 公安网备图标闽公网安备35030302354429号

主题 atom-hugo-theme