Headscale 初探

今天抽时间尝试部署了一下headscale/tailscale,故写一篇文章来稍微讲下踩过的坑。

01 安装

headscale的安装非常简单,直接把二进制文件复制下来,debian系甚至提供了deb包来安装。我就直接用deb包安装好了。

02 配置

配置也非常简单,/etc/headscale/config.yaml 中的注释写得很详细,这里也不再赘述。我甚至配了个OIDC认证登录。

03 部署

我使用的是反向代理部署方式,配置直接参考官方文档:https://github.com/juanfont/headscale/blob/main/docs/reverse-proxy.md

事实上只用暴露主要的那个端口就可以了,tailscale感觉就是个大型的pub/sub架构消息应用,每个节点订阅自己租户的消息,相互交换打洞的结果之类的信息,只不过tailscale在hub端做了一层认证和鉴权。

04 踩坑

(1)中途想换网段了,怎么办?

中途想换IP的话,直接修改配置文件 config.yaml 是不能生效的。需要修改数据库文件:

$ sudo -u headscale -g headscale sqlite3 /var/lib/headscale/db.sqlite

sqlite> .tables
api_keys               policies               routes
migrations             pre_auth_key_acl_tags  users
nodes                  pre_auth_keys

sqlite> .header on

sqlite> .mode table

sqlite> SELECT id, hostname, ipv4 FROM nodes;
+----+--------------+------------+
| id |   hostname   |    ipv4    |
+----+--------------+------------+
| 1  | johnsonmac-5 | 100.64.0.1 |
| 2  | RT-Home      | 100.64.0.2 |
+----+--------------+------------+

sqlite> update nodes set ipv4 = "100.100.0.1" where id=1;

sqlite> update nodes set ipv4 = "100.100.0.2" where id=2;

sqlite> SELECT id, hostname, ipv4 FROM nodes;
+----+--------------+------------+
| id |   hostname   |    ipv4    |
+----+--------------+------------+
| 1  | johnsonmac-5 | 100.100.0.1 |
| 2  | RT-Home      | 100.100.0.2 |
+----+--------------+------------+

参考:https://github.com/juanfont/headscale/issues/1455,但这篇 issue 的表结构已经不适用当前的版本了。所以建议在操作前先查一下表结构:

sqlite> .tables
sqlite> .header on
sqlite> .mode table
sqlite> SELECT * FROM nodes还是machines;

(2)子路由推送

将路由器连接到子路由时,在up时需要添加额外参数:

tailscale up --login-server=https://headscale.example.com --accept-routes=true --accept-dns=false --advertise-routes=172.16.0.0/12

但路由参数推送后,还是没有启用的状态。此时需要在headscale服务端手动接受并启用:

$ sudo -u headscale -g headscale headscale routes ls
ID | Node    | Prefix        | Advertised | Enabled | Primary
1  | rt-home | 172.16.0.0/16 | true       | true    | true
2  | rt-dg   | 172.17.0.0/16 | true       | false    | false

$ sudo -u headscale -g headscale headscale routes enable -r 2

(3)不同tailscale客户端使用自定义服务器的方法

可参考:https://icloudnative.io/posts/how-to-set-up-or-migrate-headscale/#tailscale-%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%8E%A5%E5%85%A5

(4)OpenWRT 路由不生效的解决方法

记得添加防火墙设置,以下是我的配置,可供参考:

  1. 新建防火墙区域 tailscale
  2. 允许指定区域forward,允许input流量
  3. 高级设置,覆盖网络选择tailscale0
  4. 覆盖子网填tailscale的子网

如果对面是子路由,建议同时添加对应的防火墙区域:

  1. 新建防火墙区域 remote_lan
  2. 允许指定区域forward,允许input流量
  3. 高级设置,覆盖网络选择tailscale0
  4. 覆盖子网填对面的子网网段

05 总结

感觉tailscale还是比较适合接入侧的连接。直接填写对应服务器地址,轻松认证一下,就可以接入了。

而对于site2site的连接感觉支持还是差了些。尤其是在openwrt上的支持,tailscale相比zerotier要略微逊色一些。

但是tailscale毕竟基于wireguard协议,尽管运行在用户态,但其效率必然是相当不错的。先体验一段时间再回来更新。

发表评论