概述
Headscale是一个开源的Tailscale控制服务器,允许您创建和管理自己的私有VPN网络。本手册将指导您完成完整的配置过程。
🎯 主要特性:
- 完全控制的私有VPN网络
- 支持多平台客户端(Windows、macOS、Linux、iOS、Android)
- 自动NAT穿透和P2P连接
- 内置DERP中继服务器
- 细粒度访问控制
服务器端配置
2.1 系统要求
- Ubuntu 20.04+ 或 Debian 11+
- 至少1GB RAM
- 开放端口:80, 443, 8080, 50443, 3478
- 公网IP地址
2.2 安装Headscale
# 下载并安装Headscale
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
sudo apt update
sudo apt install headscale
2.3 配置Headscale
# 创建配置目录
sudo mkdir -p /etc/headscale
# 复制配置文件
sudo cp /usr/share/headscale/config-example.yaml /etc/headscale/config.yaml
# 编辑配置文件
sudo nano /etc/headscale/config.yaml
2.4 配置文件内容
# 主要配置项
server_url: http://38.54.100.175:8080
listen_addr: 0.0.0.0:8080
grpc_listen_addr: 0.0.0.0:50443
grpc_allow_insecure: false
# DERP服务器配置
derp:
server:
enabled: true
region_id: 999
region_code: "headscale"
region_name: "Headscale Embedded DERP"
stun_listen_addr: "0.0.0.0:3478"
ipv4: 38.54.100.175
# 数据库配置
database:
type: sqlite
sqlite:
path: /var/lib/headscale/db.sqlite
write_ahead_log: true
# DNS配置
dns:
magic_dns: true
base_domain: headscale.local
nameservers:
global:
- 1.1.1.1
- 1.0.0.1
2.5 安装Caddy反向代理
# 安装Caddy
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
# 配置Caddy
sudo nano /etc/caddy/Caddyfile
2.6 Caddy配置文件
# 域名配置 - 使用自签名证书
qywbip.qumai8.cn {
reverse_proxy localhost:8080
tls internal
log {
output file /var/log/caddy/headscale.log
}
}
# IP地址配置 - 使用自签名证书
38.54.100.175 {
reverse_proxy localhost:8080
tls internal
log {
output file /var/log/caddy/headscale.log
}
}
# HTTP重定向到HTTPS
:80 {
redir https://{host}{uri} permanent
}
2.7 启动服务
# 创建必要目录
sudo mkdir -p /var/lib/headscale
sudo mkdir -p /var/run/headscale
# 设置权限
sudo chown -R headscale:headscale /var/lib/headscale
sudo chown -R headscale:headscale /var/run/headscale
# 启动服务
sudo systemctl enable headscale
sudo systemctl start headscale
sudo systemctl enable caddy
sudo systemctl start caddy
# 检查服务状态
sudo systemctl status headscale
sudo systemctl status caddy
2.8 配置防火墙
# 开放必要端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp
sudo ufw allow 50443/tcp
sudo ufw allow 3478/udp
sudo ufw allow ssh
# 启用防火墙
sudo ufw enable
# 检查防火墙状态
sudo ufw status
客户端配置
3.1 Windows客户端
📥 下载地址: 虚拟组网PC端
3.2 Android安卓客户端
📱 下载方式:
- Google Play商店: 搜索"Tailscale"并安装
- APK直接下载: 下载APK文件 (v1.84.0)
- F-Droid: 在F-Droid中搜索"Tailscale"
3.3 Android安装步骤
✅ 步骤1:安装应用
- 打开Google Play商店或下载APK文件
- 搜索"Tailscale"并安装
- 如果下载APK,需要开启"未知来源"安装权限
✅ 步骤2:配置服务器地址(两种方式)
方式一:分步配置(推荐新手)
- 打开Tailscale应用
- 点击"Sign in"或"登录"
- 选择"Use a custom login server"或"使用自定义登录服务器"
- 输入服务器地址:
http://38.54.100.175:8080(推荐使用HTTP避免证书问题) - 点击"Continue"或"继续"
- 等待服务器连接验证
方式二:一键连接(推荐熟练用户)
- 打开Tailscale应用
- 点击"Sign in"或"登录"
- 选择"Use a custom login server"或"使用自定义登录服务器"
- 输入包含预授权密钥的完整地址:
http://38.54.100.175:8080?authkey=YOUR_AUTH_KEY - 点击"Continue"或"继续"
- 应用会自动连接并建立VPN
💡 连接方式说明:
- 方式一(分步): 先配置服务器地址,再输入预授权密钥,适合新手用户
- 方式二(一键): 在服务器地址中直接包含预授权密钥,一步完成连接
- URL格式:
https://38.54.100.175?authkey=tskey-auth-xxxxx - 安全提醒: 包含密钥的URL请妥善保管,不要分享给他人
✅ 步骤3:生成预授权密钥
- 在服务器端生成预授权密钥:
headscale preauthkeys create --user=1 --reusable --expiration 24h - 查看生成的密钥:
headscale preauthkeys list --user=1 - 复制生成的密钥(以tskey-开头的字符串)
✅ 步骤4:使用预授权密钥连接
- 方式一用户: 在Android应用中,确保已配置正确的服务器地址,然后在密钥输入框中粘贴预授权密钥
- 方式二用户: 将密钥替换到URL中:
https://38.54.100.175?authkey=tskey-auth-xxxxx - 点击"Connect"或"连接"
- 等待连接建立
✅ 步骤5:权限设置
- 允许VPN权限(必需)
- 允许通知权限(可选,用于连接状态通知)
- 如果使用APK安装,可能还需要允许"安装未知应用"权限
3.4 Android一键连接方式
🚀 一键连接的优势:
- 简化流程: 无需分步配置,一次输入即可完成连接
- 减少错误: 避免多次输入可能产生的错误
- 快速部署: 适合批量部署或快速分享给团队成员
- URL分享: 可以通过消息、邮件等方式直接分享连接
# 生成预授权密钥
headscale preauthkeys create --user=1 --reusable --expiration 24h
# 查看生成的密钥
headscale preauthkeys list --user=1
# 构建一键连接URL(示例)
# https://38.54.100.175?authkey=tskey-auth-xxxxx-xxxxxxxxxxxx
⚠️ 一键连接注意事项:
- URL安全: 包含密钥的URL具有访问权限,请妥善保管
- 密钥有效期: 注意密钥的过期时间,过期后需要重新生成
- HTTPS要求: 建议使用HTTPS连接以确保安全性
- 网络环境: 确保手机网络可以访问服务器地址
3.5 Android高级配置
🔧 高级设置选项:
- Exit Node: 设置为出口节点,所有流量通过VPN
- Subnet Routes: 配置子网路由
- DNS Settings: 自定义DNS服务器
- Split Tunneling: 选择性路由(部分应用走VPN)
⚠️ Android注意事项:
- Android 10+需要VPN权限才能正常工作
- 某些定制ROM可能需要额外权限设置
- 如果连接失败,尝试清除应用数据重新配置
- 确保手机网络连接正常(WiFi或移动数据)
3.6 Android故障排除
❌ 常见问题及解决方案:
- 连接超时: 检查服务器地址是否正确,尝试使用IP地址
- 证书错误: 如果遇到证书问题,可以尝试使用HTTP连接:
http://38.54.100.175:8080 - 权限被拒绝: 确保已授予VPN权限
- 应用崩溃: 清除应用数据或重新安装
- 无法访问网络: 检查防火墙设置和网络配置
🔧 证书错误详细解决方案:
错误信息: x509: certificate signed by unknown authority
解决方案1:使用HTTP连接(推荐)
- 在Android应用中,选择"使用自定义登录服务器"
- 输入服务器地址:
http://38.54.100.175:8080(注意是HTTP,不是HTTPS) - 继续后续步骤
解决方案2:清除应用数据
- 进入Android设置 → 应用管理 → Tailscale
- 点击"存储" → "清除数据"
- 重新打开Tailscale应用
- 使用HTTP地址重新配置
解决方案3:检查网络环境
- 确保手机网络可以访问服务器IP
- 尝试在浏览器中访问
http://38.54.100.175:8080 - 如果浏览器也无法访问,可能是网络限制问题
解决方案4:使用一键连接方式
- 生成新的预授权密钥:
headscale preauthkeys create --user=1 --reusable --expiration 24h - 构建HTTP一键连接URL:
http://38.54.100.175:8080?authkey=YOUR_AUTH_KEY - 在Android应用中直接输入这个完整URL
💡 为什么会出现证书错误?
- 自签名证书: 服务器使用的是自签名SSL证书,Android无法验证其有效性
- 证书链不完整: 缺少中间证书或根证书
- 证书过期: SSL证书已过期
- 域名不匹配: 证书中的域名与访问的IP地址不匹配
- 使用HTTP连接在本地网络环境中是相对安全的
- 预授权密钥本身提供了认证保护
- 如果需要更高的安全性,建议配置有效的SSL证书
3.7 其他平台客户端
- macOS: 下载
- Linux: Ubuntu/Debian
- iOS: App Store搜索"Tailscale"
连接指南
4.1 创建用户和密钥
# 创建用户
headscale users create default
# 生成预授权密钥
headscale preauthkeys create --user=1 --reusable --expiration 24h
# 查看生成的密钥
headscale preauthkeys list --user=1
4.2 预授权密钥查询和管理
🔑 预授权密钥说明:
- 作用: 允许客户端无需手动认证即可加入网络
- 有效期: 可以设置过期时间,默认24小时
- 可重用性: 可以设置为一次性或可重复使用
- 安全性: 密钥泄露后应立即删除并重新生成
# 查看所有预授权密钥
headscale preauthkeys list --user=1
# 查看特定密钥详情
headscale preauthkeys list --user=1 --output json
# 生成新的预授权密钥(可重用,24小时过期)
headscale preauthkeys create --user=1 --reusable --expiration 24h
# 生成一次性密钥(使用后自动失效)
headscale preauthkeys create --user=1 --reusable=false --expiration 1h
# 生成长期有效的密钥(7天)
headscale preauthkeys create --user=1 --reusable --expiration 168h
# 删除/使密钥过期
headscale preauthkeys expire --user=1 KEY_ID
# 查看密钥使用情况
headscale preauthkeys list --user=1 --output json | jq '.[] | {id, key, created, expiration, used, reusable}'
⚠️ 密钥安全注意事项:
- 预授权密钥具有管理员权限,请妥善保管
- 不要在公开场合分享密钥
- 定期更换密钥以提高安全性
- 如果密钥泄露,立即删除并重新生成
- 建议为不同用途创建不同的密钥
✅ 密钥使用最佳实践:
- 临时密钥: 为临时用户生成短期密钥(1-24小时)
- 长期密钥: 为固定设备生成长期密钥(7-30天)
- 一次性密钥: 为重要设备使用一次性密钥
- 密钥轮换: 定期更换所有密钥
- 监控使用: 定期检查密钥使用情况
4.3 Windows客户端连接
# 退出当前连接(如果有)
tailscale logout
# 使用HTTP连接(推荐)
tailscale up --login-server=http://38.54.100.175:8080 --authkey=YOUR_AUTH_KEY
# 或者使用HTTPS连接(需要处理证书问题)
tailscale up --login-server=https://38.54.100.175 --authkey=YOUR_AUTH_KEY
4.4 验证连接
# 检查连接状态
tailscale status
# 查看分配的IP
tailscale ip
# 测试网络连接
ping 100.64.0.1
4.5 服务器端验证
# 查看连接的节点
headscale nodes list
# 查看节点详情
headscale nodes list --output json
# 实时监控
watch -n 2 'headscale nodes list'
故障排除
5.1 常见问题
⚠️ 问题1:证书验证失败
错误: x509: certificate signed by unknown authority
解决: 使用HTTP连接或配置正确的SSL证书
错误: x509: certificate signed by unknown authority
解决: 使用HTTP连接或配置正确的SSL证书
⚠️ 问题2:连接超时
错误: connection attempts aborted by context: context deadline exceeded
解决: 检查防火墙设置和网络连通性
错误: connection attempts aborted by context: context deadline exceeded
解决: 检查防火墙设置和网络连通性
⚠️ 问题3:域名解析错误
错误: dial tcp [wrong-ip]:443: connectex: A connection attempt failed
解决: 使用IP地址连接或修复DNS解析
错误: dial tcp [wrong-ip]:443: connectex: A connection attempt failed
解决: 使用IP地址连接或修复DNS解析
5.2 诊断命令
# 检查服务状态
sudo systemctl status headscale
sudo systemctl status caddy
# 查看日志
sudo journalctl -u headscale -f
sudo journalctl -u caddy -f
# 检查端口监听
sudo ss -tlnp | grep -E "(8080|443|50443)"
# 测试本地连接
curl http://localhost:8080/health
curl -k https://localhost/health
5.3 Windows客户端清理
💡 如果连接有问题,可以使用下面的清理脚本重置Windows客户端设置
管理操作
6.1 用户管理
# 创建用户
headscale users create username
# 列出用户
headscale users list
# 删除用户
headscale users destroy username
6.2 节点管理
# 列出所有节点
headscale nodes list
# 查看节点详情
headscale nodes list --output json
# 删除节点
headscale nodes destroy NODE_ID
# 重命名节点
headscale nodes rename NODE_ID new-name
6.3 预授权密钥管理
# 生成新密钥
headscale preauthkeys create --user=1 --reusable --expiration 24h
# 列出密钥
headscale preauthkeys list --user=1
# 删除密钥
headscale preauthkeys expire --user=1 KEY_ID
6.4 路由管理
# 启用子网路由
headscale nodes enable-routes --node NODE_ID --routes 192.168.1.0/24
# 查看路由
headscale nodes list --output json | grep -A 5 -B 5 "routes"
工具下载
🔧 Windows客户端清理脚本
如果Windows客户端连接有问题,可以使用此脚本完全清理Tailscale设置并重新开始。
📥 下载清理脚本 (PowerShell)
使用方法:
- 下载脚本到桌面
- 以管理员身份运行PowerShell
- 执行脚本:
.\cleanup-tailscale.ps1 - 重新安装Tailscale客户端
- 使用新的预授权密钥连接
7.1 配置文件模板
# Headscale配置文件 (config.yaml)
server_url: http://38.54.100.175:8080
listen_addr: 0.0.0.0:8080
grpc_listen_addr: 0.0.0.0:50443
grpc_allow_insecure: false
noise:
private_key_path: /var/lib/headscale/noise_private.key
prefixes:
v4: 100.64.0.0/10
v6: fd7a:115c:a1e0::/48
allocation: sequential
derp:
server:
enabled: true
region_id: 999
region_code: "headscale"
region_name: "Headscale Embedded DERP"
stun_listen_addr: "0.0.0.0:3478"
private_key_path: /var/lib/headscale/derp_server_private.key
automatically_add_embedded_derp_region: true
ipv4: 38.54.100.175
urls:
- https://controlplane.tailscale.com/derpmap/default
paths: []
auto_update_enabled: true
update_frequency: 24h
disable_check_updates: false
ephemeral_node_inactivity_timeout: 30m
database:
type: sqlite
debug: false
gorm:
prepare_stmt: true
parameterized_queries: true
skip_err_record_not_found: true
slow_threshold: 1000
sqlite:
path: /var/lib/headscale/db.sqlite
write_ahead_log: true
wal_autocheckpoint: 1000
acme_url: https://acme-v02.api.letsencrypt.org/directory
acme_email: ""
tls_letsencrypt_hostname: ""
tls_letsencrypt_cache_dir: /var/lib/headscale/cache
tls_letsencrypt_challenge_type: HTTP-01
tls_letsencrypt_listen: ":http"
tls_cert_path: ""
tls_key_path: ""
log:
format: text
level: info
policy:
mode: file
path: ""
dns:
magic_dns: true
base_domain: headscale.local
override_local_dns: false
nameservers:
global:
- 1.1.1.1
- 1.0.0.1
- 2606:4700:4700::1111
- 2606:4700:4700::1001
split: {}
search_domains: []
extra_records: []
unix_socket: /var/run/headscale/headscale.sock
unix_socket_permission: "0770"
logtail:
enabled: false
randomize_client_port: false
联系信息
📞 技术支持:
• 服务器IP: 38.54.100.175
• 连接地址: http://38.54.100.175:8080
• 管理界面: http://38.54.100.175:8080
• 当前用户: user001_p5h9m2
• 客户端IP: 100.64.0.1
• 服务器IP: 38.54.100.175
• 连接地址: http://38.54.100.175:8080
• 管理界面: http://38.54.100.175:8080
• 当前用户: user001_p5h9m2
• 客户端IP: 100.64.0.1