今天抽时间尝试部署了一下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客户端使用自定义服务器的方法
(4)OpenWRT 路由不生效的解决方法
记得添加防火墙设置,以下是我的配置,可供参考:
- 新建防火墙区域 tailscale
- 允许指定区域forward,允许input流量
- 高级设置,覆盖网络选择tailscale0
- 覆盖子网填tailscale的子网
如果对面是子路由,建议同时添加对应的防火墙区域:
- 新建防火墙区域 remote_lan
- 允许指定区域forward,允许input流量
- 高级设置,覆盖网络选择tailscale0
- 覆盖子网填对面的子网网段
05 总结
感觉tailscale还是比较适合接入侧的连接。直接填写对应服务器地址,轻松认证一下,就可以接入了。
而对于site2site的连接感觉支持还是差了些。尤其是在openwrt上的支持,tailscale相比zerotier要略微逊色一些。
但是tailscale毕竟基于wireguard协议,尽管运行在用户态,但其效率必然是相当不错的。先体验一段时间再回来更新。