Headscale 自建异地组网完全指南
本文详细介绍如何使用 Headscale 自建 Tailscale 控制服务器,实现跨云、跨地域的异地组网,并配合自建 DERP 中继服务器优化国内访问体验。
什么是 Headscale
Headscale 是 Tailscale 控制服务器的开源替代方案,使用相同的 WireGuard 协议,可以实现:
- 异地组网:打通家庭、公司、云服务器等多个网络
- 内网穿透:无需公网 IP 即可访问内网服务
- 安全传输:基于 WireGuard 的端到端加密
- 零配置:自动 NAT 穿透,无需手动配置端口映射
相比 Tailscale 官方服务,Headscale 的优势:
- 数据自主可控
- 支持多用户/多团队管理
- 可自建 DERP 中继,优化国内访问
服务端部署
环境准备
# 系统要求:Ubuntu 22.04 LTS
# 内存:建议 1GB 以上
# 带宽:根据节点数量调整
# 设置主机名
hostname="headscale-server"
hostnamectl set-hostname ${hostname}
# 配置国内镜像源
cat <<'EOF' > /etc/apt/sources.list
deb https://mirrors.cernet.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.cernet.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.cernet.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.cernet.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
EOF
apt update -y
安装依赖
# 安装 WireGuard 工具
apt install wireguard-tools -y
# 启用 IP 转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
安装 Headscale
# 配置变量
HEADSCALE_VERSION="0.22.3"
HEADSCALE_ARCH="amd64"
HEADSCALE_HOST="0.0.0.0"
# 下载安装包
wget --output-document=headscale.deb \
"https://github.com/juanfont/headscale/releases/download/v${HEADSCALE_VERSION}/headscale_${HEADSCALE_VERSION}_linux_${HEADSCALE_ARCH}.deb"
# 安装
apt install ./headscale.deb -y
配置文件
创建 /etc/headscale/config.yaml:
---
server_url: http://${HEADSCALE_HOST}:8080
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 0.0.0.0:9090
grpc_listen_addr: 0.0.0.0:50443
grpc_allow_insecure: false
private_key_path: /var/lib/headscale/private.key
noise:
private_key_path: /var/lib/headscale/noise_private.key
# IP 分配范围
ip_prefixes:
- 100.64.0.0/10
# DERP 配置(使用官方)
derp:
server:
enabled: false
urls:
- https://controlplane.tailscale.com/derpmap/default
auto_update_enabled: true
update_frequency: 24h
# 数据库
db_type: sqlite3
db_path: /var/lib/headscale/db.sqlite
# 禁用检查更新
disable_check_updates: false
ephemeral_node_inactivity_timeout: 30m
node_update_check_interval: 10s
# TLS 配置(如需使用 HTTPS)
tls_letsencrypt_hostname: ""
tls_cert_path: ""
tls_key_path: ""
# DNS 配置
dns_config:
override_local_dns: true
nameservers:
- 223.5.5.5
- 8.8.8.8
magic_dns: false
base_domain: example.com
# Unix Socket
unix_socket: /var/run/headscale/headscale.sock
unix_socket_permission: "0770"
# 禁用日志上报
logtail:
enabled: false
启动服务
# 启动并设置自启
systemctl start headscale
systemctl enable headscale
systemctl status headscale
# 创建 API Key
headscale apikeys create
# 创建用户
headscale users create team1
headscale users create team2
# 查看状态
headscale user list
headscale nodes list
客户端接入
Linux 客户端
# 安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
# 连接到自建 Headscale 服务器
HEADSCALE_URL="http://your-server-ip:8080"
tailscale up --login-server=${HEADSCALE_URL} \
--accept-routes=true \
--accept-dns=false
# 服务端批准节点
headscale nodes register --user team1 --key nodekey:xxxxx
Windows/macOS 客户端
- 安装 Tailscale 客户端
- 命令行执行:
tailscale up --login-server=http://your-server-ip:8080
- 在服务端执行注册命令
预授权密钥(免审批)
# 创建 24 小时有效期的预授权密钥
headscale preauthkeys create -e 24h --user team1
# 查看密钥列表
headscale --user team1 preauthkeys list
# 客户端使用密钥连接
KEY="your-preauth-key"
tailscale up --login-server=${HEADSCALE_URL} \
--accept-routes=true \
--authkey $KEY
路由与子网宣告
服务端开启路由转发
# 开启 IPv4/IPv6 转发
echo 'net.ipv4.ip_forward = 1' | tee /etc/sysctl.d/ipforwarding.conf
echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.d/ipforwarding.conf
sysctl -p /etc/sysctl.d/ipforwarding.conf
客户端宣告子网
# 例如:客户端内网为 192.168.1.0/24
tailscale up --login-server=${HEADSCALE_URL} \
--accept-routes=true \
--advertise-routes=192.168.1.0/24
# 多个子网用逗号分隔
# --advertise-routes=192.168.1.0/24,10.0.0.0/24
服务端批准路由
# 查看待批准的路由
headscale routes list
# 开启指定路由
headscale routes enable -r 1
headscale routes enable -r 2
# 批量开启某节点的所有路由
headscale routes enable -i 1
自建 DERP 中继服务器
为什么需要自建 DERP
- 国内访问官方 DERP 延迟高(300ms-2s)
- 自建 DERP 可以实现:
- 更低的延迟
- 更好的稳定性
- 数据自主可控
Docker 部署 DERP
# docker-compose.yml
version: '3.5'
services:
derper:
container_name: derper
image: fredliang/derper
restart: always
volumes:
- ./cert:/cert
- /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
ports:
- 3478:3478/udp
- 12345:23479
environment:
DERP_DOMAIN: derp.yourdomain.com
DERP_ADDR: ":23479"
DERP_VERIFY_CLIENTS: "true"
Nginx 反向代理
server {
listen 443 ssl http2;
server_name derp.yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:12345;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Headscale 配置自建 DERP
编辑 /etc/headscale/config.yaml:
derp:
server:
enabled: false
urls: [] # 禁用官方 DERP
paths:
- /etc/headscale/derp.yaml # 本地 DERP 配置
创建 /etc/headscale/derp.yaml:
regions:
900:
regionid: 900
regioncode: custom
regionname: Custom DERP
nodes:
- name: 900a
regionid: 900
hostname: derp.yourdomain.com
ipv4: your-server-ip
stunport: 3478
stunonly: false
derpport: 443
重启 Headscale:
systemctl restart headscale
使用 IP 的简化方案
如果没有域名,可以直接使用 IP:
# 运行 DERP 容器
docker run --restart always \
--net host \
--name derper \
-d yangchuansheng/ip_derper
# 或指定端口
docker run --restart always \
-p 4443:443 \
-p 3478:3478/udp \
--name derper \
-d yangchuansheng/ip_derper
访问地址:https://your-server-ip:4443/
防火墙配置
需要开放的端口:
| 端口 | 协议 | 用途 |
|---|---|---|
| 8080 | TCP | Headscale HTTP API |
| 3478 | UDP | STUN/TURN |
| 41641 | UDP | WireGuard |
| 443 | TCP | DERP HTTPS |
# UFW 配置
ufw allow 8080/tcp
ufw allow 3478/udp
ufw allow 41641/udp
ufw allow 443/tcp
常见问题
节点无法连接
- 检查防火墙端口是否开放
- 检查 Headscale 服务是否运行
- 查看日志:
journalctl -u headscale -f
打洞失败,一直走 DERP
- 检查 NAT 类型(对称型 NAT 难以打洞)
- 确保 UDP 3478 和 41641 端口开放
- 尝试使用自建 DERP
路由不生效
- 确认服务端已批准路由:
headscale routes list - 客户端需要
--accept-routes=true - 检查客户端的 iptables/nftables 规则
小结
Headscale + Tailscale 是一套强大的异地组网方案:
- 服务端:Headscale 提供控制平面
- 客户端:Tailscale 提供数据平面
- DERP:自建中继优化国内访问
适用场景:
- 家庭 NAS 远程访问
- 跨云服务器组网
- 团队远程办公
- IoT 设备管理
参考资料: