Yggdrasil 是一个 可扩展、自修复、端到端加密、跨平台 的网络。

  • 可扩展:任意一个节点都可以进入 Yggdrasil Network,没有数量限制
  • 自修复:节点之间组成 Mesh 网络,如果一些节点下线导致链路不通,Yggdrasil 会自己找到可以用的线路保证连通性
  • 端到端加密:两个节点之间通信,中间链路无法得知通信内容

同时 Yggdrasil 还是跨平台的,主流 PC 端和移动端都支持。

到这里,Yggdrasil 和其他组网软件(Tailscale/Zerotier/Easytier 等)似乎没有什么不同。接下来就介绍一下 Yggdrasil 不同的地方,也就是本章标题 ”公网之上的公网”。

何为公网之上的公网?

Yggdrasil 中每个节点会有自己的私钥,这和许多组网软件是一样的。但 Yggdrasil 会通过这个私钥对应的公钥,根据特定的算法生成一个 IPv6 的地址。即你的机器在私钥不变的情况下(一般也不会去做改变),这个 IPv6 的地址是不会变的。而不像其他的组网软件,或通过类似 DHCP 的方式,或在每个机器上手动配置一个。

有了一个不变的 IPv6 地址,是不是可以认为是一个公网 IP

这就是“公网之上的公网”中第二个公网的意思,即在 Yggdrasil Network,每个机器有自己唯一的 IPv6 地址,不会有任何变动(除了用户修改密钥之外)。

那么,公网之上是什么意思?这和其他组网软件一样,Yggdrasil 是通过各种协议在 ISP 之间搭建了一层新的网络。其他组网软件如 Tailscale,是在已有的公网之上,通过 UDP 协议(WireGuard)建立了一层网络,Zerotier 则是用了自己专有协议(基于 UDP),OpenVPN 则使用了 TCP/TLS/UDP 等,Easytier 支持的协议就更多了(TCP/UDP/TLS/WS/KCP 等)。Yggdrasil 目前支持了 TCP/UDP/TLS/WS。

快速入门

安装

Github Releases 中下载相应的安装包。

配置

  • Debian 系的配置文件默认在 /etc/yggdrasil/yggdrasil.conf
  • Windows 的配置文件在 %ALLUSERSPROFILE%\Yggdrasil\yggdrasil.conf
  • MacOS 的配置文件在 /etc/yggdrasil.conf
{
  # 密钥,每个节点唯一,你的 IPv6 也是根据这个密钥生成的 
  PrivateKey: b613e38aa9d9f44d1b08c0174dd4728dfb219bf1de63e954a2ff17ef7cef6367481a49dff6dcae4dc76456cf965119ac53cb96c74ee58ae44efa8bbfd2bb57c3

  # 出站节点 URL 列表(例如 tls://a.b.c.d:e 或 socks://a.b.c.d:e/f.g.h.i:j)。连接字符串可以包含选项。
  # 详见 https://yggdrasil-network.github.io/configurationref.html#peers。
  # 请确保仅与地理位置接近、网络连接良好且延迟低的节点对等连接。
  Peers: []

  # 在机器为多网卡出口且希望在不同网络接口上建立出站对等连接时
  # 比如连接 A 节点用移动出口,连接 B 出口用联通出口
  InterfacePeers: {}

  # 入站监听
  # 一般用于有公网 IP(v4 or v6) 都可
  # 每个 Listener 应按URI格式指定,例如:  
  # tls://0.0.0.0:0 或 tls://[::]:0 表示监听所有网络接口
  Listen: []

  # 配置在哪些网络接口上启用组播对等发现功能。 一般情况下,保留默认即可。
  # 用于在局域网中发现存在的 Yggdrasil 节点,即不用配置 Peers/Listen 都可以找到对方
  
  # 正则表达式用于匹配接口名称,系统将使用第一个匹配的配置。
  # "Beacon"控制节点是否向其他节点广播自身存在,  
  # "Listen"控制节点是否监听并尝试连接其他广播节点。  
  # 更多支持选项请参阅:  
  # https://yggdrasil-network.github.io/configurationref.html#multicastinterfaces  
  MulticastInterfaces: [
    {
      Regex: .*
      Beacon: true
      Listen: true
      Password: ""
    }
  ]

  # 允许建立入站对等连接的节点公钥列表  
  # 若留空或未定义,则默认允许所有连接  
  # 此设置不影响出站对等连接,也不影响通过组播发现的本地对等节点  
  # 警告:此功能**并非防火墙**,不会限制谁可以访问  
  AllowedPublicKeys: []

  # TUN 适配器使用的本地网络接口名称,可选值:
  # "auto" - 自动选择接口
  # "none" - 不使用 Tun 模式运行。用于在没有 Tun 支持的机器上,在这个模式下,机器可以转发流量,但是不能被 Ping 通。即成为一个的**转发器**
  # 或直接指定具体接口名称
  IfName: Yggdrasil

  # 本地TUN接口的最大传输单元(MTU)大小
  # 默认为当前平台支持的最大值
  # 最小可设置为1280字节
  # 一般不用修改
  IfMTU: 65535

  # 默认情况下,节点信息包含一些默认值,如平台、架构和Yggdrasil版本。这些信息有助于网络调查和路由问题诊断。启用节点信息隐私功能将阻止这些默认信息的发送,此时仅会返回"NodeInfo"中明确指定的项目。
  NodeInfoPrivacy: false

  # 可选的节点信息。必须为 { "key": "value", ... } 格式的键值对或设置为null。此字段完全可选,但如果设置,则会在请求时对全网可见。  
  NodeInfo: {}
}

