查看: 10|回复: 0

我把自己用的虚拟局域网工具开源了:MeshLAN

[复制链接]

18

主题

1

回帖

66

积分

注册会员

积分
66
发表于 20 小时前 | 显示全部楼层 |阅读模式
我把自己用的虚拟局域网工具开源了:MeshLAN
这段时间一直在折腾一个叫 MeshLAN 的项目,现在终于整理好源码,正式放到 GitHub 上了。
项目地址:
https://github.com/zhaoxuya520/MeshLAN
最初做它的原因其实很具体。
我本机开着一些只监听 localhost 的服务,比如 API、Web 管理页面和开发工具。我想让不在同一个地方的朋友也能访问,但又不想把端口直接暴露到公网。
一开始用的是 SSH 隧道。能用,但每台电脑都要准备密钥、输入命令、维持连接,端口一多就很麻烦。后来我想,既然大家经常需要互相访问服务,为什么不干脆把这些异地电脑组成一个虚拟局域网?
于是就有了 MeshLAN。

它解决什么问题?
MeshLAN 可以把不同城市、不同宽带、不同 NAT 后面的 Windows 电脑放进同一个加密虚拟局域网。
每台设备会获得一个稳定的虚拟 IP。加入以后,设备之间可以像连接在同一个路由器下面一样通信。
现有家庭网络、公司网络和默认网关不会被替换。MeshLAN 只负责自己的虚拟网段,不会把所有上网流量都接管过去。
设备之间会优先尝试 P2P 直连。双方 NAT 条件允许时,数据直接在两台电脑之间传输;打洞确实无法成功时,才会自动使用 Relay 中继。
所以 Relay 是兜底,不是所有数据默认都绕服务器走。

服务映射:
这是我自己使用频率最高的功能。
假设电脑上有一个服务:
localhost:4571
在 MeshLAN 里填写服务名称、本地地址和端口,发布以后,同一个虚拟局域网里的其他成员就能访问它。
映射支持:
TCP 和 UDP
自动分配虚拟局域网端口
自定义映射端口
同时创建多个服务
服务健康检查
暂停和恢复单个映射
查看当前连接用户
查看实时连接和流量
暂停某个用户的访问权限
开放访问或手动审批
如果端口已经被其他映射占用,创建时会直接提示冲突,不会等到发布以后才发现访问不了。
每个人都可以发布自己的服务,所有成员都能在“全网共享服务”里看到当前可用的内容,但用户只能修改和删除自己创建的映射。
它不仅能用来共享 API,也可以用来访问数据库、管理后台、开发环境、游戏服务器和其他 TCP/UDP 服务。

MeshDNS
虚拟 IP 虽然稳定,但还是不太适合记忆,所以我又加了 MeshDNS。
每个用户可以给自己的设备设置一个前缀。例如:

zhaoxu.mesh

发布服务时,还可以给服务设置独立前缀。比如把一个 ChatGPT API 映射命名为 chat,其他成员就可以使用:

chat.zhaoxu.mesh

对于普通 TCP 或 UDP 服务,可以使用:

chat.zhaoxu.mesh:20000

如果发布的是 Web 服务,还可以启用本地 HTTP/HTTPS 网关,直接通过域名访问,不需要再写端口号。
MeshDNS 不是写死在客户端里的静态列表。设备改名、创建映射、删除映射、暂停服务或者修改前缀后,名称目录都会根据当前真实状态更新。
名称发生冲突时也会在保存前阻止,不会出现两个服务悄悄指向同一个名字的情况。
网络路径:

MeshLAN 的网络层基于 Nebula。

客户端支持:
仅 IPv4
仅 IPv6
IPv4 + IPv6
双栈路径竞速
STUN 出口检测
UPnP 映射
NAT 打洞诊断
多 Lighthouse
多 Relay
Relay 健康评分与自动选择
网络切换后重新注册端点
P2P 强制诊断模式

