VirtuaMesh 文档

基于 WireGuard 协议的零信任身份网络连接平台,替代传统 VPN,安全连接远程团队、多云环境和 IoT 设备。

VirtuaMesh 是什么?它把"在世界各地、隔着 NAT 防火墙"的设备拉进一个虚拟局域网,让它们像在同一台路由器下一样互相访问,全程 WireGuard 端到端加密。

能解决什么问题?① 远程访问家里 NAS / 监控 / 智能家居;② 跨地区分公司组建内网;③ 远程办公访问公司内网系统;④ IoT 设备跨网段打通;⑤ 服务器之间构建安全隧道。

适合谁?从完全不懂网络的家庭用户,到需要 API、ACL、子网路由、Kubernetes 集成的资深开发者——本页面都做了对应章节。

📍 当前显示模式:全部内容

🌱 5 分钟新手教程

本教程适合:从未接触过 VPN / 服务器 / 命令行的同学。整个过程只需要用到浏览器,不需要敲命令。

学完你能做到
让你家里的电脑、公司的电脑、手机上的 App 全部在一个安全的"虚拟局域网"里,可以像在同一台路由器下一样互相访问。

它到底是什么?

想象一下:你的手机用的是 4G,家里电脑用的是电信宽带,公司电脑用的是公司网络。这三台设备本来是看不到彼此的,但通过 VirtuaMesh,它们会被"拉"到一个虚拟的内部网络里——你能从公司电脑直接访问家里的 NAS,可以从手机连回家里的智能摄像头。

整个过程不需要你懂公网 IP、端口映射、防火墙这些复杂概念,VirtuaMesh 会自动搞定一切。

你只需要准备什么?

  • 一台能联网的电脑(Windows / Mac / Linux 都可以),用来登录管理后台
  • 两台以上需要互相访问的设备(手机、电脑、NAS 都可以)
  • 一台能访问公网的服务器(云服务器或家里的 NAS),用来部署服务端和 DERP 中继——所有服务均自托管,不依赖任何公共中转

分 3 步搞定

第 1 步:登录管理后台(2 分钟)

用浏览器打开 https://你的服务器地址/manager/,用管理员账号登录。首次部署后默认管理员账号为 admin@virtuamesh.com,密码请查阅部署文档。

什么是"管理后台"?
它就是一个网页。你可以在这里"创建用户、邀请设备、查看谁在线",全部都是鼠标点击操作。

第 2 步:让每台设备加入网络(每台 1 分钟)

在管理后台点击「添加设备」,系统会生成一个 6 位邀请码。然后:

📱 手机 / 平板
  1. 应用商店搜索 VirtuaMesh 安装
  2. 打开 App,输入邀请码
  3. 允许添加 VPN 配置
  4. 等待管理员审批通过(新节点默认为"待批准"状态)
  5. 审批通过后,App 上会显示"已连接"
💻 电脑 (Win/Mac/Linux)
  1. 从管理后台下载客户端
  2. 双击安装(Windows / Mac)
  3. 启动后输入邀请码
  4. 等待管理员审批通过(客户端显示"正在连接...")
  5. 审批通过后,托盘图标变绿 = 连接成功
关于节点审批制
出于安全考虑,VirtuaMesh 默认开启节点准入审批:新设备用邀请码注册后状态为 Pending(待批准),此时还不能访问任何内网资源。需要管理员在 Web 管理后台的「节点管理」中手动批准(Approved)后,节点才能正式接入网络。管理员可随时禁用或移除节点,确保每台设备入网都可控。

第 3 步:测试连接

现在所有加入的设备已经在同一个虚拟网络里了。你可以:

  • 在管理后台查看所有在线设备,每个设备都有名字(如"我的手机"、"家里NAS")
  • 从电脑的"网络"里直接看到其他设备的共享文件夹
  • 用 SSH 工具连接 NAS:ssh admin@我的NAS.virtuamesh.com
  • 在浏览器用 http://我的NAS.virtuamesh.com:5000 访问 NAS 的 Web 界面
失败了怎么办?
99% 的问题都是这三个:
1. 设备没连上互联网 → 打开浏览器试试普通网站
2. 邀请码输错了 → 在管理后台重新生成一个
3. 防火墙阻止了 → 暂时关闭杀毒软件和系统防火墙再试
还不行?查看 常见问题 或运行 virtuamesh test-connection 测试连通性。

下一步学什么?

你已经完成基本组网!下面是进阶用法,按需学习:

📖 概念速查表(小白必读)

遇到不懂的术语?来这里查。每个概念都配了生活类比。

虚拟网格 Mesh Network
多台设备组成的"对等"网络,任意两台都可以直接通信,不依赖中央服务器。
就像微信群——群里任何一个人发消息,其他人都能直接收到,不需要经过"中心邮局"。
P2P 直连 Peer-to-Peer
两台设备之间直接建立的网络连接,速度快、延迟低。
两个朋友面对面说话——比打电话还快。
中继服务器 DERP Relay
当 P2P 直连不通时,自动改用中继服务器转发加密数据。速度稍慢但保证能通。
两个人隔着一堵墙说话听不清,让朋友站中间当"传话筒"。
虚拟 IP Virtual IP
每台设备在虚拟网络里的"内网地址",格式如 100.64.0.5。固定不变,不会因为换 WiFi 而变。
类似你家的固定电话号——不管你用座机还是手机,别人拨打这个号都能找到你。
节点 Node / Peer
加入 VirtuaMesh 网络的每台设备都叫一个"节点"。
班级里的"同学"——每个同学都是一个节点,同学之间可以互发消息。
控制平面 Control Plane
服务端的大脑,只负责"调度"——告诉节点其他节点在哪里、谁能访问谁。它看不到加密的数据内容。
酒店前台——知道每个房间号和住客,但不进你房间看东西。
数据平面 Data Plane
节点之间真正传输业务数据的通道,全程端到端加密。
客房之间的走廊——端到端加密,连前台都进不去。
MagicDNS Magic DNS
VirtuaMesh 自带的域名解析服务,让你可以用名字(如 my-nas)而不是 IP 访问设备。
手机通讯录——你只记"妈妈",系统自动拨打妈妈的电话。
NAT 穿透 NAT Traversal
自动处理家庭路由器的"端口限制",让两台在不同 WiFi 下的设备能直接通信。
两个房间隔着一道锁着的门,VirtuaMesh 自动找到钥匙开门——不用你手动配路由器。
出口节点 Exit Node
你让另一台设备代替你访问公网,让你的网络流量"看起来"从那台设备出去。
出国旅游时让当地朋友帮你买东西——东西从国外发出,避开国内限制。
子网路由 Subnet Router
让虚拟网络里的其他设备能访问这台设备所在本地网络(如办公室的打印机)。
让 VirtuaMesh 网络里所有人都能使用你办公室的那台老式打印机。
零信任 Zero Trust
默认不相信任何设备,每次访问都要验证身份和权限。
公司门禁——哪怕你是老员工,进每个门都要刷工卡,不因为"在群里"就放行。

🧩 架构原理解析

理解 VirtuaMesh 内部如何工作,对排查问题非常重要。

整体架构图

控制平面(Control Plane) API · MySQL · Redis · 管理后台 DERP 中继服务器 STUN + 中继 MagicDNS 自动域名注册 节点 A 家里电脑 节点 B 公司电脑 节点 C 手机 节点 D NAS 注册 / 心跳 / 配置 P2P 不通 走 DERP DNS 解析 控制通道(明文) P2P 数据(加密) DERP 中继(加密) MagicDNS(自动注册)

连接建立流程(5 步看懂)

  1. 节点注册

    节点启动后向控制平面注册,提交自己的公钥和验证信息。

  2. 获取对等列表

    控制平面返回该节点可以访问的所有对等节点信息(公钥、虚拟 IP、EndPoint)。

  3. NAT 穿透尝试

    节点两两配对,尝试通过 STUN 打洞建立 P2P 直连。80% 的家庭网络都能成功。

  4. P2P 建立或回退 DERP

    P2P 成功就直接通信,失败则自动通过 DERP 中继加密数据,连接依然可用。

  5. 持续保活

    节点通过 gRPC 长连接向控制平面发送心跳(服务端默认建议 30 秒一次,可在客户端 config.yaml 中调整),保持 NAT 映射不过期;超过 30 秒未收到心跳服务端会判定节点离线(HeartbeatTimeout)。

