前言:

之前给大家推荐的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(即使是动态变化的)。

  1. 你需要什么?

    • 路由器管理权限:能够登录你的路由器设置端口转发。
    • 一个动态DNS服务(DDNS):例如 No-IPDynu 或者路由器/NAS自带的DDNS服务。因为家庭宽带的公网IP通常会变化,DDNS能给你的动态IP绑定一个固定的域名(例如 myheadscale.ddns.net)。
    • 确认你的IP是公网IP:登录路由器查看WAN口获取的IP地址,然后访问 ip.cnipinfo.io,看显示的IP是否和WAN口IP一致。如果不一致,你可能处于一个多层NAT(CGNAT)环境,此方案无效。
  2. 操作步骤:

    • 设置DDNS:在DDNS服务商网站注册一个账号,设置一个域名,然后在你的路由器里找到DDNS设置,填入你的账号信息,让路由器自动更新IP和域名的对应关系。
    • 设置端口转发:在路由器管理界面找到“端口转发”或“虚拟服务器”功能。添加两条转发规则:
      • 规则1 (Headscale控制端口):将外部端口(例如 30080)的 TCP 流量,转发到你内网中运行 Headscale 的那台机器的 30080 端口。
      • 规则2 (STUN/DERP端口):将外部端口(例如 3478)的 UDP 流量,转发到 Headscale 机器的 3478 端口。(如果你打算在上面运行STUN服务以辅助NAT穿透)。
    • 修改Headscale配置:在你的 config.yaml 中,将 server_url 设置为你的DDNS域名和端口,例如 http://myheadscale.ddns.net:30080

方案二:使用内网穿透/反向隧道工具(最通用、最推荐)

这个方案适用于任何情况,无论你是否有路由器权限,或者是否在多层NAT(CGNAT)后。 它的原理是在一台有公网IP的服务器上运行一个中转服务,然后让你内网的 Headscale 服务器主动去连接这个中转站。

  1. 你需要什么?

    • 一台有公网IP的便宜VPS:例如最低配的阿里云、腾讯云、Vultr、DigitalOcean等服务器。这台VPS只用来做流量中转,对性能要求极低。
    • 一个内网穿透工具:最流行的是 frp,此外还有 ngrokCloudflare Tunnel 等。这里以 frp 为例。
  2. 操作步骤(以 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

方案三:使用另一个VPN或SD-WAN作为“前置网络”

这是一个比较“套娃”但可行的思路,它完全不需要任何公网IP。

  1. 你需要什么?

    • 另一个P2P组网工具:例如 Zerotier,或者使用官方的、免费套餐的Tailscale
  2. 操作步骤:

    • 创建一个 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,免费 增加了网络的复杂性,所有设备都需安装两个客户端,性能依赖前置网络

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