VirtuaMesh 文档
基于 WireGuard 协议的零信任身份网络连接平台,替代传统 VPN,安全连接远程团队、多云环境和 IoT 设备。
VirtuaMesh 是什么?它把"在世界各地、隔着 NAT 防火墙"的设备拉进一个虚拟局域网,让它们像在同一台路由器下一样互相访问,全程 WireGuard 端到端加密。
能解决什么问题?① 远程访问家里 NAS / 监控 / 智能家居;② 跨地区分公司组建内网;③ 远程办公访问公司内网系统;④ IoT 设备跨网段打通;⑤ 服务器之间构建安全隧道。
适合谁?从完全不懂网络的家庭用户,到需要 API、ACL、子网路由、Kubernetes 集成的资深开发者——本页面都做了对应章节。
🌱 5 分钟新手教程
本教程适合:从未接触过 VPN / 服务器 / 命令行的同学。整个过程只需要用到浏览器,不需要敲命令。
它到底是什么?
想象一下:你的手机用的是 4G,家里电脑用的是电信宽带,公司电脑用的是公司网络。这三台设备本来是看不到彼此的,但通过 VirtuaMesh,它们会被"拉"到一个虚拟的内部网络里——你能从公司电脑直接访问家里的 NAS,可以从手机连回家里的智能摄像头。
整个过程不需要你懂公网 IP、端口映射、防火墙这些复杂概念,VirtuaMesh 会自动搞定一切。
你只需要准备什么?
- 一台能联网的电脑(Windows / Mac / Linux 都可以),用来登录管理后台
- 两台以上需要互相访问的设备(手机、电脑、NAS 都可以)
- 一台能访问公网的服务器(云服务器或家里的 NAS),用来部署服务端和 DERP 中继——所有服务均自托管,不依赖任何公共中转
分 3 步搞定
第 1 步:登录管理后台(2 分钟)
用浏览器打开 https://你的服务器地址/manager/,用管理员账号登录。首次部署后默认管理员账号为 admin@virtuamesh.com,密码请查阅部署文档。
第 2 步:让每台设备加入网络(每台 1 分钟)
在管理后台点击「添加设备」,系统会生成一个 6 位邀请码。然后:
- 应用商店搜索
VirtuaMesh安装 - 打开 App,输入邀请码
- 允许添加 VPN 配置
- 等待管理员审批通过(新节点默认为"待批准"状态)
- 审批通过后,App 上会显示"已连接"
- 从管理后台下载客户端
- 双击安装(Windows / Mac)
- 启动后输入邀请码
- 等待管理员审批通过(客户端显示"正在连接...")
- 审批通过后,托盘图标变绿 = 连接成功
第 3 步:测试连接
现在所有加入的设备已经在同一个虚拟网络里了。你可以:
- 在管理后台查看所有在线设备,每个设备都有名字(如"我的手机"、"家里NAS")
- 从电脑的"网络"里直接看到其他设备的共享文件夹
- 用 SSH 工具连接 NAS:
ssh admin@我的NAS.virtuamesh.com - 在浏览器用
http://我的NAS.virtuamesh.com:5000访问 NAS 的 Web 界面
1. 设备没连上互联网 → 打开浏览器试试普通网站
2. 邀请码输错了 → 在管理后台重新生成一个
3. 防火墙阻止了 → 暂时关闭杀毒软件和系统防火墙再试
还不行?查看 常见问题 或运行
virtuamesh test-connection 测试连通性。
下一步学什么?
你已经完成基本组网!下面是进阶用法,按需学习:
📖 概念速查表(小白必读)
遇到不懂的术语?来这里查。每个概念都配了生活类比。
100.64.0.5。固定不变,不会因为换 WiFi 而变。my-nas)而不是 IP 访问设备。🧩 架构原理解析
理解 VirtuaMesh 内部如何工作,对排查问题非常重要。
整体架构图
连接建立流程(5 步看懂)
-
节点注册
节点启动后向控制平面注册,提交自己的公钥和验证信息。
-
获取对等列表
控制平面返回该节点可以访问的所有对等节点信息(公钥、虚拟 IP、EndPoint)。
-
NAT 穿透尝试
节点两两配对,尝试通过 STUN 打洞建立 P2P 直连。80% 的家庭网络都能成功。
-
P2P 建立或回退 DERP
P2P 成功就直接通信,失败则自动通过 DERP 中继加密数据,连接依然可用。
-
持续保活
节点通过 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 文件共享)
分步操作
# 下载 docker-compose.prod.yml 和配置
mkdir -p ~/virtuamesh && cd ~/virtuamesh
# 参考 服务端部署 章节获取配置文件
docker compose -f docker-compose.prod.yml up -dhttps://你的域名 或 http://NAS的内网IP:58080home-nas → 复制生成的邀请码virtuamesh register --server https://你的域名 --network-code 你的邀请码home-nas 状态变为「在线」✓virtuamesh register --server https://你的公网域名 --network-code 邀请码(注意:外网客户端需要用 NAS 的公网地址或域名)• 浏览器访问
http://home-nas.virtuamesh.com:5000 打开群晖 Web• 资源管理器地址栏输入
\\home-nas.virtuamesh.com 看到共享文件夹• 用 SMB 协议直接拷贝文件,速度取决于你的上传带宽
• 群晖 Photos / DS File 客户端里"添加 NAS",服务器地址填
home-nas.virtuamesh.com• 4G / WiFi 都能访问,秒变内网体验
⚡ 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
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":"..."}'
节点管理
用户与权限
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"]
}
Retry-After 与 X-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 件事
-
启用强密码 / 2FA
管理后台的账号必须开启二次验证。设置路径:账号设置 → 安全 → 启用 TOTP 2FA。
-
用子账号而不要共享账号
每个家庭成员或团队成员各一个账号,出问题时可以单独撤销权限。
-
定期轮换 Auth Key
在管理后台 → 节点管理中重新生成邀请码,再用
virtuamesh register --force重新注册节点即可轮换凭证。 -
开启审计日志
审计日志默认启用,可在管理后台 → 审计日志中查看。
-
限制管理后台的 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"
常用规则示例
查看与校验 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 中继服务器会自动接管,确保连接始终可用。
核心优势
与传统 VPN 的区别
| 特性 | 传统 VPN | VirtuaMesh |
|---|---|---|
| 网络架构 | 中心化网关 | 分布式 P2P 网格 |
| 加密方式 | 隧道加密(网关可解密) | 端到端加密(零知识) |
| 连接方式 | 所有流量经过中心 | 设备直连 + DERP 备用 |
| NAT 穿透 | 需要端口转发 | 自动穿透 |
| 单点故障 | 网关宕机全网断 | 无中心节点,高可用 |
| 访问控制 | 基于网络层 | 基于身份(零信任) |
快速开始
只需简单几步,即可搭建 VirtuaMesh 虚拟网络。整个过程无需深厚的网络知识,几分钟即可完成。
-
部署控制平面
使用 Docker Compose 一键启动服务端,包含 API 服务器、MySQL 数据库、Redis 缓存和 DERP 中继。
cd /path/to/VirtuaMesh/Server docker-compose -f docker-compose.prod.yml up -d -
安装客户端
在需要加入网络的设备上安装 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 -
注册节点
将客户端注册到控制平面,获取节点凭证和虚拟 IP。
virtuamesh register --server https://your-server.com --network-code <CODE> -
启动连接
启动 WireGuard 隧道,连接到虚拟网络。
virtuamesh up -
验证连接
检查节点状态和连接情况。
virtuamesh status virtuamesh test-connection --target-ip <peer-virtual-ip>
服务端部署
环境要求
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| 操作系统 | Ubuntu 20.04+ / Debian 11+ | Ubuntu 22.04 LTS |
| CPU | 2 核心 | 4 核心+ |
| 内存 | 4 GB | 8 GB+ |
| 硬盘 | 20 GB SSD | 50 GB+ SSD |
| Docker | 20.10+ | 最新稳定版 |
| Docker Compose | 2.0+ | 最新稳定版 |
部署步骤
-
安装 Docker
curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER -
配置环境变量
复制
.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 -
配置防火墙
sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 3478/udp sudo ufw enable -
启动服务
docker-compose -f docker-compose.prod.yml up -d
config/nginx/ 目录获取示例配置。
方式二:systemd + 自包含发布(无 Docker)
适用场景:希望直接以系统服务方式运行,规避容器化开销;或部署环境不支持 Docker。底层依赖 .NET 10 运行时 + SQLite,无需 MySQL/Redis(仍可选用外部 Redis 做分布式缓存):
-
准备 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 -
构建自包含 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 -
上传到服务器并解压
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" -
生成密钥文件
项目使用
/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 -
放置生产配置
sudo cp scripts/appsettings.Production.example.json $REMOTE_DIR/appsettings.Production.json sudo vim $REMOTE_DIR/appsettings.Production.json # 修改 Database/StunServer/P2P 等节点 -
初始化 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" -
安装 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) -
配置防火墙与日志轮转
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 / 3478 | 58443(HTTPS) / 53478(STUN) |
| 数据库 | MySQL + Redis(容器) | SQLite(本地文件,可选外部 Redis) |
| 适合人群 | 新手、追求"一键"体验 | 运维老手、内网生产环境 |
方式三:Kubernetes 部署(生产级高可用)
适用场景:多副本高可用、跨节点故障转移、自动伸缩(HPA)。项目自带 Server/k8s/ 完整 YAML 清单(Kustomize 管理),包含 API / DERP / Redis / Ingress / HPA / NetworkPolicy 等:
-
前置条件
- Kubernetes 1.24+ 集群(任意发行版:EKS / AKS / GKE / 自建)
- kubectl + kustomize 已安装
- 已配置 StorageClass(用于 Redis 持久化)
- 已部署 Nginx Ingress Controller 或等价组件
-
推送镜像到镜像仓库
# 构建并推送 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 -
配置密钥与域名
# 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 -
一键部署
kubectl apply -k k8s/ # 验证 kubectl -n virtuamesh get pods kubectl -n virtuamesh get svc kubectl -n virtuamesh get ingress -
查看自动伸缩状态
kubectl -n virtuamesh get hpa # NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS # virtuamesh-api Deployment/virtuamesh-api 45%/70% 2 10 3
- 滚动升级零停机:
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 工具链构建:
-
下载 MSI
从 GitHub Releases 或
https://control.virtuamesh.com/download/下载virtuamesh-server-windows-x64.msi(自包含 .NET 10 运行时,~80MB)。 -
双击安装
按向导填写:
- 安装路径(默认
C:\Program Files\VirtuaMesh\Server) - 数据目录(默认
C:\ProgramData\VirtuaMesh) - HTTPS 证书(.pfx 路径 + 密码)
- 监听端口(默认 58443)
- 安装路径(默认
-
服务自动启动
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 服务器会作为中继转发加密流量,确保连接始终可用。
端口说明
| 端口 | 协议 | 用途 |
|---|---|---|
| 443 | TCP | DERP 中继服务器(HTTPS) |
| 3478 | UDP | STUN 服务器(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 部署脚本:
-
构建并打包
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 . -
上传到目标区域的服务器
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/ -
在目标服务器上执行部署
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 -
验证注册成功
部署完成后 DERP 会自动调用主控制平面
POST /api/derp-servers注册。在管理后台 → DERP 中继列表中应能看到新节点,状态为Healthy。
如果 DERP 与主 API 部署在同一台机器且共享证书目录,建议在 systemd 单元中加上 After=virtuamesh-api.service,避免 DERP 比主 API 先启动时找不到证书的 race condition。生产环境推荐分离部署(不同机器 / 不同可用区),故障域隔离更彻底。
客户端使用
三个命令是严格的串行依赖关系,必须按以下顺序执行,颠倒或跳过任一步都会失败:
init— 生成本地配置文件和 WireGuard 密钥对(必须先执行,未 init 直接 register 会因无配置文件报错)register— 用邀请码向控制平面注册节点,获取虚拟 IP 和加密隧道配置(必须 init 之后执行)up— 启动 WireGuard 接口并建立连接(必须 register 之后执行,否则报错"控制平面服务器URL未配置"或"虚拟IP未找到")
常见错误场景:
$ virtuamesh register --server https://control.virtuamesh.com --network-code ABC123
错误: 配置文件不存在,请先运行 `virtuamesh init`
$ virtuamesh up
错误: 控制平面服务器URL未配置。请先运行注册命令。
重新初始化:用 init --force 清空旧配置;用 register --force 强制重新注册(轮换密钥时使用)。
安装客户端
| 平台 | 安装命令 |
|---|---|
| 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 |
基本使用流程
-
初始化配置
生成默认配置文件和 WireGuard 密钥对。
virtuamesh init -
注册到控制平面
使用管理员提供的 Token 注册节点。
virtuamesh register --server https://your-server.com --network-code <CODE> -
启动网络连接
建立 WireGuard 加密隧道并连接到虚拟网络。
virtuamesh up -
查看连接状态
查看当前节点信息和对等节点列表。
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
启用与配置
MagicDNS 默认启用。你可以在客户端配置文件中控制其行为:
network:
magic_dns:
enabled: true
suffix: "virtuamesh.com"
| 参数 | 默认值 | 说明 |
|---|---|---|
enabled | true | 是否启用 MagicDNS |
suffix | virtuamesh.com | DNS 后缀,所有节点的域名都会以此结尾 |
自定义 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>
| 记录类型 | 说明 | 示例 |
|---|---|---|
| A | IPv4 地址映射 | grafana.internal → 100.64.0.5 |
| AAAA | IPv6 地址映射 | 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 # 不使用出口节点(直连)
应用场景
与普通代理(VPN)的区别
| 对比项 | 传统 VPN 代理 | VirtuaMesh 出口节点 |
|---|---|---|
| 部署方式 | 需购买/租用 VPN 服务 | 用自己的设备当出口,零成本 |
| 数据主权 | 流量经过第三方服务商 | 全程在自己控制的节点之间转发 |
| 同时组网 | 只能上网,不能内网互通 | 既能出口上网,也能访问内网设备 |
| 加密强度 | 取决于服务商 | WireGuard 端到端加密,自研可控 |
| 切换出口 | 需断开重连 | 实时切换,不中断内网连接 |
WireGuard 模式
VirtuaMesh 支持两种 WireGuard 实现模式,可根据平台和性能需求灵活选择。
| 模式 | 配置值 | 说明 |
|---|---|---|
| 用户空间 | userspace |
WireGuard.NET 跨平台用户空间实现(默认),无需额外依赖,兼容性最好 |
| 内核 | kernel |
Linux 内核模块模式(仅 Linux),需要安装 wireguard-tools,性能更优 |
kernel 模式但系统不支持时,VirtuaMesh 会自动降级到 userspace 模式,确保服务正常运行。
配置示例
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 | 启动交互式 shell | virtuamesh 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> |
端口与协议
服务端端口
| 端口 | 协议 | 服务 | 说明 |
|---|---|---|---|
| 80 | TCP | HTTP | API 反向代理(重定向至 HTTPS) |
| 443 | TCP | HTTPS | API + gRPC + DERP + Web 管理界面 |
| 3478 | UDP | STUN | NAT 穿透探测 |
| 3306 | TCP | MySQL | 数据库(仅内部访问) |
| 6379 | TCP | Redis | 缓存(仅内部访问) |
客户端端口
| 端口 | 协议 | 说明 |
|---|---|---|
| 51820 | UDP | WireGuard 默认监听端口 |
配置参考
客户端配置文件使用 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 | 全栈部署在内网,仅开必要出网端口 |
⚖️ 与同类产品对比
选型时容易纠结,这里给出主流组网方案的横向对比,帮你 5 分钟决策。
| 特性 | VirtuaMesh | Tailscale | ZeroTier | Nebula | WireGuard 原生 |
|---|---|---|---|---|---|
| 是否需要自建控制平面 | ✅ 是(数据自主) | ❌ 用官方云 | ⚠️ 可自建(planet/moon) | ✅ 是(lighthouse) | ✅ 自己手搓 |
| 端到端加密 | ✅ WireGuard | ✅ WireGuard | ✅ 自研协议 | ✅ 自研协议 | ✅ WireGuard |
| NAT 穿透 | ✅ 自动 | ✅ 自动 | ✅ 自动 | ✅ 自动 | ❌ 需手动端口转发 |
| 中继回退 | ✅ DERP 多区域 | ✅ DERP | ✅ Planet | ✅ Lighthouse | ❌ 无 |
| MagicDNS(自动域名) | ✅ 自动注册 + 自定义记录 | ✅ 含 | ❌ 无 | ❌ 无 | ❌ 自行配置 |
| ACL 访问控制 | ✅ 标签 + 端口 + 时间 | ✅ ACL 规则 | ⚠️ 基础规则 | ⚠️ 基础 | ❌ 无 |
| Web 管理后台 | ✅ 完整 UI | ✅ 完整 UI | ⚠️ 第三方 | ❌ 无 | ❌ 无 |
| REST API | ✅ 完整 | ✅ 完整 | ⚠️ 部分 | ❌ 无 | ❌ 无 |
| 开源协议 | Apache 2.0 | 部分开源 | GPL v2 | MIT | GPL v2 |
| 免费商用 | ✅ 完全免费 | ⚠️ 个人免费,企业收费 | ✅ 免费 | ✅ 免费 | ✅ 免费 |
| 学习成本 | ⭐⭐ 低(5 分钟上手) | ⭐⭐ 低 | ⭐⭐⭐ 中 | ⭐⭐⭐⭐ 高 | ⭐⭐⭐⭐⭐ 极高 |
- 你希望数据自主可控,不要经过第三方云
- 需要 Web 管理界面、ACL、API 完整工具链
- 团队有混合云 / IoT 设备接入需求
- 想避免 Tailscale 商业版的设备数限制
- 纯个人 < 3 台设备、懒得运维:选 Tailscale
- 只需要把两个局域网打通:选 ZeroTier / Nebula
- 追求极致性能/嵌入式:直接用 WireGuard
- 已有 OpenVPN 体系:先用 OpenVPN
🩺 故障排查流程图
遇到问题别慌,按下面的流程一步步排查。99% 的问题都能在前 3 步解决。
一键诊断
先跑这个命令,它会自动测试到所有对等节点的连通性:
virtuamesh test-connection --all
输出会显示到每个节点的延迟和丢包率,帮你快速定位问题节点。
决策流程图
常见症状速查
| 症状 | 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 --verbose 和 virtuamesh 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 访问该节点。
🎉 部署完成后,下一步该做什么?
看到这一节说明你的网络已经跑起来了。下面是一份新手/开发者都能用的后续路线,按"从浅到深"排序,每一步都告诉你具体能解决什么问题。
点击下方任意一个路线标题展开内容。打开/关闭状态会自动记忆,下次访问会保持你的选择。
1
纯家庭用户
只想用、不想折腾
纯家庭用户
只想用、不想折腾
- 给每个设备起个好记的名字:在管理后台 → 节点列表 → 编辑设备,把"my-macbook-pro"改成"我的电脑","Pixel-7"改成"老婆手机"。以后
ping 我的电脑就能找到它。 - 开启 MagicDNS:在管理后台 → 网络设置中启用 MagicDNS,客户端就能用名字而不是 IP 访问了。
- 把 NAS 暴露给所有设备:在 NAS 上把 VirtuaMesh 客户端配成"子网路由"(参考 远程 NAS 实战),家里所有设备就能跨网络访问 NAS。
- 绑定一个固定域名(可选):在域名服务商处把 A 记录指向你的服务端公网 IP,就能从外网通过域名访问家里的服务。
- 定期查看管理后台:在仪表盘上能看到在线设备、最近流量、告警。如果出现异常登录/陌生节点,第一时间禁用并改密码。
2
中小企业/团队
要稳定、要安全
中小企业/团队
要稳定、要安全
- 配置 ACL 访问控制:默认同网络设备互通;通过
acls/rules限制"财务电脑只能访问财务系统"、"前端服务器不能连数据库"等。参考 安全最佳实践。 - 部署 DERP 中继:在内网/同区域再部署 1-2 个 DERP 节点(参考 DERP 配置),避免跨地区访问都走国外公网中继,延迟降低 50% 以上。
- 查看审计日志:审计日志默认启用,所有用户登录、节点加入、ACL 变更都会自动记录。在管理后台 → 审计日志中查看,方便合规审查。
- 配置自动备份:把
/data/virtuamesh/server/整个目录(含 SQLite 数据库和配置)每天备份到对象存储(S3 / OSS / COS)。灾难恢复时间从 24 小时降到 1 小时。 - 接入 SSO(可选):服务端支持 OIDC 对接企业微信、飞书、Azure AD、Okta,员工用公司账号一键登录,离职自动吊销权限。
3
开发者/运维
要自动化、要集成
开发者/运维
要自动化、要集成
- 用 API 替代 Web 后台:所有管理操作(建节点、撤设备、改 ACL)都有 RESTful API,用脚本/程序批量管理比手点 1000 次后台快得多。
- 写一个客户端安装脚本:把
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 - 把 CI/CD 构建机接入网络:GitHub Actions runner / Jenkins agent 安装 VirtuaMesh 客户端,就能从流水线里访问内网测试服务器部署。配合
virtuamesh exit-node use还能让流水线流量走公司出口。 - 用 Prometheus 监控:服务端暴露
/metrics端点(参考 API 章节),把节点在线率、流量峰值、握手失败数接入 Grafana。设好告警阈值,服务异常 1 分钟内收到通知。 - 使用 MagicDNS + Service Discovery:所有微服务都用
service-name.namespace的 MagicDNS 域名访问,不用维护 hosts 文件,扩容/缩容 IP 变化也无需改配置。 - 启用 WireGuard 内核模式:在 Linux 服务器上把
wireguard.mode: kernel,吞吐从 500 Mbps 提升到 5 Gbps,CPU 占用降低 80%(参考 性能调优)。
🛠 日常维护清单(建议每月做一次)
🌍 想要更多?
virtuamesh status --json 输出和操作步骤),社区和官方团队会一起帮你看。