关键设计原则

原则含义带来的好处
端到端加密WireGuard ChaCha20,节点之间直接加解密服务端看不到业务数据,零知识
无中心数据通道数据流不经过控制平面控制平面成为瓶颈的可能性为 0
自动穿透STUN + 候选路径协商零配置,零端口转发
密钥永不持久化节点私钥只存在本机服务端被攻破也不影响通信安全

多传输协议支持

VirtuaMesh 支持多种传输协议,在 UDP 被限速或 NAT 穿透失败时自动降级,确保连接可靠性:

  • WireGuard UDP(默认) — 标准 WireGuard UDP 传输,延迟最低,优先使用
  • WireGuard over TCP — 在 UDP 被 QoS 限速或对称 NAT 场景下自动启用,通过 TCP 隧道传输 WireGuard 数据包
  • WebSocket Transport — 在严格防火墙/代理环境下(仅允许 HTTP(S) 出站)通过 WebSocket 隧道传输
  • KCP over UDP — 在丢包率较高的网络环境下提供可靠 UDP 传输
  • DERP 中继 — 兜底中继方案,支持自建 DERP 服务器提升中继带宽
  • TURN 中继 — 标准 TURN 中继支持

传输协议按优先级自动切换:UDP → TCP → WebSocket → DERP → TURN,无需手动配置。

数据压缩

传输层内置数据包压缩功能(Deflate 算法),在 TUN 层加密前自动压缩大于 256 字节的 IP 包,减少 30-70% 的实际带宽占用。压缩对用户透明,无需配置。

自建 DERP 服务器

用户可在配置文件中添加自建 DERP 服务器,优先于官方 DERP 服务器使用,解决官方 DERP 带宽不足的问题:

"natTraversal": {
    "customDerpServers": [
        {
            "host": "derp.example.com",
            "port": 443,
            "verifyTls": true,
            "regionName": "华东自建",
            "enabled": true,
            "stunPort": 3478
        }
    ]
}

🏠 完整实战:远程访问家里 NAS

场景:你出差住酒店,想访问家里 NAS 上的照片和文件。家里 NAS 是群晖/威联通,电脑在公司或酒店 WiFi 下。

需要准备

  • 一台 24 小时开机的设备作服务端(家里 NAS 本身、树莓派、或者一台旧电脑都行)
  • NAS 上要用的服务(如 Synology Photos、Jellyfin、SMB 文件共享)

分步操作

🖥️ 第一阶段:服务端部署(10 分钟)
1
登录到家里 NAS,打开 SSH(群晖:控制面板 → 终端机和 SNMP → 启用 SSH)
2
SSH 连接到 NAS,使用 Docker Compose 一键部署服务端:
# 下载 docker-compose.prod.yml 和配置
mkdir -p ~/virtuamesh && cd ~/virtuamesh
# 参考 服务端部署 章节获取配置文件
docker compose -f docker-compose.prod.yml up -d
3
按提示设置管理员账号密码,等待 2-3 分钟安装完成。记下控制台输出的「管理后台地址」,一般是 https://你的域名http://NAS的内网IP:58080
📱 第二阶段:加入网络(5 分钟)
4
用浏览器打开管理后台,登录管理员账号
5
点击「节点列表」→「添加节点」→ 名字填 home-nas → 复制生成的邀请码
6
在 NAS 的终端里运行:
virtuamesh register --server https://你的域名 --network-code 你的邀请码
7
回到管理后台,「节点列表」里 home-nas 状态变为「在线」✓
💼 第三阶段:让出差设备加入(3 分钟 × 每台)
8
在管理后台为每台出差设备(如「公司电脑」「手机」)各生成一个邀请码
9
在公司电脑上:
virtuamesh register --server https://你的公网域名 --network-code 邀请码
(注意:外网客户端需要用 NAS 的公网地址或域名)
10
手机上:App Store 装 VirtuaMesh,输入邀请码加入
🎉 第四阶段:享受成果
11
现在你在酒店打开电脑,可以:
• 浏览器访问 http://home-nas.virtuamesh.com:5000 打开群晖 Web
• 资源管理器地址栏输入 \\home-nas.virtuamesh.com 看到共享文件夹
• 用 SMB 协议直接拷贝文件,速度取决于你的上传带宽
12
手机端:
• 群晖 Photos / DS File 客户端里"添加 NAS",服务器地址填 home-nas.virtuamesh.com
• 4G / WiFi 都能访问,秒变内网体验
速度优化小技巧
速度取决于你家里的上传带宽。电信/联通宽带通常 30-50 Mbps 上传,看照片够用,看电影要 ≥ 80 Mbps。可以开启 P2P 模式让家里的 NAS 直接和服务端建立长连接,避免每次新建连接的开销。详见 性能调优 章节。

⚡ 5 分钟开发者通道

你已经熟悉 Docker、Linux、命令行了?下面是 5 分钟快速通道,全部用 CLI 完成。

Step 1: 一键部署服务端

# 获取部署脚本和配置(参考服务端部署章节)
mkdir -p ~/virtuamesh && cd ~/virtuamesh
# 编辑 .env 填入域名和密钥
docker compose -f docker-compose.prod.yml up -d

Step 2: 安装客户端

# macOS
curl -fsSL https://control.virtuamesh.com/install/macos.sh | sh

# Linux
curl -fsSL https://control.virtuamesh.com/install/linux.sh | sh

# Windows (PowerShell)
iwr -useb https://control.virtuamesh.com/install/windows.ps1 | iex

Step 3: 加入网络

virtuamesh init
virtuamesh register --server https://your-server.com --network-code <邀请码>
virtuamesh up
virtuamesh status
virtuamesh test-connection --target-ip <peer-virtual-ip>

Step 4: 用 MagicDNS 访问

curl http://api-service.virtuamesh.com/health
ssh deploy@build-runner.virtuamesh.com

Step 5: 高级配置(可选)

# 启用子网路由(把办公室网络暴露给虚拟网络)
virtuamesh subnet advertise 192.168.1.0/24

# 启用出口节点(让所有流量走这个节点出去)
virtuamesh exit-node enable
CI/CD 集成
在 GitHub Actions / GitLab CI 中使用 virtuamesh 客户端作为构建节点,让构建机直接访问内网服务。具体步骤:用 virtuamesh register 配合服务账号 token 注册,详见 快速参考 章节的 register 命令。

🔌 API 参考

VirtuaMesh 控制平面提供完整的 RESTful API。所有 API 使用 JWT Bearer Token 鉴权,base URL 为 https://your-server.com/api/v1

鉴权

curl -H "Authorization: Bearer <JWT_TOKEN>" https://your-server.com/api/v1/nodes

获取 JWT 的方式:

# 1. 用账号密码登录获取短期 access_token + 长期 refresh_token
curl -X POST https://your-server.com/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com","password":"your-password"}'

# 2. 用 refresh_token 换新的 access_token
curl -X POST https://your-server.com/api/v1/auth/refresh \
  -H "Content-Type: application/json" \
  -d '{"refresh_token":"..."}'

节点管理

GET /api/v1/nodes 获取所有节点
GET /api/v1/nodes/:id 获取节点详情
POST /api/v1/nodes 注册新节点(需 admin 权限)
DELETE /api/v1/nodes/:id 注销节点
PATCH /api/v1/nodes/:id 更新节点元数据(标签、ACL 等)

用户与权限

GET /api/v1/users 用户列表(admin)
POST /api/v1/users 创建用户(admin)
GET /api/v1/traffic-rules ACL/流量规则列表
POST /api/v1/traffic-rules 创建 ACL/流量规则

DNS 管理

GET /api/v1/dns/networks/{networkId}/records 列出指定网络下的 DNS 记录
POST /api/v1/dns/{networkId}/nodes/{nodeId}/register 为节点注册 DNS 主机名
DELETE /api/v1/dns/{networkId}/nodes/{nodeId} 注销节点的 DNS 记录

请求与响应示例

POST /api/v1/nodes
Content-Type: application/json
Authorization: Bearer eyJhbGc...

{
  "name": "build-runner-1",
  "tags": ["ci", "linux"],
  "acl_groups": ["developers", "ci-agents"]
}

