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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
version: '3.8'

x-test:
&default
restart: unless-stopped
logging:
driver: json-file
options:
max-size: "50m"

services:
headscale:
<<: *default
container_name: headscale
image: headscale/headscale:latest
volumes:
- ./conf/:/etc/headscale
- ./data/:/var/lib/headscale
ports:
- 127.0.0.1:8080:8080
cap_add:
- NET_ADMIN
- NET_RAW
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv6.conf.all.forwarding=1
command: ["headscale", "serve"]

headscale-ui:
<<: *default
image: ghcr.io/gurucomputing/headscale-ui:latest
container_name: headscale-ui
ports:
- 127.0.0.1:80:80
  • 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
2
3
4
5
6
7
8
9
your.domain.com {
import LOG "/var/log/caddy/ipv6.log" #log
import COMMON_CONFIG # tls hsps

reverse_proxy http://127.0.0.1:8080
handle /web* {
reverse_proxy http://127.0.0.1:80
}
}

其他 headscale-config -> 官方示例

  • listen_addr 保持 8080
  • metrics_listen_addr 性能监控端口,这里暂时不需要.
  • ip_prefixes: 组网分配的内网 ip 段
  • logtail: enabled: false 没必要发送信息到 Tailscale
  • randomize_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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3.8'
services:
tailscaled:
container_name: tailscaled
image: tailscale/tailscale
network_mode: host
privileged: true
restart: always
cap_add:
- net_admin
- sys_module
volumes:
- './conf/:/var/lib'
- '/dev/net/tun:/dev/net/tun'
command: sh -c "mkdir -p /var/run/tailscale && ln -s /tmp/tailscaled.sock /var/run/tailscale/tailscaled.sock && tailscaled"

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 是稳定,但是就是打洞不行.