Post

DN11接入笔记

拥有公网IP的服务器接入

DN11接入笔记

有一台公网服务器接入DN11还是挺方便的, 主要用到的工具有两个:

  1. Wireguard (创建安全隧道)
  2. Bird2 (负责不同AS之间的路由)

前置知识

因特网 (Internet) 由很多独立的网络组成, 即自治域 (AS); 每个自治域由ISP管理, 我们说的 “上网” 就是接入了ISP, 让ISP给你分配一个公网IP地址, 你的数据包从你的路由器 (这里指家庭路由器) 出发, 经过ISP的边界网关, 到达其他ISP的边界网关, 再到达目标ISP的边界网关, 最后传递到目标主机.

BGP解决的是如何选择在不同AS之间跳跃的最优路径; 每个边界网关都存储了一个路由表, 边界网关会根据数据包的目的地址和路由表决定这个数据包的下一跳去哪个AS.

image-20250707125720842

DN11可以看成因特网的缩小版, 每个接入DN11的成员都需要有独立的ASN和网段, 二者是对应关系, 在成员注册表统一管理. 比如我申请的网段和ASN分别为172.16.47.0/24, 4220085757; 我在Wireguard创建的虚拟内网1中就扮演了因特网里面的ISP, 拥有独立网段和ASN.

可以看看DN11的实时拓扑图.

配置Wireguard

用来建立对等会话 (peer), 柏师傅的wg-quick-op丰富了原版wg-quick-go的功能, 先运行wg-quick-op install, 然后到配置文件 (/etc/wireguard.your_wg_interface_name.conf)进行虚拟网口和peer的配置, 如果配置没问题的话, 在运行wg-quick-op up <interface name>后, 脚本会自动帮你做以下几个事情:

  1. 在你的系统内创建一个虚拟网口
  2. Wireguard开始监听0.0.0.0:port
  3. 执行PostUp指令, 分配我先前配置的地址172.16.47.254给这个网口, 现在这个网口有了一个IP地址

  4. 与对端peer握手, 建立连接

完成之后, 应该就可以ping通对端IP2了, 可以使用ifconfig查看刚刚建立的虚拟网口:

1
2
3
4
5
6
7
8
$ ifconfig
wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1420
        inet 172.16.47.254  netmask 255.255.255.255  destination 172.16.26.253
        [ ... ] skipping stuff

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.24.224  netmask 255.255.192.0  broadcast 172.17.63.255
    	[ ... ] skipping stuff

配置Bird2

DN11使用Bird2实现BGP, 按照柏师傅的wiki里面配置就好

使用birdc s p看到我的wg0网口为Established就代表已经接入DN11了:

1
2
3
4
5
6
7
8
$ sudo birdc s p
BIRD 2.17.1 ready.
Name       Proto      Table      State  Since         Info
device1    Device     ---        up     2025-07-05
kernel1    Kernel     master4    up     2025-07-05
static1    Static     BGP_table  up     2025-07-06
pipe1      Pipe       ---        up     2025-07-06    master4 <=> BGP_table
wg0        BGP        ---        up     2025-07-06    Established

探索

Wireguard为我们创建了一个虚拟局域网1 , Bird2运行在此之上:

image-20250707152915129

数据包通过BGP在不同AS之间穿梭; 从不同AS之间的跳跃由边界网关负责, 我们可以用traceroute <ip>看看目的地为172.16.4.1的数据包是怎么走的:

1
2
3
4
5
6
$ traceroute 172.16.4.1
traceroute to 172.16.4.1 (172.16.4.1), 30 hops max, 60 byte packets
 1  172.16.26.253 (172.16.26.253)  30.135 ms  30.076 ms  30.055 ms
 2  10.255.1.1 (10.255.1.1)  36.032 ms  35.785 ms  35.997 ms
 3  172.16.4.66 (172.16.4.66)  43.596 ms  43.547 ms  43.528 ms
 4  172.16.4.1 (172.16.4.1)  55.591 ms  55.422 ms  55.605 ms

除了172.16.4.1外, 经过的其他IP应该都是边界网关, 并且属于各自的AS. 经过的第一个IP: 172.16.26.253 就是我的peer, 同时也是网段172.16.26.0/24的边界网关.

现在有一个小问题: 我怎么知道要发送给172.16.4.1的数据包下一跳到哪里?

执行birdc进入bird命令行界面, 使用show route看看路由表, 有这么一行:

1
2
3
4
Table master4:
[ ... ] skipping stuff
172.16.4.0/24        unicast [wg0 15:37:51.246] * (100) [AS4220084444i]
        via 172.16.26.253 on wg0

即所有目的地IP在172.16.4.0/24网段内的数据包都要通过wg0网口发送, 到达另一个AS的边界网关172.16.26.253, 由于我和对面都是单一的公网服务器, 所以边界网关应该就是服务器本身.

关于学校内网接入, 咕咕咕, 开学再说.


Footnotes

  1. 可能并不准确, LAN应该在数据链路层, 而Wireguard是操作在网络层的; 但从用户的角度来看, 概念上是合理的. ↩︎ ↩︎2

  2. PostUp内的<another tunnel IP> ↩︎

This post is licensed under CC BY 4.0 by the author.

Trending Tags