# 201 Created
{
  "id": "node_a1b2c3d4",
  "name": "build-runner-1",
  "hostname": "build-runner-1",
  "virtual_ip": "100.64.0.42",
  "auth_key": "tskey-auth-k7PqLm3vR9wX2zE8nF4hJ6tY1uA0oI5sD3cVbN9xMqW",
  "created_at": "2026-06-07T08:23:11Z",
  "tags": ["ci", "linux"],
  "acl_groups": ["developers", "ci-agents"]
}
速率限制
API 默认 1000 请求/分钟(按客户端 IP 聚合),足够覆盖正常的心跳与轮询节奏;鉴权端点(登录/注册/刷新/忘记密码)收紧至 10 次/分钟以防爆破。429 响应会包含 Retry-AfterX-RateLimit-Remaining 头。可通过 RateLimiting:ClientLimitPerMinute 配置覆盖。

DERP WebSocket 双向通道

客户端与 DERP 中继服务器之间的双向 WebSocket 通道(用于 NAT 穿透失败时中继 WireGuard 数据包),由 WireGuard over WebSocket 协议承载,业务层无 JSON 事件订阅:

// 客户端通过 WireGuard over WebSocket 连接到 DERP 中继
// (实际由客户端 virtuamesh 进程内部处理,业务代码不需要直接调用)
const ws = new WebSocket('wss://your-server.com/derp');

🚀 性能调优

VirtuaMesh 默认配置已经能应对大部分场景,但如果你追求极致性能或遇到带宽问题,可以参考以下调优项。

1. MTU 调优

默认 MTU 1420 适合大多数网络。如果你的网络路径中没有 PPPoE/VPN 嵌套,可以提到 1500 提升吞吐:

network:
  mtu: 1500  # 仅当链路无嵌套 VPN 时

如果你经过多级 NAT 或复杂网络,反而应降到 1280:

network:
  mtu: 1280  # 极端网络环境

2. 启用内核模式

Linux 下用内核模式可获得 2-5 倍吞吐提升:

sudo apt install wireguard-tools
# 配置文件
network:
  wireguard_mode: "kernel"

3. 部署多区域 DERP

节点与 DERP 之间的延迟应控制在 50ms 以内。全球分布式团队建议在每个大区各部署一个 DERP:

# derp-asia.yaml
{
  "DerpServer": {
    "Enabled": true,
    "Port": 443,
    "Hostname": "derp-asia.your-domain.com",
    "Region": "ap-east"
  }
}

# derp-eu.yaml
{
  "DerpServer": {
    "Enabled": true,
    "Port": 443,
    "Hostname": "derp-eu.your-domain.com",
    "Region": "eu-west"
  }
}

然后在客户端配置中列出所有 DERP 域名,VirtuaMesh 会自动选最近的:

derp:
  servers:
    - url: "https://derp-asia.your-domain.com"
      region: "ap-east"
    - url: "https://derp-eu.your-domain.com"
      region: "eu-west"
    - url: "https://derp-na.your-domain.com"
      region: "us-east"

4. 持久连接保活

让节点之间维持长连接,避免每次请求都重新打洞:

network:
  keepalive: 25  # 每 25 秒发送一次保活包(秒)

保活间隔越短,连接建立越快但流量越大。家庭网络 25s,企业 NAT 后 15s 较合适。

5. 启用多核处理

服务端默认使用单核处理加密。CPU 较多的服务器可以开多核:

# docker-compose.prod.yml
services:
  api:
    environment:
      - ASPNETCORE_THREADPOOL_MINTHREADS=Environment.ProcessorCount
      - ASPNETCORE_THREADPOOL_MAXTHREADS=512

性能监控

查看实时性能数据:

# 节点性能
virtuamesh status --verbose

# 流量统计
virtuamesh traffic
virtuamesh top

# DERP 中继负载
curl -H "Authorization: Bearer $ADMIN_TOKEN" \
  https://your-server.com/api/v1/derp-servers/healthy
性能基准参考
典型场景参考值:
  • 2 节点 P2P 同城:800-950 Mbps(受限于 WireGuard 加密性能)
  • 跨省 P2P:200-500 Mbps
  • 跨海中继 DERP:80-150 Mbps(取决于 DERP 出口带宽)
  • CPU 单核可处理 ~1 Gbps 加解密(AES-NI 加速下)

🔐 安全最佳实践

所有人都该做的 5 件事

  1. 启用强密码 / 2FA

    管理后台的账号必须开启二次验证。设置路径:账号设置 → 安全 → 启用 TOTP 2FA。

  2. 用子账号而不要共享账号

    每个家庭成员或团队成员各一个账号,出问题时可以单独撤销权限。

  3. 定期轮换 Auth Key

    在管理后台 → 节点管理中重新生成邀请码,再用 virtuamesh register --force 重新注册节点即可轮换凭证。

  4. 开启审计日志

    审计日志默认启用,可在管理后台 → 审计日志中查看。

  5. 限制管理后台的 IP 访问

    用 Nginx 反代只允许公司 IP 段访问 /manager/ 路径:

    location /manager/ {
      allow 203.0.113.0/24;   # 公司 IP 段
      deny all;
    }

ACL:精细化访问控制

ACL(Access Control List)决定节点之间谁能访问谁,能访问哪些端口。

基本语法

acls:
  - action: accept
    src:
      - "group:developers"
    dst:
      - "group:production:*"
    ports:
      - "443"
      - "22"

  - action: deny
    src:
      - "group:guests"
    dst:
      - "group:production"

常用规则示例

👥 用户组管理
把节点按"开发/测试/生产"分组,跨组访问需要授权
🚪 端口白名单
只开放 80/443 给访客,22 仅限运维
⏰ 时间窗口
仅工作日 9-18 点允许开发访问生产
📍 设备指纹
限制只有"公司登记的 Mac 地址"才能访问核心节点

查看与校验 ACL 规则

# 列出所有规则(含命中统计)
virtuamesh acl list

# 查看单条规则详情
virtuamesh acl show <rule-id>

高级安全主题

密钥轮换策略

# 自动轮换:服务端配置
key_rotation:
  enabled: true
  interval: 7d           # 每 7 天轮换
  grace_period: 24h      # 旧密钥宽限期
  notify_before: 1h      # 提前 1 小时通知

WireGuard 加密算法选择

默认 ChaCha20-Poly1305 已足够安全。如有硬件加速可选 AES-256-GCM:

network:
  crypto:
    algorithm: "chacha20-poly1305"  # 或 "aes-256-gcm"(需 AES-NI 支持)

审计日志格式

# 默认 JSON 行格式,可对接 ELK / Loki
{
  "timestamp": "2026-06-07T10:23:45Z",
  "event": "node.online",
  "node_id": "node_a1b2c3",
  "src_ip": "100.64.0.42",
  "user_agent": "virtuamesh/1.2.3"
}

合规与数据驻留

企业版支持:

  • 指定 DERP 区域(数据不出境)
  • 私有化部署服务端
  • SOC 2 / ISO 27001 审计日志
  • SSO 集成(SAML / OIDC)

🚀 命令速查表(Quickref)

一页速查,按需 Ctrl+F 搜索。

客户端生命周期

virtuamesh init                                # 初始化本地配置
virtuamesh register --server <url> --network-code <code>  # 加入网络
virtuamesh up                                  # 启动连接
virtuamesh down                                # 断开
virtuamesh status                              # 查看状态
virtuamesh service install                     # 安装系统服务(开机自启)
virtuamesh service start                       # 启动后台服务
virtuamesh service stop                        # 停止后台服务
virtuamesh service restart                     # 重启服务

诊断排错

virtuamesh status --verbose                    # 详细状态
virtuamesh test-connection --target-ip <ip>    # 测试连通
virtuamesh test-connection --all               # 测试所有对等节点
virtuamesh top                                 # 实时网络监控
virtuamesh logs follow                         # 实时日志
virtuamesh logs show --level debug             # 调试日志

网络与 ACL

virtuamesh peers                               # 所有对等节点
virtuamesh subnet advertise 192.168.1.0/24     # 暴露子网
virtuamesh subnet list                         # 列出子网
virtuamesh subnet unadvertise 192.168.1.0/24   # 取消暴露
virtuamesh exit-node enable                    # 启用出口节点
virtuamesh exit-node disable
virtuamesh acl list                            # 列出 ACL 规则
virtuamesh acl show <rule-id>                  # 查看规则详情

