Tailscale 组网 - 自建 Headscale
自建 Headscale
资料来源:
<>
更新
1
2022.12.11 初始
导语
被封在家最大问题是如何使用学校的服务器 -> 内网透传,但一路颇为坎坷,直到找的了 Tailscale
Tailscale 基于 WireGuard 的虚拟组网工具
- 针对个人用户有限制 -> Headscale
- Headscale 不支持面板 -> headscale-ui
- 中继也能自建,这里叫 DERP -> fredliang44/derper-docker
部署 & 参考
部署
- Headscale + headscale-ui 前端 Caddy
- HTTPS 证书交给 Caddy
- 自建中继 DERP -> 下一篇文章
一些参考资料
- 搭建属于自己的Tailscale网络 : 主要参考, Caddy 搭建全流程
- Tailscale 基础教程:Headscale 的部署方法和使用教程: 主要参考,全流程
- Headscale 搭建 P2P 内网穿透: 有较为详细的 Headscale 如何配置
- Headscale 使用手记: Linux 端 Docker 版客户端 配置
- headscale私有部署
- headscale保底设施之DERP中继服务器自建
- Configuring the Headscale UI: UI 配置
Headscale && UI
官方 Docker headscale/headscale
headscale/headscale:latest-alpine
稍微小一些,版本稍微落后几个小版本.- 直接 latest 就好
headscale/headscale:latest
docker-compose.yaml
1 | version: '3.8' |
- UI 对管理还是方便一点
headscale 证书 + caddy
headscale 证书
- Headscale 的 ACME 只支持 HTTP/TLS ,使用后必定占用 80/443
- 当配置了
tls_letsencrypt_hostname
时一定会进行 ACME 申请 - 自定义证书: 不配置
tls_letsencrypt_hostname
+配置tls_cert_path
- 两者都不配置则不使用任何证书, 服务端监听 HTTP 请求. -> done
- 三种情况下(ACME 证书、自定义证书、无证书)主服务都只监听
listen_addr
地址, 与server_url
没半毛钱关系 - 只有在有证书(ACME 证书或自定义证书)的情况下或者手动开启了
grpc_allow_insecure
才会监听 grpc 远程调用服务
Caddy 反代 headscale + headscale-ui 配置
headscale-config
- 删掉 or 留空
tls_letsencrypt_hostname
- 删掉 or 留空
tls_cert_path
server_url
填写 caddy 的 https 地址
caddyfile
- 似乎现在 ui 只能监听 web* 其他不起作用
- 也不能将 headscale 监听到一个子路径下(还没折腾明白)
- 两者必须在一个子域名下,跨子域名需要处理 CORS 问题
- https://github.com/juanfont/headscale/issues/623
- https://github.com/gurucomputing/headscale-ui
1 | your.domain.com { |
其他 headscale-config -> 官方示例
listen_addr
保持 8080metrics_listen_addr
性能监控端口,这里暂时不需要.ip_prefixes:
组网分配的内网 ip 段logtail: enabled: false
没必要发送信息到 Tailscalerandomize_client_port
客户端随机端口,还是打开吧,国内的对 udp 还是非常不友好的.
配置
启动后 ui 还需要一个密钥才能启动
1 | docker-compose exec headscale headscale apikeys create -e 720d |
- 密钥有效期 720 天,绝对够用了.
创建一个租户,ui 中对应一个 New User
1 | docker-compose exec headscale headscale namespaces create main |
客户端
除了 ios 其他基本都支持
- https://tailscale.com/download/windows
- https://pkgs.tailscale.com/stable/
有两种接入方式
- 客户端登录,服务端批准.
Pre-Authkeys
直接客户端添加
方便还是 Pre-Authkeys
, ui 对应某个 User 下的 Preauth Keys
1 | docker-compose exec headscale headscale preauthkeys create -e 24h -n main |
- 这是 24h 的有效期 -n 是 namespace
UI 面板生成的 Pre-Authkeys
有效期更短,需要注意.
win
win 下需要修改注册表在 headscale
域名 + /windows 下载 注册表文件,并应用.
- https://your.domain.com/windows
- 其实是在
HKEY_LOCAL_MACHINE\SOFTWARE\Tailscale IPN
下的LoginURL
写上headscale
域名 - 上文
server_url
没有写正确的,这里生成的也会是错的,需要自己改.
这里遇到了一个 BUG 即使导入了 reg 去点登录一直还是跳转 Tailscale 的登录…
此时干脆可以通过命令行添加登录
1 | tailscale up --accept-routes=true --accept-dns=false --login-server=https://your.domain.com --auth-key=04f1da3fe4f9ee2a247b48dc1b0e0a14531d47e4841063ef |
linux
脚本或 docker
1 | curl -fsSL https://tailscale.com/install.sh | sh |
1 | version: '3.8' |
pre 添加
1 | sudo tailscale up --accept-routes=true --accept-dns=false --login-server=https://your.domain.com --auth-key=04f1da3fe4f9ee2a247b48dc1b0e0a14531d47e4841063ef |
1 | docker-compose exec tailscaled tailscale up --accept-routes=true --accept-dns=false --login-server=https://your.domain.com --auth-key=04f1da3fe4f9ee2a247b48dc1b0e0a14531d47e4841063ef |
Android
fdroid 下载 自定义服务器.
点击登录
- 若跳转无效,可以继续到 浏览器打开继续注册流程.
- 浏览器操作完成后应用即可正常登录.
结语
食用评价
- 打洞效果比 zt 要好,学校这几层的 NAT 居然也能稳定穿, zt 是能穿但时不时掉线.
- 稳定性还好,测试时间太短.
- 自己组的 tinc 是稳定,但是就是打洞不行.