Windows 客户端
验证得还很少
装在真的电脑上用过,在一台 Windows 11 上以管理员身份实测连通过(见实测),但还没在两台真的 Windows 电脑之间、 拿真的游戏试过,安装程序也没有代码签名。
桌面客户端是给玩家用的,不用开命令行:建网络、加入网络都在客户端里点。
它只有一个窗口,左边一块是"你":你的局域网地址(朋友在游戏里输的就是它)、你的名字、所在的网络、几个页面。 右边随状态变:
- 没加入时:两张卡片 —— "建一个网络"和"加入网络"(贴朋友发来的网络码);存着上次的网络的话,一键重新连接
- 连上之后:一张网状图 —— 你在中间,朋友围一圈,直连是实线(颜色是延迟好坏)、经中继的是虚线, 线上标着延迟;下面每个朋友一张卡片:名字、地址、信号格、延迟、最近五分钟的延迟曲线。 "朋友"页是同样的信息排成表,多了抖动、丢包、收发流量。点一个人就复制他的地址
- 你是网主时:多一个"管理"页,见网主:管理网络
- 出错时:按原因说人话。邀请码不对、网络被解散了、连不上服务器、缺
wintun.dll、没有管理员权限,提示各不相同
界面是液态玻璃,由 Glassium 画(用 GPU:WebGPU,没有时 WebGL2; 都没有时退成普通的磨砂效果,功能不受影响)。盖在正文上的弹窗用 Glassium 的 CSS 玻璃画(同一套材质,没有折射): GPU 玻璃画在页面最底下,盖不住上面的字。窗口的标题栏也是自己画的:拖它移动,"关闭"只是缩到托盘, 游戏里的连接不断;要彻底退出,右键托盘图标。
下载、安装
安装程序发在 GitHub Releases。每个版本附一个 SHA256SUMS.txt, 装之前核对一下安装程序没被换过:
Get-FileHash -Algorithm SHA256 .\Meshora-*-setup.exe算出来的值要和 SHA256SUMS.txt 里的一致。
- 安装程序和客户端是同一套液态玻璃界面,分几步:欢迎 → 选项 → 安装中 → 完成。运行时 Windows 会问 "是否允许此应用对你的设备进行更改",允许即可
- 安装位置默认是
C:\Program Files\Meshora,可以改。选一个文件夹,Meshora 装在它下面的Meshora里。 有个限制:选的文件夹和它上面每一层,都得是普通账户改不了的 —— 磁盘根目录(D:\)、Program Files都行, 自己新建的文件夹(比如D:\Games)多半不行,安装程序会说为什么(原因)。 装好的Meshora文件夹会被收紧成只有管理员能写。已经装过的,升级装回原处 - 装过旧版本的,直接运行新的安装程序就是升级:网络、名字、私钥都留着。1.0.0 是另一个安装程序装的, 新的会先把它静默卸掉再装
- 卸载在"设置 → 应用 → 已安装的应用"里,还是同一个界面。"同时删除我的私钥和设置"默认不勾: 私钥删了就是换了一个身份,再装回来,网主要重新放你进网络
- 要有 Microsoft Edge WebView2 运行时:Windows 11 自带,Windows 10 多半也有;没有时安装程序会弹窗给出下载地址
- 安装程序还没有代码签名,SmartScreen 可能提示"未知发布者"
客户端只有 Windows x64 和安卓的,没有免安装版,也不出 Linux 版。
第一次打开
客户端要管理员权限(建虚拟网卡),打开时 Windows 会问一次。第一次打开有个引导:
- 起个名字:朋友在网里看到的就是它,默认是计算机名,之后在设置里随时能改
- 选一条路:"建一个网络"(我来当网主)还是"加入朋友的网络"(朋友已经发给我一个网络码)。 选了哪条都能回头:建了网络也能去加入别人的
建一个网络
点"建一个网络",起个网络名,再选网络放在哪。网络需要一个大家都连得上的协调服务: 它介绍大家认识、打不通直连时转发加密后的报文,看不到游戏内容。
| 放在哪 | 适合 | 代价 |
|---|---|---|
| 官方服务器 | 最省事:朋友在哪都能连进来,你的电脑关了网络也在 | 服务器是别人的:能看到谁在哪个网络、什么时候在线(看不到内容),有限额 |
| 本机当主机 | 不想依赖任何服务器 | 路由器要支持 UPnP、你的宽带要有公网地址;这台电脑关了(客户端退出了),网络就停了 |
| 我的服务器 | 自己有一台云主机 | 要自己架,填一次服务器地址 |
官方服务器
官方服务器已经部署好(一台阿里云的服务器,39.108.210.40),建网、加入、经它的中继转发都实测通过。 建网络时默认选它。
建好之后,客户端直接连进这个网络,界面上有一张"邀请朋友"的卡片:把网络码复制下来发给朋友,他们贴进"加入网络"就行。 网络码长这样:服务器公钥@地址:端口/网络ID#邀请码。它是秘密:谁拿到都能加入,只发给要一起玩的人。
本机当主机
客户端在自己进程里跑一个协调服务和一个中继,再用 UPnP 让路由器开几个端口:TCP 7443(协调服务)、 UDP 7443(端点探测)、TCP 7444(中继)、UDP 41641(你自己的节点)。端口映射租期 24 小时,客户端退出时撤掉。 界面上会说朋友连不连得进来:
- 朋友连得进来:路由器开好了端口,问到了公网地址,网络码里写的就是它
- 运营商级 NAT,外面连不进来:路由器报上来的"公网地址"其实是私网地址或
100.64.0.0/10—— 你的宽带没有真的公网地址,端口开了也没用。改用官方服务器或你自己的服务器(可以打电话问运营商要公网 IP) - 只有局域网里的人进得来:路由器不支持 UPnP(或者关着),客户端不知道公网地址。 可以在路由器里手动转发上面四个端口,或者改用服务器
这个协调服务上只有你自己能建网络,别人知道了地址也只能凭网络码加入。私钥和网络的数据存在客户端的设置目录里, 下次打开、再当主机,网络码不变。
官方服务器的限额
官方服务器谁都能用来建网络,所以有限额(自己架的服务器可以调,见下):
- 一个人(一把私钥)最多建 3 个网络
- 一个网络最多 64 人
- 同一个公网 IP 一小时最多建 10 个网络(换私钥绕不过去)
- 30 天没有人上线的网络自动删掉
- 经服务器中继转发时,每个人限速 4 MB/s(直连不经过服务器,不受限)
网主:管理网络
谁建的网络谁就是网主。连上之后导航里多一个"管理"页:
- 成员:每个人的名字、地址、在不在线;可以把人移出。被移出的人马上断开,客户端上显示"你已被移出这个网络",不会自动重连
- 邀请:
- 长期有效的网络码:复制;换一个 —— 旧的立刻作废,已经在网里的人不受影响。 想让被移出的人回不来,移出之后再换一个
- 只想邀请一个人:生成一次性的(用一次就作废)或 24 小时的网络码;没用掉的可以作废
- 网络名:网里的人看到的名字,改了马上生效
- 解散:所有人立刻断开,网络码作废,网络从服务器上删掉。不能撤销
网主的身份就是建网络的那把私钥。重装客户端时没勾"删除私钥",就还是网主。
加入一个网络
- 把朋友给你的网络码贴进"加入网络",点加入。 末尾的邀请码让你直接加入,服务器自动给你分一个地址
- 连上以后,界面上最大的那串数字(比如
100.64.0.3)就是你在这个局域网里的地址。 游戏里选"局域网"联机:房间列表里应该能直接看到朋友开的房间;看不到的话,在"直接连接"里输对方的地址
客户端记得上次的网络,下次打开自动连(设置里可以关)。
网络码末尾没有 #邀请码 的话,这个网络只认名单:先把"你的 ID"(加入页和设置里都能复制)发给建网络的人,对方加进名单后再连。 ID 只代表这台电脑,不是密码,可以放心发。
只托管一个网络的服务器(meshora-coord --state)发的网络码没有 /网络ID(公钥@地址:端口#邀请码),照样能用。
自己架服务器
一般用不着:默认的官方服务器谁都能用来建网络。不想依赖它的话,可以本机当主机,或者自己架一台服务器 —— 服务端不发布(Release 里只有 Windows 和安卓客户端),要从源码编译:
cargo build --release -p meshora-coord -p meshorad服务器要有公网 IP,对外开放 TCP 7443、UDP 7443、TCP 7444。它有两种跑法:
- 托管很多网络(
--hub):和官方服务器一样,谁都能用客户端在上面建网络、自己当网主。 客户端里选"我的服务器"、填服务器地址。想让它顶替"官方服务器"那一项,把地址写进%LOCALAPPDATA%\io.github.kerxs.meshora\settings.json的"officialServer"(界面上还没有这个设置) - 只托管一个网络(
--state):你在服务器上管成员,网络码只有一个
托管很多网络
meshorad genkey coord.key
meshora-coord --key coord.key --listen 0.0.0.0:7443 \
--probe 0.0.0.0:7443 --probe-public <服务器公网 IP>:7443 \
--relay-listen 0.0.0.0:7444 --relay-public <服务器公网 IP>:7444 \
--hub ./networks启动日志里有服务器地址(公钥@地址:端口),填进客户端。每个网络是 networks 目录里的一个状态文件,重启不丢。 限额默认和官方服务器一样,可以调:--hub-networks-per-owner(一个人最多建几个网络)、--hub-members(一个网络最多多少人)、 --hub-relay-rate(中继给每个人的速率上限,KB/s)。中继只在同一个网络的成员之间转发。
官方服务器是用 scripts/deploy-hub.sh 装的(systemd 服务,数据在 /var/lib/meshora),也可以照着它装自己的。
只托管一个网络
生成服务器的私钥:
bashmeshorad genkey coord.key启动协调服务:
bashmeshora-coord --key coord.key --listen 0.0.0.0:7443 \ --probe 0.0.0.0:7443 --probe-public <服务器公网 IP>:7443 \ --relay-listen 0.0.0.0:7444 --relay-public <服务器公网 IP>:7444 \ --state coord.state--state是状态文件:第一次启动时在里面生成邀请码,之后凭邀请码加入的人和他们的地址也存在这里, 重启不变启动日志里有网络码,发给朋友们:
text网络码(发给要加入的朋友):gex5EB1h...X01U=@203.0.113.5:7443#3q2-7wEYkQ6n0Cf8Hs5VYA
朋友凭邀请码加入时,协调服务分给他们最小的空闲地址(100.64.0.1、.2、.3……),不用重启, 已经在线的人马上就能看到新成员。
这种方式没有网主:客户端里看不到"管理"页,成员在服务器上管。状态文件是纯文本,一行一项,可以直接改。 改完不用重启:协调服务每 2 秒看一眼,变了就照着办:
invite 3q2-7wEYkQ6n0Cf8Hs5VYA
invite Xk9pQ2mT7vB4nL8cW1yH5a uses=1 expires=2026-10-02T12:00:00Z
member mTe0q8vN3kRZp1u5yXcW7bLdF2gH9jK4sA6eQoIiUtY= 100.64.0.3一次性、限时的邀请码:
bashmeshora-coord invite --state coord.state --key coord.key --public <服务器公网 IP>:7443打出来的网络码只能用一次(
--uses 3改成三次),--hours 24让它一天后过期,两个可以一起用。 它写进状态文件,协调服务开着的话几秒内生效;用完、过期的自动从文件里清掉换邀请码:删掉不带限制的那一行
invite,协调服务会生成一个新的写回去(日志里有新的网络码); 也可以直接改成你想要的。旧的网络码随之失效,已经加入的人不受影响移出一个人:删掉他那一行
member。他马上被断开,不会自动重连。想让他回不来,同时换邀请码只想要固定名单:不给
--state,用--node <ID>一个个写上(可以写多次)。 这时网络码不带邀请码,朋友要先把 ID 发给你。两种可以同时用
文件改坏了(格式不对、地址撞车)不会生效,协调服务记一条警告,照旧按原来的成员表工作。人数上限 1024。
更新
客户端每次打开都查一次有没有新版本(设置里"自动检查更新"可以关;也可以手动点"检查更新")。 查到新版本会弹窗问要不要更新;点"以后再说",这次就不再问,左上角留着"可更新",想更新时点它。 点"更新":客户端下载新的安装程序,核对过签名才运行它, 安装程序关掉客户端、装好、再把它打开。连接会断开几秒,网络、名字、私钥都留着。
- 查的是 GitHub 上最新那个 Release 附的
latest.json。这个请求会让 GitHub 知道你的 IP,不带别的东西 - 安装包的签名是 Ed25519,签的是"平台、版本号、安装包的 SHA-256"。私钥只在发版的地方,公钥写在客户端里: 能改 Release 的人(或者路上改了下载内容的人)换不进别的安装包,也换不成一个旧版本
- 下载不了(比如连不上 GitHub)时设置里会说原因,不影响联机
设置
| 设置 | 默认 | 作用 |
|---|---|---|
| 你的名字 | 这台电脑的计算机名 | 网里别人看到的名字,改了马上生效。名字谁都能随便起,认人以地址为准 |
| 让游戏的广播走 Meshora | 开 | 把 Meshora 虚拟网卡的接口跃点数设为 1,见下文 |
| 打开时自动连接 | 开 | 启动时连上次的网络 |
| 把 Meshora 设为专用网络 | 关 | 把 Meshora 网卡所在的网络设成 Windows 的"专用网络",见Windows 防火墙 |
| 离开这个网络 | — | 断开,并忘掉网络码 |
| 日志 | — | 最近 500 行,可以复制下来给帮你排查的人。里面有 IP 地址,没有密钥 |
为什么要"让游戏的广播走 Meshora"
局域网游戏找房间,是往 255.255.255.255 或者组播地址喊一声。Windows 只把这种报文交给一张网卡 —— 接口跃点数最小的那张。Meshora 的虚拟网卡自动得到的跃点数是 5,本来就比一般的有线、无线网卡(25、30 左右)小; 麻烦在于加速器、VPN、代理软件装的虚拟网卡往往也是 5,这时候广播交给谁就说不准了, 游戏的广播可能根本到不了 Meshora,朋友的房间列表里就看不到你。
打开这个开关,客户端把虚拟网卡的跃点数设为 1,比系统自动给任何网卡的都小,游戏的广播就交给 Meshora 了。 虚拟网卡上没有默认路由,上网的流量不受影响。代价是:客户端连着网的时候,本机其他发往局域网广播地址的程序 (比如某些投屏、打印机发现)也会把广播交给 Meshora —— 找家里设备时如果发现找不到,可以先断开 Meshora。
在一台装着别的虚拟网卡(跃点数 5)的电脑上实测过:打开开关后,往 255.255.255.255、224.0.2.60、 网段广播地址发的 UDP 报文都进了 Meshora,转发给了网里的另一个节点。还没拿真的游戏在两台电脑之间验证过。
连不上时
| 看到的提示 | 原因和办法 |
|---|---|
| 邀请码不对 | 邀请码换过了。向建网络的人要一个最新的网络码 |
| 还没被加进这个网络 | 网络码里没有邀请码,你的 ID 也不在名单里。要一个带邀请码的网络码,或者把 ID 发给建网络的人 |
| 这个网络解散了 / 找不到这个网络 | 网主解散了网络,或者网络码抄错了。向建网络的人要一个新的网络码 |
| 你已被移出这个网络 | 网主把你移出了。不会自动重连 |
| 连不上协调服务 | 地址、端口不对,服务器没开,或者服务器的防火墙没放行 TCP 7443。网络在网主电脑上(本机当主机)的话,网主的客户端得开着 |
| 本机当主机 · 运营商级 NAT | 你的宽带没有公网地址,外面的朋友连不进来。改用服务器建网络,见本机当主机 |
| 缺少 wintun.dll | 它应该和 meshora.exe 在同一个文件夹。重新安装一次 |
| 需要管理员权限 | 建虚拟网卡需要。右键"以管理员身份运行" |
| 房间列表里看不到,直接输地址也连不上 | 多半是 Windows 防火墙,见下 |
ping 朋友的地址不通 | 不一定是没连上:Windows 防火墙默认挡别人 ping 进来(公用、专用网络都挡)。看客户端里对方是不是"在线"、有没有延迟数字 —— 有就是通的 |
Windows 防火墙
安装程序会加一条入站规则 Meshora:只放行 meshora.exe 收 UDP(打洞、直连要用),所有网络类别都放行,卸载时删掉。 进来的报文客户端都先认证(WireGuard 握手认公钥,控制报文用双方的公钥加密)。
Windows 多半把 Meshora 的虚拟网卡归为"公用网络"。游戏第一次运行时,防火墙会问允许它在哪类网络上通信 —— 只勾了"专用网络"的话,朋友从 Meshora 连进来会被挡住。两种办法:
允许游戏在公用网络上通信(Windows 安全中心 → 防火墙和网络保护 → 允许应用通过防火墙)。只放行这一个游戏
把 Meshora 设为专用网络:设置里打开这一项。一劳永逸,但专用网络的规则会对网里的所有人生效 —— 比如你开着文件共享的话,网里的人也能看到。所以默认关着,只在网里都是你信得过的人时打开。 打开后每次连上都会设一次(网卡是每次连接时新建的,刚建好的几秒里系统还没把它归到网络,客户端会隔两秒重试, 最多一分钟);连着的时候关掉,会改回公用网络。做的事等于以管理员身份运行:
powershellSet-NetConnectionProfile -InterfaceAlias Meshora -NetworkCategory Private这一项在 CI 的 Windows 虚拟机上用真的网卡测过(设成专用、读回来、再设回公用),还没在真的游戏里验证过
它是怎么做的
- 界面用 Tauri 2,由系统自带的 WebView2 显示。界面文件编进程序里,不加载任何网络上的内容
- 节点直接跑在客户端进程里,和命令行的
meshorad用的是同一套代码(meshorad::start)。 所以客户端要以管理员身份运行:没有单独的后台服务,少一个要装、要保护的东西。代价见威胁模型 - 私钥和设置存在
%LOCALAPPDATA%\io.github.kerxs.meshora。私钥第一次运行时生成;文件坏了会报错,不会悄悄换一个身份 - 虚拟网卡叫
Meshora,客户端退出时删掉 - 安装程序是自己写的(
crates/meshora-setup,和客户端同一套界面),由 CI 打 (.github/workflows/package.yml): 客户端、核对过哈希和 WireGuard LLC 签名的wintun.dll、许可证压在安装程序里,装到只有管理员能写的Program Files。 不出免安装版,安装位置有限制:客户端以管理员身份运行、从自己旁边加载wintun.dll,那个文件夹要是普通程序能改, 谁都能换掉wintun.dll,借客户端拿到管理员权限。所以安装程序把Meshora文件夹的所有者改成管理员组、 只给管理员和 SYSTEM 写权限;还要求它上面的每一层普通账户都删不掉、改不了名、改不了权限 —— 不然别的程序能把 整个Meshora文件夹挪走、放一个假的进去 - 本机当主机时,协调服务和中继也跑在客户端进程里(和
meshora-coord --hub同一套代码),只许本机建网络
实测
2026 年 9 月,一台 Windows 11:本机起协调服务(带中继),客户端和一个命令行的 meshorad 各当一个节点。
- 客户端以管理员身份建好网卡,地址
100.64.0.1/10、MTU 1280、跃点数 1,都按设置生效 - 另一个节点先经中继、几秒后切到直连,界面上显示"直连"、在线
- 往受限广播、Minecraft 的组播地址、网段广播各发 50 个 1 KB 的 UDP 报文,每一批都转发给了对方(发送流量各涨约 52 KB)
- 进程被强行结束后,虚拟网卡随之消失,不在系统里留下残余
这次实测还发现并修掉了一个控制面的 bug:往返时间把控制循环空等的时间也算了进去,本机回环上显示成将近 1 秒。
1.0.0 的验收(还没做)
路线图上各项从"开发中"改成"可用"之前,要在两台真的 Windows 电脑、两个不同的家庭网络之间走一遍。 有条件的话欢迎照着做,把结果开 Issue 告诉我们:
- 准备:两台电脑装好客户端。一台建网络(自己架的服务器或本机当主机), 把网络码发给另一台,贴进来加入
- 连通:两边界面上都看到对方"在线"。记下走的是直连还是中继、延迟、抖动、丢包
- 找房间(最关键的一项)。每款游戏记下"房间列表里看不看得到"和"直接输地址能不能进":
- Minecraft Java 版:一边"对局域网开放",另一边的多人游戏列表里应该出现这个世界(组播
224.0.2.60:4445) - 魔兽争霸 III:一边建局域网游戏,另一边的局域网列表里应该看得到(UDP 6112 广播)
- 看不到的话:两边都打开"让游戏的广播走 Meshora"再试;进不去的话,先看防火墙
- Minecraft Java 版:一边"对局域网开放",另一边的多人游戏列表里应该出现这个世界(组播
- 打一局:十分钟以上,记下有没有卡顿、掉线
- 换路:打着的时候,一边把 Wi-Fi 换成手机热点。记下游戏断没断、多久恢复,界面上的路径怎么变
- 附上:两边客户端设置里的日志(有 IP 地址,没有密钥)、两边的 Windows 版本、有没有装加速器或 VPN
自己编译
cargo build --release -p meshora-desktop程序是 target\release\meshora.exe,要把 wintun.dll 放在它旁边 (scripts\fetch-wintun.ps1 -Destination target\release 会下载并核对)。 只想看界面的话,crates/meshora-desktop/dev/index.html 配了一个假后端,用任意静态服务器打开就行, 地址后面加 ?s=onboarding、?s=owner、?s=host、?s=connected、?s=rejected 之类切换场景; 安装程序的界面是 dev/setup.html(?s=fresh、upgrade、fail、uninstall)。
编安装程序:把要装的文件(meshora.exe、wintun.dll、wintun-LICENSE.txt、LICENSE、THIRD-PARTY-NOTICES.md) 放进一个目录,
$env:MESHORA_SETUP_PAYLOAD = "C:\path\to\payload"
cargo build --release -p meshora-setup产物是 target\release\meshora-setup.exe。不设 MESHORA_SETUP_PAYLOAD 编出来的只能看界面、装不了。