DNS

virtuamesh dns resolve <name>                 # 解析
virtuamesh dns resolve --verbose <name>       # 详细解析
virtuamesh dns stats                           # DNS 统计
virtuamesh dns cache clear                     # 清空缓存
virtuamesh dns register --hostname X --network-id <guid> --node-id <guid>
virtuamesh dns list --network-id <guid>
virtuamesh dns unregister --network-id <guid> --node-id <guid>

什么是 VirtuaMesh

VirtuaMesh 是一个基于 WireGuard 协议的零信任身份网络连接平台。它通过加密的点对点连接在设备之间建立安全的虚拟网格网络(mesh network),所有流量均使用 WireGuard 的 ChaCha20-Poly1305 加密,确保只有同一网络中的设备才能互相通信。

VirtuaMesh 创建的是对等网格网络,而非传统的中心化 VPN 架构。这意味着设备之间尽可能直接通信(P2P),避免了传统 VPN 中中心网关带来的延迟和单点故障问题。当 P2P 连接不可用时,DERP 中继服务器会自动接管,确保连接始终可用。

核心优势

端到端加密
WireGuard 协议加密,控制平面无法解密用户数据,零知识架构
零配置连接
自动穿透 NAT 和防火墙,无需端口转发或复杂网络配置
MagicDNS
自动域名解析、Split DNS 分域、DoH 加密、自定义记录,用名称连接一切
零信任访问
基于身份的访问控制,RBAC 权限管理,流量规则精细化控制
跨平台
支持 Windows、macOS、Linux 全平台,CLI 和图形界面
可观测性
实时流量监控、网络拓扑可视化、告警规则,全面掌握网络状态

与传统 VPN 的区别

特性传统 VPNVirtuaMesh
网络架构中心化网关分布式 P2P 网格
加密方式隧道加密(网关可解密)端到端加密(零知识)
连接方式所有流量经过中心设备直连 + DERP 备用
NAT 穿透需要端口转发自动穿透
单点故障网关宕机全网断无中心节点,高可用
访问控制基于网络层基于身份(零信任)

快速开始

只需简单几步,即可搭建 VirtuaMesh 虚拟网络。整个过程无需深厚的网络知识,几分钟即可完成。

  1. 部署控制平面

    使用 Docker Compose 一键启动服务端,包含 API 服务器、MySQL 数据库、Redis 缓存和 DERP 中继。

    cd /path/to/VirtuaMesh/Server
    docker-compose -f docker-compose.prod.yml up -d
  2. 安装客户端

    在需要加入网络的设备上安装 VirtuaMesh 客户端。

    # Windows
    iwr -useb https://control.virtuamesh.com/install/windows.ps1 | iex
    
    # macOS
    curl -fsSL https://control.virtuamesh.com/install/macos.sh | sh
    
    # Linux
    curl -fsSL https://control.virtuamesh.com/install/linux.sh | sh
  3. 注册节点

    将客户端注册到控制平面,获取节点凭证和虚拟 IP。

    virtuamesh register --server https://your-server.com --network-code <CODE>
  4. 启动连接

    启动 WireGuard 隧道,连接到虚拟网络。

    virtuamesh up
  5. 验证连接

    检查节点状态和连接情况。

    virtuamesh status
    virtuamesh test-connection --target-ip <peer-virtual-ip>

服务端部署

环境要求

项目最低要求推荐配置
操作系统Ubuntu 20.04+ / Debian 11+Ubuntu 22.04 LTS
CPU2 核心4 核心+
内存4 GB8 GB+
硬盘20 GB SSD50 GB+ SSD
Docker20.10+最新稳定版
Docker Compose2.0+最新稳定版

部署步骤

  1. 安装 Docker
    curl -fsSL https://get.docker.com | sh
    sudo usermod -aG docker $USER
  2. 配置环境变量

    复制 .env.example.env 并填写必要配置:

    MYSQL_ROOT_PASSWORD=your_strong_root_password
    MYSQL_PASSWORD=your_strong_mysql_password
    REDIS_PASSWORD=your_strong_redis_password
    JWT_KEY=YourSuperSecretKeyHereMakeItLongEnough32Chars!
    DOMAIN_NAME=your-domain.com
  3. 配置防火墙
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw allow 3478/udp
    sudo ufw enable
  4. 启动服务
    docker-compose -f docker-compose.prod.yml up -d
生产环境建议
建议使用 Nginx 反向代理并配置 SSL 证书,将 API 服务和 Web 管理界面统一通过 443 端口对外提供。参考项目中的 config/nginx/ 目录获取示例配置。

方式二:systemd + 自包含发布(无 Docker)

