萌ICP备20220458号

如何在 DN42 中完成第一次互联

2022年11月21日 1482点热度 3人点赞 0条评论

0. 前置要求

这篇文章只会介绍目前最简单、常用的方式。如果下面的条件不满足,不妨看看其他文章。

  • 你已经完成了 DN42 的注册,及 节点BIRD 的配置。
  • 你的对等方(比如我们)支持 WireGuard + Multiprotocol BGP + Extended Next Hop。
  • 你的 BIRD 版本 >= 2.0.8,Linux 内核版本 >= 5.2。
  • 你和对等方都有公网 IP。

1. 准备需要的信息

你需要从对等方获取这些信息:

  • ASN
  • WireGuard 公钥
  • WireGuard 终结点(<域名/IP>:<端口>
  • 链路本地 IPv6 地址
    此类地址总是以 fe80 开头。不要把 :: 打成 :

同时,你是你的对等方的对等方,所以最终同样的信息也需要提供给你的对等方。

2. 建立 WireGuard 隧道

  1. 如果还没有,使用你的包管理器安装 WireGuard。

  2. 生成一对密钥。

    wg genkey | tee wg-private.key | wg pubkey

    你的私钥会保存在 wg-private.key 中,不应该暴露给任何人;相应的公钥会输出到终端上,需要提供给你的对等方。

  3. 创建一个接口配置文件。
    将下面的内容保存到 /etc/wireguard/wg-<对等方名称>.conf。这需要 root 权限。

    [Interface]
    PrivateKey = <刚才生成的私钥>
    ListenPort = <你开放的端口>
    Address = <你的链路本地 IPv6 地址>/64
    Table = off
    PostUp = echo 0 > /proc/sys/net/ipv4/conf/%i/rp_filter
    
    [Peer]
    PublicKey = <对等方的公钥>
    Endpoint = <对等方的终结点>
    AllowedIPs = fe80::/64, fd00::/8, 172.20.0.0/14, 172.31.0.0/16, 10.0.0.0/8
    • 对等方名称 可以帮助你辨别不同的互联,需要在 12 个字符及以内。
    • 你开放的端口 用于对等方与你建立隧道,通常为 20000 与 对等方 ASN 最后四位的和。你可能需要在节点及服务商的防火墙上开放这个端口。
    • 你的链路本地 IPv6 地址 用于对等方与你建立 BGP 会话,通常为 fe80::<你的 ASN 后四位>

    后两项信息需要提供给对等方。你还需要提供你的公网 IP 地址或解析到该地址的域名,后者更优。

  4. 启动隧道。

    sudo systemctl enable --now wg-quick@wg-<对等方名称>

3. 建立 BGP 会话

  1. 确保存放配置的目录存在:sudo mkdir -p /etc/bird/peers

  2. 创建一个会话配置文件。
    将下面的内容保存到 /etc/bird/peers/dn42_<对等方名称>.conf。这需要 root 权限。

    protocol bgp dn42_<对等方名称> from dnpeers {
        neighbor <对等方的链路本地 IPv6 地址> % 'wg-<对等方名称>' as <对等方 ASN>;
    
        ipv4 { extended next hop on; };
    }

    对等方 ASN 是一个数字,不包含“AS”前缀。

  3. 应用配置:sudo birdc configure

4. 检验

sudo birdc show protocol all dn42_<对等方名称>

如果你看到类似于下面的文字,大概率就互联成功啦。

...
BGP state:          Established
...

Channel ipv4
    State:          UP
    ...
    Routes:         634 imported, 599 exported, 74 preferred
    ...

Channel ipv6
    State:          UP
    ...
    Routes:         663 imported, 606 exported, 88 preferred
    ...

funnysyc

啥都不会。