如果电脑同时开着 Clash、全局代理或者 TUN,MeshLAN 还会尽量让自己的 Nebula 链路从真实物理网卡出去,避免 P2P 流量被代理绕走。
与此同时,本机服务自己访问互联网时,仍然可以继续使用原来的代理设置。也就是说,MeshLAN 的组网流量走直连,不代表你发布的 API 不能使用代理访问外部服务。

实时拓扑和历史:
客户端里有一张实时网络拓扑图。
它不只是画几个固定节点,而是根据当前数据展示:
在线设备
虚拟 IP
P2P 或 Relay 路径
公网 Underlay 端点
链路延迟
实时上传和下载
服务映射
服务健康状态
当前连接数量
使用的物理出口
网络路径变化
流量动画使用真实字节增量,没有新流量时不会播放假动画。
历史数据保存在本机 SQLite 中,可以查看一段时间内的吞吐变化、P2P/Relay 数量、设备在线情况、路径切换和服务连接记录。
控制服务器不保存业务报文内容。

文件直传:
除了端口映射,MeshLAN 也支持设备之间临时分享文件。
文件本身通过 Nebula 加密链路直接传输,服务器只同步分享元数据,不保存文件内容。
可以设置:
接收设备
有效期
最大接收次数
SHA-256 校验
接收回执
随时撤销
分享过期或者接收次数用完以后,本机会自动清理临时文件。

AI 助手:
项目里还集成了一个可选的 AI 助手。
模型和 API 密钥配置在主服务端,密钥不会下发到客户端。客户端发送给 AI 服务端的上下文会经过端到端加密。
它可以帮助用户检查网络状态、分析 P2P 问题、创建服务映射、修改访问权限或者处理常见故障。
涉及修改时,AI 不能直接绕过用户执行。它必须先生成操作计划,列出准备调用的工具、原因、风险和是否可撤销,用户确认以后才会真正执行。
客户端支持保存多个本地会话,聊天记录保存在当前设备。

客户端和服务端:
Windows 客户端是便携 EXE,不需要安装器。
用户拿到文件以后,第一次运行只需要输入:
设备名称
主服务端 IP 或域名
管理员分配的一次性授权哈希
配对完成后,设备身份会保存在本机。后续双击启动即可,不需要每次重新输入哈希。
主服务端负责设备授权、证书签发、吊销、节点管理和更新分发。

服务端和子节点支持:
Linux amd64
Linux arm64
多 Lighthouse
多 Relay
子节点健康检查
故障切换
签名吊销列表
客户端更新发布

安全方面:
设备的 Nebula 私钥在客户端本机生成,不上传到控制服务器。
一次性授权哈希会绑定设备身份和公钥,已经使用或吊销后不能继续拿去注册其他设备。
更新包会验证:
Ed25519 签名
SHA-256
文件大小
版本信息
启动后的健康状态
更新失败或者新版本无法正常启动时,可以回滚上一版本。
技术栈:
项目主体使用 Go 编写。
Windows 原生窗口使用 WebView2,界面资源直接嵌入 EXE,不会额外打开 Edge 或 Chrome 浏览器窗口。
主要用到:
Go
SlackHQ Nebula
WebView2
SQLite
Windows DPAPI
X25519
AES-256-GCM
Ed25519
PowerShell
Bash
systemd
GitHub Actions
Windows、Ubuntu 测试以及 Linux amd64/arm64 构建都由 GitHub Actions 自动执行。

当前状态:
MeshLAN 现在已经能够满足我自己和朋友之间的日常使用,但它仍然是一个比较年轻的项目。
不同地区、运营商、路由器、IPv6 环境和 TUN 软件的组合非常多,我不可能一个人覆盖所有网络情况。
如果你也有异地组网、共享 localhost、联机开发、访问家庭服务或者游戏服务器的需求,可以试试看。
遇到问题欢迎提交 Issue。也欢迎对 Windows 网络、IPv6、NAT 打洞、Nebula、多 Relay、UI、文档和安全感兴趣的人一起完善。
项目已使用 MIT License 开源。
GitHub:
https://github.com/zhaoxuya520/MeshLAN
如果觉得项目有用,欢迎点个 Star。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:2776601884@qq.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|青ICP备2025004122号-1

在本版发帖
关注公众号
返回顶部