一般对于 VPS(有公网 IP),配置 Listen 项,接受其他机器的连接,以及在 Peer 配置其他的 VPS 连接方式。

对于没有公网 IP 的设备,一般不需要配置 Listen,只需要在 Peer 上配置 VPS 的连接方式。

举个例子

假设我现在有如下设备

  • VPS1,有公网 IP(假设为 1.1.1.1)
  • PC1,无公网 IP
  • PC2,无公网 IP

VPS1 配置如下,即在 11451 端口上监听了,允许 tls 链接访问。

Listen: ["tls://0.0.0.0:11451"]

PC1 在 Peer 上填写了 VPS1 的链接方式

Peers: ["tls://1.1.1.1:11451"]

PC2 也在 Peer 上填写了 VPS1 的链接方式

Peers: ["tls://1.1.1.1:11451"]

这时候三方就能够互相通信了,PC1PC2 通信会通过 VPS1 转发。而 VPS1 和两个客户端之间都是直连。

假设增加了一台 PC3,没有进行任何 Peers/Listen 的配置,但保留了默认的 MulticastInterfaces 配置(即启用了广播发现),假设 PC3PC2 是同一个局域网(同属一个广播域),即能够通过广播互相连接,在默认配置的情况下,PC3 会通过广播和 PC2 建立直连连接,但 PC3 是无法通过 PC2 了解到 VPS1PC1 的存在,虽然不知道他们的存在,但是还是可以与其通信,所有通信都会通过 PC2 转发。

启动/检查

配置后,重启服务,让程序重新加载配置。

然后可以用一下命令查看程序状态:

# 获取本机节点信息
yggdrasilctl getself

比如我的笔记本输出,IPv6 address 即本机在 Yggdrasil Network 的公网IP

Build name:        	yggdrasil
Build version:     	0.5.12
IPv6 address:      	200:27a7:d798:613c:6f61:d724:81bb:4c5a
IPv6 subnet:       	300:27a7:d798:613c::/64
Routing table size:	14
Public key:        	ec2c1433cf61c84f146dbf2259d28883c08ec02e076f452c714594dc7b826908
# 获取和本机连接的 Peer 信息
yggdrasilctl getpeers

如果配置了 Peer,一般都能看到传出连接(Dir 列为 Out 的 Peer)。

其它

一些特性:

  • Yggdrasil 没有打洞的设计,两个节点(A、B)之前要么通过局域网发现生成了直连,要么通过配置 Peer 项直连(比如在 A 的 Peer 上配置了 B),要么就通过 Peer 中转。即无法像 Tailscale/Zerotier/Easytier 那种一样,两个无公网的机器能够直连。
  • Yggdrasil 不提供匿名的特性。
  • Yggdrasil 支持 DDNS 的 Peer,只要在 Peer 上域名连接 DDNS 的 Peer 就行
  • Yggdrasil 最新版支持 Websocket 协议通信,可以结合一些科学姿势进行骚操作
  • 配置 Tun 的值为 None 的时候,表示这个机器是纯转发的,类似于 Tailscale 的 Derper 服务器、Zerotier 的 Moon 服务器。纯转发即你无法通过它的 Yggdrasil IPv6 和它通信,但是当你需要和其他机器通信的时候,他可以作为转发。
  • Yggdrasil 选择路由时,是根据延迟作为路由权重,即每次都会找延迟最低的链路
  • Yggdrasil 配置 Peers 的时候,可以指定和某个节点通信通过 Socks5 代理,可以配合一些科学一块用

一些缺点:

  • IPv6 太难记了,最好配合自建 DNS 来降低记忆工作,但不是所有客户端都方便接入自建 DNS
  • 不方便动态添加 Peers,动态添加 Peers 的场景用于降低维护成本,比如在本文例子中,假设你新买了一台 VPS,那么修改所有 PC 配置,不然 PC 无法使用新的 VPS 直连。但 Yggdrasil 提供了 API。

链接