前言
Headscale是一种异地组网的方法,它是Tailscale的开源版本,虽然Tailscale对个人是免费使用的,但还是觉得控制器自己部署使用放心点,Tailscale本身只是个控制器,如果不能打洞成功那就还需要搭配derper做流量中转。
已经在海外服务器部署过用了快1年,但是海外延迟很高,体验一般。
趁着国内服务器带宽变高了(虽然是共享的),决定把Headscale控制器和derper都迁移到国内服务器。
Headscale部署
下面将以文章编写时间的最新版本(v0.26.0)做教程,服务器为x86_64的CPU架构,运行在docker容器中
下载Headscale
拉取Headscale docker镜像
docker pull headscale/headscale:v0.26下载配置文件
wget https://github.com/juanfont/headscale/raw/refs/tags/v0.26.0/config-example.yaml -O config/config.yaml编辑配置文件
vim config/config.yaml修改服务器URL:server_url
替换为你的域名或IP,如:
server_url: http://1.2.3.4:80如果有反向代理转https:
server_url: https://headscale.example.com:443修改监听端口:listen_addr
为了让nginx容器能够转发,我们监听0.0.0.0
listen_addr: 0.0.0.0:8080修改ip网段:prefixes
保留v4修改为1个小段(个人用应该够了),v6如果用不到,可注释掉,有需要可开启
prefixes:
v4: 100.64.0.0/23
# v6: fd7a:115c:a1e0::/48关闭DNS功能:magic_dns
magic_dns: false开启客户端随机端口
randomize_client_port: true启动前准备
生成空的db文件
touch lib/db.sqlite启动服务器
部分参数请根据情况修改
docker run -dit \
--name headscale \
--restart always \
--network local \
-v "/root/docker/headscale/config:/etc/headscale" \
-v "/root/docker/headscale/lib:/var/lib/headscale" \
-v "/root/docker/headscale/run:/var/run/headscale" \
headscale/headscale:v0.26 \
serve查看服务器情况
docker ps -a
docker logs headscale如未正常启动,请再检查log,或检查设定是否正确
反向代理&DNS
如果有使用域名+HTTPS,需要加到前端反向代理,同时在DNS服务商添加一条记录
注意:必须要启用WebSocket
e.g. nginx
server {
if ($host = headscale.example.com) {
return 301 https://$host$request_uri;
}
server_name headscale.example.com;
listen 80;
return 404;
}
server {
server_name hsheadscale.example.com;
listen 443 ssl;
ssl_certificate /fullchain.pem;
ssl_certificate_key /privkey.pem;
location / {
proxy_pass http://headscale.local:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Headscale使用
创建用户
用户可以理解为隔离的租户环境
docker exec -it headscale headscale user create <username>如成功创建会返回如下信息:
User created查看用户创建情况
docker exec -it headscale headscale user list自建 DERP 服务器 (derper)
derp服务器是在headscale无法直接打通双方通信的情况作中转用
前置准备
本文是以有HTTPS证书的情况下进行,且有nginx作反向代理
准备工作目录&证书目录
mkdir -p /root/docker/headscale/derper/certs
cd /root/docker/headscale/derper/certs链接到HTTPS证书
作者是使用letsencrypt申请的泛域名证书,此处注意替换路径和你的域名
ln -s /etc/letsencrypt/live/***/fullchain.pem <derper domain>.crt
ln -s /etc/letsencrypt/live/***/privkey.pem <derper domain>.key部署
镜像可以在 https://hub.docker.com/r/fredliang/derper 查找,本文撰写时的最新版本是v1.82.5,下文以此为例
拉取镜像
docker pull fredliang/derper:v1.82.5启动derper服务器
注意替换<derper domain>
docker run -d \
--name derper \
--restart always \
--network local \
-e DERP_DOMAIN=<derper domain> \
-e DERP_CERT_MODE=manual \
-v /root/docker/headscale/derper/certs:/app/certs \
-v /etc/letsencrypt:/etc/letsencrypt \
-p 3478:3478/udp \
fredliang/derper:v1.82.5添加反向代理
e.g. nginx 请根据实际情况修改
server {
if ($host = <derper domain>) {
return 301 https://$host$request_uri;
}
server_name <derper domain>;
listen 80;
return 404;
}
server {
server_name <derper domain>;
listen 443 ssl;
ssl_certificate /fullchain.pem;
ssl_certificate_key /privkey.pem;
location / {
proxy_pass https://derper.local;
proxy_ssl_name $host;
proxy_ssl_server_name on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}将derper加入到Headscale中
新建derper配置文件
cd /root/docker/headscale
vim config/derp.yaml输入以下内容:
regions:
900:
regionid: 900
regioncode: <region code>
regionname: <region name>
nodes:
- name: <name>
regionid: 900
hostname: <derper domain>
stunport: 3478
stunonly: false
derpport: 443其中 region code、region name都可以自定义,derper domain请填写derper服务器的域名,其他信息根据自己情况填写
将derp配置应用到derp
vim config/config.yaml找到derp的配置项,将tailscale默认服务器注释:
urls:
- https://controlplane.tailscale.com/derpmap/default↓
# urls:
# - https://controlplane.tailscale.com/derpmap/default将derp文件路径加入到paths
paths: []↓
paths:
- /etc/headscale/derp.yamlLinux上安装Tailscale
安装
请根据系统进行安装:
https://tailscale.com/download/linux
官网一键安装指令:
curl -fsSL https://tailscale.com/install.sh | sh设定
安装完成后,设定自启动
systemctl enable --now tailscaled启动连接,下面替换为你的Headscale Server域名
tailscale up --login-server=https://<headscale domain> --accept-routes=true --accept-dns=false之后会出现如下:
To authenticate, visit:
https://<headscale domain>:443/register/*********我们把这个链接粘贴到浏览器,一般会得到如下信息:
headscale
Machine registration
Run the command below in the headscale server to add this machine to your network:
headscale nodes register --user USERNAME --key *********根据提示,我们在服务器上执行:
docker exec -it headscale headscale nodes register --user <user> --key *********之后,我们应该可以看到待认证那边提示Success,代表加入成功