Headscale VPN 完整操作手册

自建私有VPN网络 - 完全控制您的网络连接

服务器IP: 38.54.100.175 | 连接地址: http://38.54.100.175:8080

📋 目录

概述

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:安装应用
  1. 打开Google Play商店或下载APK文件
  2. 搜索"Tailscale"并安装
  3. 如果下载APK,需要开启"未知来源"安装权限
✅ 步骤2:配置服务器地址(两种方式)

方式一:分步配置(推荐新手)

  1. 打开Tailscale应用
  2. 点击"Sign in"或"登录"
  3. 选择"Use a custom login server"或"使用自定义登录服务器"
  4. 输入服务器地址:http://38.54.100.175:8080(推荐使用HTTP避免证书问题)
  5. 点击"Continue"或"继续"
  6. 等待服务器连接验证

方式二:一键连接(推荐熟练用户)

  1. 打开Tailscale应用
  2. 点击"Sign in"或"登录"
  3. 选择"Use a custom login server"或"使用自定义登录服务器"
  4. 输入包含预授权密钥的完整地址:http://38.54.100.175:8080?authkey=YOUR_AUTH_KEY
  5. 点击"Continue"或"继续"
  6. 应用会自动连接并建立VPN
💡 连接方式说明:
  • 方式一(分步): 先配置服务器地址,再输入预授权密钥,适合新手用户
  • 方式二(一键): 在服务器地址中直接包含预授权密钥,一步完成连接
  • URL格式: https://38.54.100.175?authkey=tskey-auth-xxxxx
  • 安全提醒: 包含密钥的URL请妥善保管,不要分享给他人
✅ 步骤3:生成预授权密钥
  1. 在服务器端生成预授权密钥:headscale preauthkeys create --user=1 --reusable --expiration 24h
  2. 查看生成的密钥:headscale preauthkeys list --user=1
  3. 复制生成的密钥(以tskey-开头的字符串)
✅ 步骤4:使用预授权密钥连接
  1. 方式一用户: 在Android应用中,确保已配置正确的服务器地址,然后在密钥输入框中粘贴预授权密钥
  2. 方式二用户: 将密钥替换到URL中:https://38.54.100.175?authkey=tskey-auth-xxxxx
  3. 点击"Connect"或"连接"
  4. 等待连接建立
✅ 步骤5:权限设置
  1. 允许VPN权限(必需)
  2. 允许通知权限(可选,用于连接状态通知)
  3. 如果使用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连接(推荐)

  1. 在Android应用中,选择"使用自定义登录服务器"
  2. 输入服务器地址:http://38.54.100.175:8080(注意是HTTP,不是HTTPS)
  3. 继续后续步骤

解决方案2:清除应用数据

  1. 进入Android设置 → 应用管理 → Tailscale
  2. 点击"存储" → "清除数据"
  3. 重新打开Tailscale应用
  4. 使用HTTP地址重新配置

解决方案3:检查网络环境

  1. 确保手机网络可以访问服务器IP
  2. 尝试在浏览器中访问 http://38.54.100.175:8080
  3. 如果浏览器也无法访问,可能是网络限制问题

解决方案4:使用一键连接方式

  1. 生成新的预授权密钥:headscale preauthkeys create --user=1 --reusable --expiration 24h
  2. 构建HTTP一键连接URL:http://38.54.100.175:8080?authkey=YOUR_AUTH_KEY
  3. 在Android应用中直接输入这个完整URL
💡 为什么会出现证书错误?
  • 自签名证书: 服务器使用的是自签名SSL证书,Android无法验证其有效性
  • 证书链不完整: 缺少中间证书或根证书
  • 证书过期: SSL证书已过期
  • 域名不匹配: 证书中的域名与访问的IP地址不匹配
🔒 安全说明:
  • 使用HTTP连接在本地网络环境中是相对安全的
  • 预授权密钥本身提供了认证保护
  • 如果需要更高的安全性,建议配置有效的SSL证书

3.7 其他平台客户端

连接指南

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证书
⚠️ 问题2:连接超时
错误: connection attempts aborted by context: context deadline exceeded
解决: 检查防火墙设置和网络连通性
⚠️ 问题3:域名解析错误
错误: 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)
使用方法:
  1. 下载脚本到桌面
  2. 以管理员身份运行PowerShell
  3. 执行脚本:.\cleanup-tailscale.ps1
  4. 重新安装Tailscale客户端
  5. 使用新的预授权密钥连接

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