用 sing-box 进行 Tailscale 组网

sing-box 从 1.12.0 开始引入了 Tailscale 端点的支持。本文介绍如何在 OpenWrt 路由器上使用它组网。

安装

参考官方文档

配置

sing-box

这是我使用的配置,参考官方文档

{
  "log": {
    "level": "info"
  },
  "endpoints": [
    {
      "type": "tailscale",
      "tag": "ts",
      "hostname": "netbird",
      "advertise_routes": [
        "192.168.42.0/24"
      ],
      "accept_routes": true,
      "system_interface": true,
      "system_interface_name": “sbts”
    }
  ]
}

这里的作用和官方的 daemon 类似,我们使用 sing-box 启动了一个名为 sbts 的 TUN 接口,用于和 Tailnet 通信。我们的节点名为 netbird,接受外部通告的网段,并向外部通告 192.168.42.0/24 这个段(即节点所处的局域网段)。

使用命令 service sing-box start 启动服务,然后使用 logread 查看 sing-box 输出的登陆地址,可能要多试几遍。

接口

目前我们只是启动了虚拟设备,要让它被 OpenWrt 管理,我们需要新建一个接口,将底层的虚拟设备暴露出来。

路由

目前我们还没有配置任何路由规则,路由器不知道需要把哪些网段转发到我们的接口。

假设我们的对端网段是 192.168.69.0/24,则添加静态路由如下:

此外我们需要将 Tailnet 的网段路由进我们的接口,否则无法形成对称路由,让外部访问我们的设备,或从我们的设备访问 Tailnet 网段。

防火墙

我们还需要配置防火墙,允许 LAN 区域与我们的 VPN 互通。添加一个区域:

至此,我们应该已经可以从该局域网下的任意一台设备连接到对端和 Tailnet。请注意,我们已经假定对端已经通过 Tailscale 通告网段,你可以参考我以前的一篇教程:我的 MiniLab:内网互联

优点

sing-box 作为客户端比官方 Tailscale 的内存占用要低,不使用全局 TUN 并在 sing-box 内部路由,这样 sing-box 挂了不至于把网络一波带跑。