Tailscale+自建Headscale-异地组网/内网穿透
之前给大家推荐的Zerotier工具,在使用一段时间后发现在网络状态不好的情况下经常出现网络卡顿,甚至是联不通的情况且设备数量受限制,所以今天给大家推荐另一款工具Tailscale对中国大陆网络环境更友好的内网穿透/虚拟局域网工具工具名是否适合中国大陆是否支持自建推荐用途Tailscale🌟🌟🌟(配合Headscale)✅多设备虚拟局域网FRP🌟🌟🌟🌟🌟✅远程桌面/SSHNPS🌟
前言:
之前给大家推荐的Zerotier工具,在使用一段时间后发现在网络状态不好的情况下经常出现网络卡顿,甚至是联不通的情况且设备数量受限制,所以今天给大家推荐另一款工具Tailscale
首先我们先看一下主流工具的对比:
对中国大陆网络环境更友好的内网穿透/虚拟局域网工具 | |||
---|---|---|---|
工具名 | 是否适合中国大陆 | 是否支持自建 | 推荐用途 |
Tailscale | 🌟🌟🌟(配合Headscale) | ✅ | 多设备虚拟局域网 |
FRP | 🌟🌟🌟🌟🌟 | ✅ | 远程桌面/SSH |
NPS | 🌟🌟🌟🌟 | ✅ | 可视化内网穿透 |
ZeroTier | 🌟(被墙时慢) | ❌ | 小型虚拟局域网 |
Ngrok/natapp | 🌟🌟🌟🌟 | ❌ | 临时调试,HTTP |
Tinc/SoftEther | 🌟🌟🌟 | ✅ | VPN/内网连通 |
最推荐方案一:Tailscale + Headscale 自建
项目 | 说明 |
Tailscale | 商用版有限制(20个客户端) |
Headscale(自建控制面板) | 完全免费、不限客户端、支持多设备登录 |
✅ 优点:
-
基于 WireGuard,超稳定、高安全
-
客户端支持 Win/Mac/Linux/Android/iOS
-
客户端无需特殊配置,安装登录即可上线
-
Headscale 支持自建控制中心(一次性配置)
服务器要求 | |
项目 | 要求 |
---|---|
系统 | 推荐 Ubuntu 20.04+/Debian 11+/CentOS 7+/Alpine |
CPU |
任意 VPS 即可(单核 512MB 起步) |
内存 | 最低 512MB(推荐 1GB+) |
网络 | 能连外网即可,不要求公网 IP(但有最好) |
域名 | 推荐有个域名用于 HTTPS(可选) |
安全组 | 开放 TCP 端口 8080 和 UDP 端口 3478 (默认) |
这里我的服务器配置为:Ubuntu22,2核4G,5兆带宽有公网ip,未备案无法开启80,8080,等敏感端口;
部署教程
推荐用 Docker 部署,省事稳定
✅ 步骤 1:安装 Docker(Ubuntu 例子)
apt update
apt install -y docker.io docker-compose
systemctl enable docker
systemctl start docker
✅ 步骤 2:创建配置目录
mkdir -p /opt/headscale/config /opt/headscale/data
cd /opt/headscale
✅ 步骤 3:创建配置文件 config.yaml
放在 /opt/headscale/config/config.yaml
#公网ip+端口需要可开放
server_url: http://你的公网ip:30080
listen_addr: 0.0.0.0:8080
grpc_listen_addr: 0.0.0.0:50443
private_key_path: /var/lib/headscale/private.key
noise:
private_key_path: /var/lib/headscale/noise_private.key
#分配的ipv4和ipv6地址
prefixes:
v6: fd7a:115c:a1e0::/48
v4: 100.64.0.0/10
#DERP默认服务器,如果打洞失败将走官方提供的服务器
derp:
urls:
- https://controlplane.tailscale.com/derpmap/default
auto_update_enabled: true
update_frequency: 24h
#DNS解析
dns:
magic_dns: true
base_domain: luminous.network
nameservers:
global:
- 119.29.29.29
- 223.6.6.6
#数据库配置
database:
type: sqlite
sqlite:
path: /var/lib/headscale/db.sqlite
#日志配置
log:
format: text
level: info
✅ 步骤 4:创建 docker-compose.yml
放在 /opt/headscale/docker-compose.yml
services:
headscale:
image: headscale/headscale:latest
container_name: headscale
restart: always
volumes:
- ./config:/etc/headscale
- ./data:/var/lib/headscale
ports:
- "30080:8080"
- "33478:3478/udp"
command: serve
✅ 步骤 5:Docker Compose 启动
docker compose up -d
配置教程
✅ 步骤 1:创建用户
docker exec -it headscale headscale users create 用户名
✅ 步骤2 :生成密钥key
#先查看用户id
docker exec headscale headscale users list
#替换用户id,创建一个key,这里的30d是30天过期
docker exec headscale headscale preauthkeys create --reusable --expiration 30d --user 用户id
✅ 步骤3 :下载客户端并加入到网络中
安装 Tailscale 客户端:https://tailscale.com/download
根据系统版本下载即可
登录命令行:
#windows 使用powershell
tailscale up --login-server http://你的公网ip:30080 --authkey 生成的key
#Linux 使用 sudo
sudo tailscale up --login-server http://你的公网ip:30080 --authkey 生成的key
#MacOS 使用sudo
sudo /Applications/Tailscale.app/Contents/MacOS/tailscale up --auth-key=你的密钥key --login-server=http://服务器ip:30080 --accept-routes
到此你的设备就已经加入到网络中了,其他设备只需要下载客户端加入到网络中即可
其他指令
#验证连接 direct 是点对点直连 relay (fra)中继服务器转发
tailscale status
#查看本机被分配的 IP 地址
tailscale ip -4
#使密钥key失效
docker exec headscale headscale preauthkeys expire 密钥key --user 用户id
#查看密钥列表
docker exec headscale headscale preauthkeys list --user 用户id
拓展
如果服务器没有公网地址
可以,但是会复杂很多,并且需要借助一些额外的工具或技巧来实现“内网穿透”。
核心挑战
Headscale
作为一个控制服务器,它的核心职责是协调你所有的客户端设备(节点)建立连接。这意味着,你的任何一个客户端(比如你在外的笔记本电脑、手机)都必须能够随时随地、通过一个固定的地址联系到你的 Headscale 服务器。
当服务器没有公网IP时,它就藏在你的家庭或公司局域网(NAT)后面,外网的设备无法主动找到它。因此,我们的所有解决方案都围绕着一个目标:想办法让外网的设备能访问到你内网的 Headscale 服务器。
方案一:端口转发 + 动态DNS(DDNS)
这个方案适用于你在家或办公室,并且拥有路由器的管理权限,同时你的网络运营商(ISP)分配给你的是一个公网IP(即使是动态变化的)。
-
你需要什么?
-
操作步骤:
- 设置DDNS:在DDNS服务商网站注册一个账号,设置一个域名,然后在你的路由器里找到DDNS设置,填入你的账号信息,让路由器自动更新IP和域名的对应关系。
- 设置端口转发:在路由器管理界面找到“端口转发”或“虚拟服务器”功能。添加两条转发规则:
- 规则1 (Headscale控制端口):将外部端口(例如
30080
)的TCP
流量,转发到你内网中运行 Headscale 的那台机器的30080
端口。 - 规则2 (STUN/DERP端口):将外部端口(例如
3478
)的UDP
流量,转发到 Headscale 机器的3478
端口。(如果你打算在上面运行STUN服务以辅助NAT穿透)。
- 规则1 (Headscale控制端口):将外部端口(例如
- 修改Headscale配置:在你的
config.yaml
中,将server_url
设置为你的DDNS域名和端口,例如http://myheadscale.ddns.net:30080
。
方案二:使用内网穿透/反向隧道工具(最通用、最推荐)
这个方案适用于任何情况,无论你是否有路由器权限,或者是否在多层NAT(CGNAT)后。 它的原理是在一台有公网IP的服务器上运行一个中转服务,然后让你内网的 Headscale 服务器主动去连接这个中转站。
-
你需要什么?
- 一台有公网IP的便宜VPS:例如最低配的阿里云、腾讯云、Vultr、DigitalOcean等服务器。这台VPS只用来做流量中转,对性能要求极低。
- 一个内网穿透工具:最流行的是
frp
,此外还有ngrok
、Cloudflare Tunnel
等。这里以frp
为例。
-
操作步骤(以 frp 为例):
- 在公网VPS上:
- 下载并运行
frp
的服务端(frps)。 - 配置
frps.ini
文件,主要就是设置一个监听端口(如7000
)和一个用于通信的token。
- 下载并运行
- 在你内网的 Headscale 服务器上:
- 下载并运行
frp
的客户端(frpc)。 - 配置
frpc.ini
文件,告诉它你公网VPS的地址和端口。 - 在
frpc.ini
中设置代理规则,将公网VPS的某个端口(例如30080
)的流量,通过隧道转发到本地的127.0.0.1:30080
(即你的 Headscale 容器)。
- 下载并运行
- 修改Headscale配置:在
config.yaml
中,将server_url
设置为你的公网VPS的IP和端口,例如http://<你的公-网-V-P-S-的-I-P>:30080
。
- 在公网VPS上:
方案三:使用另一个VPN或SD-WAN作为“前置网络”
这是一个比较“套娃”但可行的思路,它完全不需要任何公网IP。
-
你需要什么?
- 另一个P2P组网工具:例如 Zerotier,或者使用官方的、免费套餐的Tailscale。
-
操作步骤:
- 创建一个 Zerotier 网络(或者一个免费的 Tailscale 账号网络)。
- 将你内网的 Headscale 服务器和所有你希望连接的客户端设备,全部加入到这个前置的 Zerotier/Tailscale 网络中。
- 现在,你的所有设备都在同一个虚拟局域网里了。你的 Headscale 服务器会被分配一个 Zerotier/Tailscale 的虚拟IP(例如
10.147.x.x
)。 - 修改Headscale配置:在
config.yaml
中,将server_url
设置为 Headscale 服务器的Zerotier/Tailscale 虚拟IP和端口,例如http://10.147.10.1:30080
。 - 连接客户端:在客户端上,使用
tailscale up --login-server http://10.147.10.1:30080 ...
来连接。
总结与对比
方案 | 你需要什么 | 优点 | 缺点 |
方案一:端口转发 | 路由器管理权,公网IP,DDNS | 无需额外服务器,成本最低 | 依赖ISP策略,可能因无公网IP或端口被封而失败 |
方案二:内网穿透 (frp) | 一台便宜的公网VPS | 极其稳定可靠,适用性最广 | 需要额外一台VPS的成本和维护 |
方案三:“套娃”网络 | 一个外部P2P网络账号 (如Zerotier) | 完全不需要公网IP,免费 | 增加了网络的复杂性,所有设备都需安装两个客户端,性能依赖前置网络 |
更多推荐
所有评论(0)