用tailscale实现点对点直连异地组网
superTree311
2026年02月25日 11:25

一、tailscale是什么?

Tailscale 是一款基于 WireGuard 协议的零配置 VPN(虚拟专用网络)工具,它让你可以轻松地将分散在不同地点的设备(手机、PC电脑、服务器 等)组成一个安全的私有网络,就像它们连接在同一台交换机上一样。

二、实验场景

在紧密型医疗体环境下,各分院区需要互联互通,实验场景模拟就是A院区业务部门与B院区业务部门,业务上的一个互联互通。

用Tailscale:设备 A ↔ 设备 B 直连(去中心化,延迟低,无法被中间人窃听)。

三、最简单的配置

3.1 网络结构

3.2 两台虚拟机上的配置。

由于VMVare虚拟机最多只支持一个NAT网络,所以本实验选择VirtualBox虚拟软件来实现。

3.2.1打开VirtualBox 配置相应的实验环境,配置独立的NAT网络。

设置两台虚拟机分属于不同的NAT网络。

启动后进行网络测试,相互不能通讯。

3.2.2 安装配置tailscale实现点对点通讯

安装Tailscale,我使用的是Ubuntu系统,运行如下指令

代码块
PlainText
自动换行
复制代码
sudo curl -fsSL https://tailscale.com/install.sh | sh
复制成功

两台虚拟机均需安装。

安装完成后,运行 tailscale version 显示运行版本信息。

启动tailscale,运行指令 sudo tailscale up

使用给出的的连接进行账号登录

点击连接设备

可以看到,两台主机都已经是Connected的状态了,就可以相互之间进行通讯了。

在两台机器运行指令 tailscale status 可以查看相应的运行状态。

使用ping命令,双方可以ping通,就可以进行通信使用了。

四、自建服务器,实现安全可靠的通讯。

上面虽然已经实现了互相通讯,但都需要在tailscale服务器上面注册相关信息,并进行中继通信,距离我们完全自主可靠的方案还有差距,下面我们来实现。

4.1 安装Headscale控制服务器。

运行以下指令时,进行安装:

代码块
Shell
自动换行
复制代码
cd /tmp
sudo wget --output-document=headscale.deb https://github.com/juanfont/headscale/releases/download/v0.28.0/headscale_0.28.0_linux_amd64.debsudo apt install ./headscale.deb -y
复制成功

编辑配置文件 /etc/headscale/config.yaml, 主要配置参数如下:

代码块
YAML
自动换行
复制代码

# 服务器公网访问地址(必须使用域名或公网IP,若有域名建议配置SSL)
server_url: http://10.1.6.182:8080  # 请配置成你自己的服务器IP
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 0.0.0.0:9090

# 数据库配置(使用SQLite,生产环境建议PostgreSQL)
db_type: sqlite3
db_path: /var/lib/headscale/db.sqlite

# IP地址池配置(100.64.0.0/10 为CGNAT保留段)
ip_prefixes:
  - 100.64.0.0/10
  - fd7a:115c:a1e0::/48

# 随机化客户端端口(提高NAT穿透成功率)
randomize_client_port: true

# 禁用Magic DNS(如不需要虚拟域名解析)
dns:
  magic_dns: false
  nameservers:
    global:
      - 223.5.5.5
      - 8.8.8.8

# 嵌入式DERP配置(关键部分)
derp:
  server:
    enabled: true                    # 启用内置DERP
    region_id: 999                   # 区域ID,自定义
    region_code: "self-hosted"       # 区域代码
    region_name: "My DERP Server"    # 显示名称
    automatically_add_embedded_derp_region: true  # 自动推送给客户端
    
    # 服务器公网IP(必须填写,用于STUN和DERP)
    ipv4: "10.1.6.182"
    ipv6: "fd7a:115c:a1e0::/48"         # 如有
    
    # 监听端口(DERP默认使用TCP/UDP 3478 for STUN)
    stun_listen_addr: "0.0.0.0:3478"
  
  # 禁用Tailscale官方DERP(实现完全自主)
  urls: []
  
  # 如需额外独立DERP节点,在此配置路径
  paths: []
  
# 其他优化配置
grpc_listen_addr: 0.0.0.0:50443
grpc_allow_insecure: false
acl_policy_path: ""

# Unix Socket路径(需与systemd服务匹配)
unix_socket: /var/run/headscale/headscale.sock
unix_socket_permission: "0770"

# 日志配置
log:
  format: text
  level: info
复制成功

可以使用以下命令sudo headscale configtest,测试一下配置文件。

启动并配置自启动服务

代码块
Shell
自动换行
复制代码
sudo systemctl enable --now headscale
sudo systemctl status headscale
# 我遇见的坑就是默认安装这个服务启动了,一直连不上。后来发现重启一下服务就好了。
sudo systemctl restart headscale
# 检查端口监听(8080控制平面,3478 STUN,9090监控)
sudo ss -tulnp | grep headscale
复制成功

有可能会遇到重启服务出错,主要原因可能就是配置文件和密钥文件权限的问题,所以要核查好文件权限问题。

代码块
PlainText
自动换行
复制代码
# 1. 查看当前权限(确认问题)ls -la /var/lib/headscale/# 2. 修复目录所有权(假设服务以 headscale 用户运行)sudo chown -R headscale:headscale /var/lib/headscale/# 3. 确保权限正确sudo chmod 750 /var/lib/headscale/# 4. 重启服务sudo systemctl restart headscale# 5. 查看状态确认正常sudo systemctl status headscale
复制成功

初始化用户与预授权密钥:

代码块
Shell
自动换行
复制代码
# 创建用户(命名空间)
sudo headscale users create admin
# 查看用户信息
sudo headscale users list
# 生成预授权密钥(供客户端自动注册,无需网页认证)
sudo headscale preauthkeys create --user 用户ID --reusable --expiration 24h
# 查看已注册节点
sudo headscale nodes list
复制成功

4.2 在客户端进行配置

首先,先清除之前使用官方控制服务器的相关配置,可查找相关方法。

我是直接卸载并重新安装了tailscale。

代码块
Shell
自动换行
复制代码
# 1. 停止服务
sudo systemctl stop tailscaled
sudo systemctl disable tailscaled# 2. 卸载软件包sudo apt remove tailscale# 或彻底删除(包括配置文件)sudo apt purge tailscale# 3. 删除残留数据和配置(可选)sudo rm -rf /var/lib/tailscalesudo rm -rf /var/run/tailscalesudo rm -f /etc/apt/sources.list.d/tailscale.listsudo rm -f /etc/apt/trusted.gpg.d/tailscale-archive-keyring.gpg# 4. 删除网络接口(如果还存在)sudo ip link delete tailscale0# 5. 重新安装 sudo curl -fsSL https://tailscale.com/install.sh | sh
复制成功

在自建的headscale服务器上,重新登录tailscale,执行以下命令。

代码块
Shell
自动换行
复制代码
sudo tailscale up --login-server=http://10.1.6.182:8080 --auth-key=预授权密钥 --accept-routes --reset# 查看运行状态sudo tailscale status
复制成功

在第二台主机上重复上述命令,

这样就实现了本地自建控制服务器实现点对点安全可靠的通讯了。 如果提示如下图,请重新启动客户商tailscale服务。

下面进行验证通讯,至此全部安装完成。