适用场景:希望直接以系统服务方式运行,规避容器化开销;或部署环境不支持 Docker。底层依赖 .NET 10 运行时 + SQLite,无需 MySQL/Redis(仍可选用外部 Redis 做分布式缓存):

  1. 准备 Linux 环境

    需要 .NET 10 SDK(仅构建时使用;发布产物为自包含可执行文件,运行时无需安装 .NET):

    # Ubuntu 22.04 安装 .NET 10 SDK
    wget https://dot.net/v1/dotnet-install.sh -O /tmp/dotnet-install.sh
    chmod +x /tmp/dotnet-install.sh
    sudo /tmp/dotnet-install.sh --channel 10.0 --install-dir /usr/share/dotnet
    sudo ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet
    dotnet --version   # 应输出 10.x.x
  2. 构建自包含 Linux 发布包
    git clone https://github.com/virtuamesh/virtuamesh.git
    cd virtuamesh/Server
    dotnet publish src/VirtuaMesh.Api -c Release \
      -r linux-x64 --self-contained true \
      -o ./publish/linux-x64
  3. 上传到服务器并解压
    REMOTE_DIR=/data/virtuamesh/server
    ssh user@server "sudo mkdir -p $REMOTE_DIR && sudo chown \$USER:\$USER $REMOTE_DIR"
    scp -r ./publish/linux-x64/* user@server:$REMOTE_DIR/
    ssh user@server "chmod +x $REMOTE_DIR/VirtuaMesh.Api"
  4. 生成密钥文件

    项目使用 /etc/virtuamesh/secrets.env 注入 JWT 与 DERP 注册密钥(避免硬编码在配置中)。运行项目自带的密钥生成脚本:

    sudo mkdir -p /etc/virtuamesh
    sudo bash scripts/rotate-secrets.sh    # 生成 VIRTUAMESH_JWT_KEY 等
    sudo chmod 600 /etc/virtuamesh/secrets.env
  5. 放置生产配置
    sudo cp scripts/appsettings.Production.example.json $REMOTE_DIR/appsettings.Production.json
    sudo vim $REMOTE_DIR/appsettings.Production.json   # 修改 Database/StunServer/P2P 等节点
  6. 初始化 SQLite 数据库

    单节点部署推荐使用 SQLite(零依赖、零运维)。如需 MySQL 集群可参考 docker-compose.prod.yml 切换连接串:

    scp scripts/database-init-sqlite.sql user@server:/tmp/
    ssh user@server "cd $REMOTE_DIR && sqlite3 virtuamesh.db < /tmp/database-init-sqlite.sql"
  7. 安装 systemd 单元
    sudo cp scripts/virtuamesh-api.service /etc/systemd/system/
    sudo systemctl daemon-reload
    sudo systemctl enable virtuamesh-api
    sudo systemctl start virtuamesh-api
    sudo systemctl status virtuamesh-api     # 应显示 active (running)
  8. 配置防火墙与日志轮转
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw allow 53478/udp    # STUN(与 Docker 部署不同:默认端口 53478)
    # journald 默认保留日志;如需长期归档可参考 scripts/ 下 logrotate 配置
两种部署方式对比
维度Docker 部署systemd 部署
启动速度中等(镜像拉取 + 容器编排)快(直接进程)
资源占用多一层容器抽象(~100MB 内存)最小化
升级/回滚镜像 tag 切换即可需手动替换文件 + 重启服务
默认端口443 / 347858443(HTTPS) / 53478(STUN)
数据库MySQL + Redis(容器)SQLite(本地文件,可选外部 Redis)
适合人群新手、追求"一键"体验运维老手、内网生产环境

方式三:Kubernetes 部署(生产级高可用)

适用场景:多副本高可用、跨节点故障转移、自动伸缩(HPA)。项目自带 Server/k8s/ 完整 YAML 清单(Kustomize 管理),包含 API / DERP / Redis / Ingress / HPA / NetworkPolicy 等:

  1. 前置条件
    • Kubernetes 1.24+ 集群(任意发行版:EKS / AKS / GKE / 自建)
    • kubectl + kustomize 已安装
    • 已配置 StorageClass(用于 Redis 持久化)
    • 已部署 Nginx Ingress Controller 或等价组件
  2. 推送镜像到镜像仓库
    # 构建并推送
    docker build -t registry.example.com/virtuamesh/api:1.0.0 -f src/VirtuaMesh.Api/Dockerfile .
    docker build -t registry.example.com/virtuamesh/derp:1.0.0 -f src/VirtuaMesh.DerpServer/Dockerfile .
    docker push registry.example.com/virtuamesh/api:1.0.0
    docker push registry.example.com/virtuamesh/derp:1.0.0
  3. 配置密钥与域名
    # 1) 编辑 secret.yaml,填入 VIRTUAMESH_JWT_KEY 等密钥(建议用 sealed-secrets 或 external-secrets)
    vim k8s/secret.yaml
    
    # 2) 编辑 ingress.yaml,把 host 改为你的域名
    vim k8s/ingress.yaml
    
    # 3) 如需修改镜像 tag,编辑 kustomization.yaml
    sed -i 's|latest|1.0.0|g' k8s/kustomization.yaml
  4. 一键部署
    kubectl apply -k k8s/
    
    # 验证
    kubectl -n virtuamesh get pods
    kubectl -n virtuamesh get svc
    kubectl -n virtuamesh get ingress
  5. 查看自动伸缩状态
    kubectl -n virtuamesh get hpa
    # NAME              REFERENCE                 TARGETS   MINPODS  MAXPODS  REPLICAS
    # virtuamesh-api    Deployment/virtuamesh-api  45%/70%   2        10       3
K8s 部署关键细节
  • 滚动升级零停机maxUnavailable: 0 + maxSurge: 1,配合 readinessProbe 实现平滑发布
  • NetworkPolicy:默认仅允许 Ingress Controller → API、API → Redis 流量;其余跨 Pod 通信全部 DROP(可按需放行)
  • HPA 策略:CPU 阈值 70%,最小 2 副本 / 最大 10 副本,生产环境建议先压测后调整
  • 多控制平面:如需跨集群容灾,启用 MULTI_REGISTRY_ENABLED=true 让本集群的 DERP 同时注册到主备两个控制平面

方式四:Windows MSI 安装包(图形化部署)

适用场景:Windows Server 用户、希望零配置安装(包含 EULA 协议 + VC++ 运行库 + Windows 服务自动注册)。项目使用 WiX 3.14 工具链构建:

  1. 下载 MSI

    从 GitHub Releases 或 https://control.virtuamesh.com/download/ 下载 virtuamesh-server-windows-x64.msi(自包含 .NET 10 运行时,~80MB)。

  2. 双击安装

    按向导填写:

    • 安装路径(默认 C:\Program Files\VirtuaMesh\Server
    • 数据目录(默认 C:\ProgramData\VirtuaMesh
    • HTTPS 证书(.pfx 路径 + 密码)
    • 监听端口(默认 58443)
  3. 服务自动启动

    MSI 会自动注册 Windows 服务 VirtuaMesh.Api,并配置 3 次失败后重启(sc failure 动作)。

    # 验证服务状态
    sc query VirtuaMesh.Api
    # 查看日志
    Get-EventLog -LogName Application -Source VirtuaMesh.Api -Newest 50

DERP 中继配置

DERP(Detoured Encrypted Relay Protocol)是 VirtuaMesh 的中继服务器协议。当两个节点之间无法建立 P2P 直连时(例如双方都在对称型 NAT 后面),DERP 服务器会作为中继转发加密流量,确保连接始终可用。

部署建议
建议在不同地理区域部署 DERP 服务器以降低延迟。每个区域的 DERP 服务器应同时提供 STUN 服务(UDP 3478)以辅助 NAT 穿透。

端口说明

端口协议用途
443TCPDERP 中继服务器(HTTPS)
3478UDPSTUN 服务器(NAT 穿透探测)

配置示例

{
  "DerpServer": {
    "Enabled": true,
    "Port": 443,
    "StunPort": 3478,
    "Hostname": "derp.your-region.com",
    "UseHttps": true,
    "MaxConnections": 1000,
    "Region": "ap-east"
  }
}

独立部署 DERP 中继(跨区域降低延迟)

DERP 中继是无状态服务(不需要数据库 / JWT / STUN 配置),可以独立部署到不同地理区域,通过 MultiRegistry 注册到主控制平面。项目自带 virtuamesh-derp.service systemd 单元 + virtuamesh-derp-deploy.sh 部署脚本:

  1. 构建并打包
    dotnet publish src/VirtuaMesh.DerpServer -c Release \
      -r linux-x64 --self-contained true \
      -o ./publish/derp-linux-x64
    cd ./publish/derp-linux-x64
    zip -r /tmp/VirtuaMesh-DerpServer-Linux.zip .
  2. 上传到目标区域的服务器
    scp /tmp/VirtuaMesh-DerpServer-Linux.zip user@derp-ap-east:/tmp/
    scp scripts/virtuamesh-derp.service user@derp-ap-east:/tmp/
    scp scripts/derp-appsettings.Production.json user@derp-ap-east:/tmp/
  3. 在目标服务器上执行部署
    mkdir -p /data/virtuamesh/derp
    cd /data/virtuamesh/derp
    unzip /tmp/VirtuaMesh-DerpServer-Linux.zip
    cp /tmp/derp-appsettings.Production.json ./appsettings.Production.json
    # 修改 ControlPlaneUrl 为你的主控制平面地址
    vim appsettings.Production.json
    chmod +x VirtuaMesh.DerpServer
    
    sudo cp /tmp/virtuamesh-derp.service /etc/systemd/system/
    sudo systemctl daemon-reload
    sudo systemctl enable --now virtuamesh-derp
    sudo systemctl status virtuamesh-derp
  4. 验证注册成功

    部署完成后 DERP 会自动调用主控制平面 POST /api/derp-servers 注册。在管理后台 → DERP 中继列表中应能看到新节点,状态为 Healthy

独立 DERP 与主 API 同机部署的差异

如果 DERP 与主 API 部署在同一台机器且共享证书目录,建议在 systemd 单元中加上 After=virtuamesh-api.service,避免 DERP 比主 API 先启动时找不到证书的 race condition。生产环境推荐分离部署(不同机器 / 不同可用区),故障域隔离更彻底。

客户端使用

命令必须严格按顺序执行:init → register → up

三个命令是严格的串行依赖关系,必须按以下顺序执行,颠倒或跳过任一步都会失败:

  1. init — 生成本地配置文件和 WireGuard 密钥对(必须先执行,未 init 直接 register 会因无配置文件报错)
  2. register — 用邀请码向控制平面注册节点,获取虚拟 IP 和加密隧道配置(必须 init 之后执行
  3. up — 启动 WireGuard 接口并建立连接(必须 register 之后执行,否则报错"控制平面服务器URL未配置"或"虚拟IP未找到")

常见错误场景:

$ virtuamesh register --server https://control.virtuamesh.com --network-code ABC123
错误: 配置文件不存在,请先运行 `virtuamesh init`

$ virtuamesh up
错误: 控制平面服务器URL未配置。请先运行注册命令。

重新初始化:用 init --force 清空旧配置;用 register --force 强制重新注册(轮换密钥时使用)。

安装客户端

平台安装命令
Windowsiwr -useb https://control.virtuamesh.com/install/windows.ps1 | iex
macOScurl -fsSL https://control.virtuamesh.com/install/macos.sh | sh
Linuxcurl -fsSL https://control.virtuamesh.com/install/linux.sh | sh

基本使用流程

  1. 初始化配置

    生成默认配置文件和 WireGuard 密钥对。

    virtuamesh init
  2. 注册到控制平面

    使用管理员提供的 Token 注册节点。

    virtuamesh register --server https://your-server.com --network-code <CODE>
  3. 启动网络连接

    建立 WireGuard 加密隧道并连接到虚拟网络。

    virtuamesh up
  4. 查看连接状态

    查看当前节点信息和对等节点列表。

    virtuamesh status
    virtuamesh peers
后台服务模式
使用 virtuamesh service install 可以安装系统服务实现开机自启,virtuamesh service start 启动后台服务,virtuamesh service stop 停止后台服务。

MagicDNS

MagicDNS 是 VirtuaMesh 内置的 DNS 服务,为虚拟网络中的每台设备自动分配易读的域名,让你无需记忆 IP 地址即可访问任意节点。它参考了 Tailscale MagicDNS 的核心设计,并在此基础上提供了自动域名注册、自定义记录(A/AAAA/CNAME/TXT)、反向解析等能力。

工作原理

当节点加入 VirtuaMesh 网络时,控制平面会自动为该节点注册一条 DNS 记录,将节点的主机名映射到其虚拟 IP 地址。客户端会在本地配置 DNS 搜索域(Search Domain),使得在虚拟网络内的设备可以直接使用短主机名互相访问。

# 完整域名格式
my-server.virtuamesh.com    → 100.64.0.3

# 短名称访问(同网络内)
my-server                   → 100.64.0.3

# 多级子域名
api.production.virtuamesh.com → 100.64.1.10
DNS 缓存
MagicDNS 在客户端本地缓存 DNS 记录,TTL 默认为 600 秒。节点下线或 IP 变更时,控制平面会推送更新通知,客户端自动刷新缓存,确保 DNS 解析始终准确。

启用与配置

MagicDNS 默认启用。你可以在客户端配置文件中控制其行为:

network:
  magic_dns:
    enabled: true
    suffix: "virtuamesh.com"
参数默认值说明
enabledtrue是否启用 MagicDNS
suffixvirtuamesh.comDNS 后缀,所有节点的域名都会以此结尾

自定义 DNS 记录

除了自动注册的节点记录外,你还可以添加自定义 DNS 记录,为内部服务映射专属域名。支持 A、AAAA、CNAME 和 TXT 记录类型。

# 通过 CLI 为节点注册主机名(节点需先加入网络)
virtuamesh dns register --hostname "grafana" --network-id <guid> --node-id <guid>

# 查看指定网络的所有 DNS 记录
virtuamesh dns list --network-id <guid>

# 注销节点的主机名
virtuamesh dns unregister --network-id <guid> --node-id <guid>
记录类型说明示例
AIPv4 地址映射grafana.internal → 100.64.0.5
AAAAIPv6 地址映射gateway.internal → fd7a:115c:a1e0::1
CNAME域名别名docs.internal → web-server.virtuamesh.com
TXT文本记录_service.internal → "version=2.1.0"

DNS 诊断命令

VirtuaMesh 提供了一组 DNS 诊断命令,帮助你排查 DNS 解析问题:

# 解析指定域名
virtuamesh dns resolve my-server

# 查看 DNS 统计信息
virtuamesh dns stats

# 清空本地 DNS 缓存
virtuamesh dns cache clear

常见使用场景

场景一:微服务内部通信

在微服务架构中,各服务通过 MagicDNS 域名互相访问,无需硬编码 IP 地址。服务迁移或扩容时,DNS 记录自动更新,无需修改配置。

# 服务间调用
curl http://api-gateway:8080/v1/users
curl http://redis-cache:6379
curl http://kafka-broker:9092

场景二:内部服务域名映射

对于 Grafana、Redis、Kafka 等内部服务,可通过 virtuamesh dns register 为节点注册主机名,映射稳定的内部域名,避免硬编码 IP。

# 为节点注册主机名(需指定所属网络 ID 和节点 ID)
virtuamesh dns register --hostname "grafana" --network-id <guid> --node-id <guid>
virtuamesh dns register --hostname "docs" --network-id <guid> --node-id <guid>

故障排查

DNS 解析失败

# 查看 DNS 统计信息
virtuamesh dns stats

# 清空 DNS 缓存
virtuamesh dns cache clear

# 查看详细解析过程
virtuamesh dns resolve --verbose my-server

短名称无法解析

如果短名称(如 my-server)无法解析,请检查:

  • MagicDNS 是否已启用:virtuamesh dns stats 查看统计
  • DNS 搜索域是否正确配置
  • 目标节点是否在线并已注册 DNS 记录

Split DNS 不生效

确认 Split DNS 配置中的域名后缀与实际查询的域名匹配。使用 virtuamesh dns check-availability --hostname <name> 命令可以检查主机名是否可注册。

🌐 出口节点(Exit Node)

出口节点可以让网络中某台设备的全部互联网流量,通过另一台指定的节点转发出去。就像给设备套了一层"安全代理",所有对外访问都从出口节点的网络发出。

典型用途:出差时用公司网络出口安全上网 / 跨境访问国内系统 / 绕过公共 Wi-Fi 监听 / 统一出口 IP 满足合规审计要求。

工作原理

当你在客户端启用出口节点后,设备的所有非局域网流量都会通过 WireGuard 隧道发送到出口节点,由出口节点代你访问互联网,再把结果原路返回。全程端到端加密,中间节点(包括 DERP 中继)无法解密流量内容。

使用前须知
  • 出口节点需要有稳定的互联网连接和足够的带宽
  • 启用出口节点会增加延迟(多出一跳转发),建议选择网络质量好的节点
  • 出口节点所在网络的所有出站流量规则都会作用到你身上(如防火墙、内容过滤)
  • 内核模式下出口节点功能有限制,建议使用用户态 WireGuard 模式

如何配置出口节点

  • 选择一台设备作为出口节点

    这台设备将承担转发流量的角色,建议选择网络稳定、带宽充足的设备(如办公室的台式机、云服务器、NAS)。

  • 在该设备上启用出口节点功能

    在客户端设置中开启"允许作为出口节点",或使用命令:

    virtuamesh exit-node enable
  • 在需要使用出口的设备上指定出口节点

    在客户端设置中选择要使用的出口节点,或使用命令:

    virtuamesh exit-node use <节点ID>
  • 验证是否生效

    访问 https://ifconfig.me 或类似网站,确认显示的 IP 地址是出口节点的 IP,而不是本地网络的 IP。

  • 常用命令

    virtuamesh exit-node enable     # 启用出口节点(允许本机作为出口)
    virtuamesh exit-node disable    # 禁用出口节点
    virtuamesh exit-node status     # 查看出口节点状态
    
    virtuamesh exit-node use server-01   # 使用指定出口节点
    virtuamesh exit-node off             # 不使用出口节点(直连)

    应用场景

    🏢 场景一:出差安全办公
    1
    在公司办公室的一台电脑上启用出口节点
    2
    出差员工在酒店公共 Wi-Fi 下连接 VirtuaMesh 并指定公司出口节点
    3
    所有上网流量都从公司出口发出,避免公共 Wi-Fi 监听和数据泄露
    🌏 场景二:跨境访问国内系统
    1
    在国内云服务器上部署 VirtuaMesh 客户端并启用出口节点
    2
    海外员工指定该节点为出口,访问国内受限的业务系统
    3
    访问速度和稳定性远优于普通代理,且全程加密

    与普通代理(VPN)的区别

    对比项传统 VPN 代理VirtuaMesh 出口节点
    部署方式需购买/租用 VPN 服务用自己的设备当出口,零成本
    数据主权流量经过第三方服务商全程在自己控制的节点之间转发
    同时组网只能上网,不能内网互通既能出口上网,也能访问内网设备
    加密强度取决于服务商WireGuard 端到端加密,自研可控
    切换出口需断开重连实时切换,不中断内网连接

    WireGuard 模式

    VirtuaMesh 支持两种 WireGuard 实现模式,可根据平台和性能需求灵活选择。

    模式配置值说明
    用户空间 userspace WireGuard.NET 跨平台用户空间实现(默认),无需额外依赖,兼容性最好
    内核 kernel Linux 内核模块模式(仅 Linux),需要安装 wireguard-tools,性能更优
    自动降级
    当选择 kernel 模式但系统不支持时,VirtuaMesh 会自动降级到 userspace 模式,确保服务正常运行。
    内核模式限制
    ExitNode 功能在内核模式下运行受限。用户空间数据包注入/拦截不可用,内核将原生处理数据包转发。

    配置示例

    network:
      interface_name: "virtuamesh0"
      virtual_ip: ""
      mtu: 1280
      wireguard_mode: "userspace"  # "userspace" 或 "kernel"

    安装内核模式依赖

    # Ubuntu/Debian
    sudo apt-get install wireguard-tools
    
    # CentOS/RHEL
    sudo yum install wireguard-tools

    CLI 命令参考

    节点管理

    命令说明示例
    init初始化本地配置virtuamesh init
    register注册到控制平面virtuamesh register --server <url> --network-code <CODE>

    网络连接

    命令说明示例
    up启动并连接到网络virtuamesh up
    down断开连接并停止virtuamesh down
    service install安装为系统服务(开机自启)virtuamesh service install
    service start启动后台服务virtuamesh service start
    service stop停止后台服务virtuamesh service stop
    service restart重启后台服务virtuamesh service restart

    状态查询

    命令说明示例
    status显示连接状态virtuamesh status
    peers显示对等节点列表virtuamesh peers
    nodes列出网络节点virtuamesh nodes
    top实时网络监控virtuamesh top
    traffic查看流量统计virtuamesh traffic

    网络诊断

    命令说明示例
    test-connection测试到对等节点的连通性virtuamesh test-connection --target-ip <ip>
    test-connection --all测试所有对等节点virtuamesh test-connection --all
    logs查看日志virtuamesh logs follow

    工具命令

    命令说明示例
    version显示版本virtuamesh version
    gen-key生成 WireGuard 私钥virtuamesh gen-key
    pub-key从私钥派生公钥virtuamesh pub-key --private-key <key>
    completion生成 shell 补全脚本virtuamesh completion
    interactive启动交互式 shellvirtuamesh interactive

    DNS 命令

    命令说明示例
    dns resolve解析域名virtuamesh dns resolve my-server
    dns stats查看 DNS 统计virtuamesh dns stats
    dns cache clear清空 DNS 缓存virtuamesh dns cache clear
    dns cache status查看 DNS 缓存状态virtuamesh dns cache status
    dns register为节点注册主机名virtuamesh dns register --hostname "app" --network-id <guid> --node-id <guid>
    dns unregister注销节点主机名virtuamesh dns unregister --network-id <guid> --node-id <guid>
    dns list列出网络的 DNS 记录virtuamesh dns list --network-id <guid>
    dns check-availability检查主机名是否可注册virtuamesh dns check-availability --hostname "app"
    dns search搜索 DNS 记录virtuamesh dns search <query>
    dns reverse反向解析virtuamesh dns reverse <ip>

    端口与协议

    服务端端口

    端口协议服务说明
    80TCPHTTPAPI 反向代理(重定向至 HTTPS)
    443TCPHTTPSAPI + gRPC + DERP + Web 管理界面
    3478UDPSTUNNAT 穿透探测
    3306TCPMySQL数据库(仅内部访问)
    6379TCPRedis缓存(仅内部访问)

    客户端端口

    端口协议说明
    51820UDPWireGuard 默认监听端口
    防火墙配置
    确保服务端的 443/TCP 和 3478/UDP 端口在防火墙中放行。客户端的 51820/UDP 端口不需要在防火墙中放行,VirtuaMesh 会自动处理 NAT 穿透。

    配置参考

    客户端配置文件使用 YAML 格式,默认路径为 ~/.virtuamesh/config.yaml

    version: "1.0"
    
    node:
      id: ""
      hostname: ""
    
    control:
      server_url: "https://control.virtuamesh.com"
      node_token: ""
    
    network:
      interface_name: "virtuamesh0"
      virtual_ip: ""
      mtu: 1420
      wireguard_mode: "userspace"
      magic_dns:
        enabled: true
        suffix: "virtuamesh.com"
    
      exit_node:
        enabled: false
      subnet_router:
        enabled: false
    
    derp:
      servers: []
    
    nat_traversal:
      stun_servers:
        - "stun.l.google.com:19302"
        - "stun.cloudflare.com:3478"
      turn_servers: []
    
    logging:
      level: info
      retained_days: 30
      max_file_size_mb: 10
      max_file_count: 7
      console_output: true

    ✅ 部署前检查清单

    在开始部署前,请逐项检查下面的内容。✓ 一项一项打勾能帮你避免 90% 的常见坑。

    🖥️ 服务端环境

    🔐 账号与密钥

    🌐 网络连通性

    💡 选择部署模式

    不同场景需要的部署方式不一样,对号入座:

    你的情况推荐部署说明
    个人 / 家庭使用,< 10 台设备 单机 Docker Compose 2 核 4GB 云服务器足够,月付 ¥30-50 即可
    小团队 / 工作室,10-50 台 单服务器 + 多区域 DERP 主控 + 1-2 个 DERP 中继(建议放香港/东京)
    公司 / 50 台以上 Kubernetes 集群部署 控制平面无状态可水平扩展,DERP 多区域
    有合规要求(数据不出境) 私有化部署 + 私有 DERP 全栈部署在内网,仅开必要出网端口
    没有公网 IP 怎么办?
    三大方案:① 用云服务器(最省心);② 用 IPv6(家用宽带默认给 IPv6 公网);③ 用 FRP / Tailscale Funnel 等内网穿透工具反代 443 端口到家里的电脑。

    ⚖️ 与同类产品对比

    选型时容易纠结,这里给出主流组网方案的横向对比,帮你 5 分钟决策。

    特性VirtuaMeshTailscaleZeroTierNebulaWireGuard 原生
    是否需要自建控制平面✅ 是(数据自主)❌ 用官方云⚠️ 可自建(planet/moon)✅ 是(lighthouse)✅ 自己手搓
    端到端加密✅ WireGuard✅ WireGuard✅ 自研协议✅ 自研协议✅ WireGuard
    NAT 穿透✅ 自动✅ 自动✅ 自动✅ 自动❌ 需手动端口转发
    中继回退✅ DERP 多区域✅ DERP✅ Planet✅ Lighthouse❌ 无
    MagicDNS(自动域名)✅ 自动注册 + 自定义记录✅ 含❌ 无❌ 无❌ 自行配置
    ACL 访问控制✅ 标签 + 端口 + 时间✅ ACL 规则⚠️ 基础规则⚠️ 基础❌ 无
    Web 管理后台✅ 完整 UI✅ 完整 UI⚠️ 第三方❌ 无❌ 无
    REST API✅ 完整✅ 完整⚠️ 部分❌ 无❌ 无
    开源协议Apache 2.0部分开源GPL v2MITGPL v2
    免费商用✅ 完全免费⚠️ 个人免费,企业收费✅ 免费✅ 免费✅ 免费
    学习成本⭐⭐ 低(5 分钟上手)⭐⭐ 低⭐⭐⭐ 中⭐⭐⭐⭐ 高⭐⭐⭐⭐⭐ 极高
    ✅ 选 VirtuaMesh 如果
    • 你希望数据自主可控,不要经过第三方云
    • 需要 Web 管理界面、ACL、API 完整工具链
    • 团队有混合云 / IoT 设备接入需求
    • 想避免 Tailscale 商业版的设备数限制
    ❌ 选别的如果
    • 纯个人 < 3 台设备、懒得运维:选 Tailscale
    • 只需要把两个局域网打通:选 ZeroTier / Nebula
    • 追求极致性能/嵌入式:直接用 WireGuard
    • 已有 OpenVPN 体系:先用 OpenVPN

    🩺 故障排查流程图

    遇到问题别慌,按下面的流程一步步排查。99% 的问题都能在前 3 步解决。

    一键诊断

    先跑这个命令,它会自动测试到所有对等节点的连通性:

    virtuamesh test-connection --all

    输出会显示到每个节点的延迟和丢包率,帮你快速定位问题节点。

    决策流程图

    开始排查 virtuamesh up 能启动吗? 检查 token / 配置文件 权限、网络、邀请码 status 显示 online 吗? 检查服务端 + 防火墙 443/3478 端口放行 ping <peer> 能通吗? 检查 ACL / MagicDNS 端口被 ACL 拦截? 网络已通! 应用层再排查

    常见症状速查

    症状90% 原因修复方法
    up 后状态为 offline 服务端 443 端口被防火墙挡 云服务商安全组 + 服务器 ufw 同时放行
    状态 online 但 ping 不通 ACL 规则没放行 virtuamesh acl list 查看规则
    短名 my-nas 无法解析 MagicDNS 未启用或缓存过期 virtuamesh dns cache clear 刷新缓存
    P2P 一直回退到 DERP 双方都在对称型 NAT 后 部署更近的 DERP 或使用 IPv6
    速度远低于预期 MTU 太小或经过多次中继 调整 MTU 到 1420;启用内核模式
    客户端反复重连 服务端时间不同步 sudo ntpdate time.google.com
    手机上能用,电脑上不行 电脑防火墙 / 杀毒软件 暂时关闭再试;放行 51820/UDP
    Windows 提示权限不足 没以管理员运行 右键 → 以管理员身份运行

    日志查看

    # 客户端实时日志
    virtuamesh logs follow
    
    # 客户端调试日志(更详细)
    virtuamesh logs show --level debug
    
    # 服务端日志(Docker 部署)
    docker logs -f virtuamesh-api
    docker logs -f virtuamesh-derp
    
    # 服务端日志(systemd 部署)
    journalctl -u virtuamesh-api.service -f
    
    # 按关键字过滤客户端日志
    virtuamesh logs show --level error
    还没解决?
    带上 virtuamesh status --verbosevirtuamesh test-connection --all 的完整输出,发邮件到 support@virtuamesh.com 提交问题,作者一般在 24 小时内回复。

    常见问题

    如何查看节点连接状态?

    virtuamesh status

    该命令会显示当前节点的虚拟 IP、连接状态、在线对等节点数量等信息。

    P2P 连接失败怎么办?

    VirtuaMesh 会自动回退到 DERP 中继服务器,确保连接始终可用。如果延迟较高,建议在更近的区域部署 DERP 服务器。使用 virtuamesh test-connection --all 可以测试到所有对等节点的连通性。

    如何查看日志?

    # 服务端日志(Docker 部署)
    docker-compose -f docker-compose.prod.yml logs -f api
    
    # 服务端日志(systemd 部署)
    journalctl -u virtuamesh-api.service -f
    
    # 服务端日志文件
    tail -f /data/virtuamesh/server/logs/virtuamesh-*.log
    
    # 客户端日志
    virtuamesh logs follow
    virtuamesh logs show --level error

    如何更新客户端?

    客户端内置自动更新功能,会在启动时检查服务端 /api/v1/updates/latest 接口并自动下载新版本。也可在管理后台 → 节点管理中触发指定节点的更新。

    Linux 内核模式需要什么依赖?

    使用 kernel WireGuard 模式需要安装 wireguard-tools

    # Ubuntu/Debian
    sudo apt-get install wireguard-tools
    
    # CentOS/RHEL
    sudo yum install wireguard-tools

    如何配置出口节点(Exit Node)?

    在客户端配置中启用 exit_node.enabled: true,然后将该节点指定为出口节点,其他节点的所有流量将通过该节点路由。注意:出口节点功能在内核模式下有限制。

    如何配置子网路由(Subnet Router)?

    在客户端配置中启用 subnet_router.enabled: true,可以将本地子网暴露给 VirtuaMesh 网络,让其他节点可以访问本地子网中的设备。

    MagicDNS 短名称无法解析怎么办?

    首先使用 virtuamesh dns stats 查看 DNS 统计信息,然后使用 virtuamesh dns resolve --verbose <name> 查看详细解析过程。常见原因包括:MagicDNS 未启用、目标节点不在线、DNS 缓存过期未刷新(使用 virtuamesh dns cache clear 清空缓存)。

    如何为内部服务配置自定义域名?

    使用 virtuamesh dns register 命令为节点注册主机名。例如:virtuamesh dns register --hostname "grafana" --network-id <guid> --node-id <guid>。注册后即可通过 grafana.virtuamesh.com 访问该节点。

    🎉 部署完成后,下一步该做什么?

    看到这一节说明你的网络已经跑起来了。下面是一份新手/开发者都能用的后续路线,按"从浅到深"排序,每一步都告诉你具体能解决什么问题。

    你已经完成最难的部分。后面这些不是必须的——按你用 VirtuaMesh 干什么,挑选需要的步骤就行。

    点击下方任意一个路线标题展开内容。打开/关闭状态会自动记忆,下次访问会保持你的选择。

    1

    纯家庭用户

    只想用、不想折腾

    🏠
    1. 给每个设备起个好记的名字:在管理后台 → 节点列表 → 编辑设备,把"my-macbook-pro"改成"我的电脑","Pixel-7"改成"老婆手机"。以后 ping 我的电脑 就能找到它。
    2. 开启 MagicDNS:在管理后台 → 网络设置中启用 MagicDNS,客户端就能用名字而不是 IP 访问了。
    3. 把 NAS 暴露给所有设备:在 NAS 上把 VirtuaMesh 客户端配成"子网路由"(参考 远程 NAS 实战),家里所有设备就能跨网络访问 NAS。
    4. 绑定一个固定域名(可选):在域名服务商处把 A 记录指向你的服务端公网 IP,就能从外网通过域名访问家里的服务。
    5. 定期查看管理后台:在仪表盘上能看到在线设备、最近流量、告警。如果出现异常登录/陌生节点,第一时间禁用并改密码
    2

    中小企业/团队

    要稳定、要安全

    🏢
    1. 配置 ACL 访问控制:默认同网络设备互通;通过 acls/rules 限制"财务电脑只能访问财务系统"、"前端服务器不能连数据库"等。参考 安全最佳实践
    2. 部署 DERP 中继:在内网/同区域再部署 1-2 个 DERP 节点(参考 DERP 配置),避免跨地区访问都走国外公网中继,延迟降低 50% 以上。
    3. 查看审计日志:审计日志默认启用,所有用户登录、节点加入、ACL 变更都会自动记录。在管理后台 → 审计日志中查看,方便合规审查。
    4. 配置自动备份:把 /data/virtuamesh/server/ 整个目录(含 SQLite 数据库和配置)每天备份到对象存储(S3 / OSS / COS)。灾难恢复时间从 24 小时降到 1 小时。
    5. 接入 SSO(可选):服务端支持 OIDC 对接企业微信、飞书、Azure AD、Okta,员工用公司账号一键登录,离职自动吊销权限
    3

    开发者/运维

    要自动化、要集成

    ⚙️
    1. 用 API 替代 Web 后台:所有管理操作(建节点、撤设备、改 ACL)都有 RESTful API,用脚本/程序批量管理比手点 1000 次后台快得多。
    2. 写一个客户端安装脚本:把 virtuamesh register --network-code xxx && virtuamesh up 包装进 Ansible/Shell 脚本,新机器开机 5 分钟自动加入网络。示例:
      #!/bin/bash
      curl -fsSL https://control.virtuamesh.com/install/linux.sh | sh
      virtuamesh register --server https://control.virtuamesh.com --network-code $1
      virtuamesh up --accept-routes
    3. 把 CI/CD 构建机接入网络:GitHub Actions runner / Jenkins agent 安装 VirtuaMesh 客户端,就能从流水线里访问内网测试服务器部署。配合 virtuamesh exit-node use 还能让流水线流量走公司出口。
    4. 用 Prometheus 监控:服务端暴露 /metrics 端点(参考 API 章节),把节点在线率、流量峰值、握手失败数接入 Grafana。设好告警阈值,服务异常 1 分钟内收到通知
    5. 使用 MagicDNS + Service Discovery:所有微服务都用 service-name.namespace 的 MagicDNS 域名访问,不用维护 hosts 文件,扩容/缩容 IP 变化也无需改配置。
    6. 启用 WireGuard 内核模式:在 Linux 服务器上把 wireguard.mode: kernel,吞吐从 500 Mbps 提升到 5 Gbps,CPU 占用降低 80%(参考 性能调优)。

    🛠 日常维护清单(建议每月做一次)

    🌍 想要更多?

    📖 完整 API 文档
    所有端点、参数、示例代码、错误码说明都在 API 参考 章节。
    🏗 架构原理
    想理解 NAT 穿透、密钥协商、DERP 中继背后的机制?看 实战章节 的流程图。
    🚀 性能调优
    MTU、缓冲区、连接池、内核模式……所有让网络跑得更快的开关都在 性能调优
    🩺 遇到问题
    99% 的常见问题都能在 故障排查FAQ 找到答案。
    💬
    没找到答案?欢迎在 GitHub Issues 提问(附上 virtuamesh status --json 输出和操作步骤),社区和官方团队会一起帮你看。