molex
一个 Token,通过单个 WSS 端口把内网 TCP 安全交给外地设备。

01 / PROJECT OVERVIEW
项目研究解读
一个 Token,通过单个 WSS 端口把内网 TCP 安全交给外地设备。 本仓库以 Go 为主要技术栈,当前快照索引 121 个文件。报告依据README 与目录结构整理,重点呈现项目用途、工程结构和复用方式,不把宣传描述等同于验证结论。
02 / CORE CAPABILITIES
值得关注的能力
- 01
围绕“一个 Token,通过单个 WSS 端口把内网 TCP 安全交给外地设备”提供公开实现或研究资料
- 02
以 Go 为主,保留 121 个可检查仓库文件
- 03
提供原始 GitHub 链接、目录导览和本地研究快照,便于复核与二次开发
03 / ENGINEERING
工程与仓库结构
仓库以 Go 为主要实现语言,研究快照包含 121 个文件、12 个主要顶层入口。已提供 README 作为使用与能力说明。 项目最近更新时间为 2026-10-20,许可标记为 MIT License。
项目文件与实现资料
项目文件与实现资料
项目文件与实现资料
命令行程序入口
项目文件与实现资料
设计文档、研究记录或项目配图
04 / USE CASES
适合用在哪里
- 学习项目设计与实现
- 评估后用于二次开发
- 作为相关领域的研究参考
05 / QUICK START
从仓库开始
以下命令摘自项目 README 或根据仓库地址生成。请先阅读源仓库的安装要求、许可和脚本,再在自己的环境中运行。
git clone https://github.com/suifei/molex.git
cd molex06 / REPOSITORY MAP
目录证据导览
这里列出快照中的前 121 个索引文件中的代表路径,帮助你快速定位源码、文档、测试与资源。
.gitattributes.github/workflows/ci.yml.github/workflows/release.yml.gitignoreLICENSEREADME.en.mdREADME.mdcmd/config.gocmd/connect.gocmd/root.gocmd/root_test.gocmd/serve.gocmd/web.gocmd/web_test.godeploy/molex-keepalive.shdeploy/molex-relay.servicedocs/architecture.mddocs/deployment-caddy.mddocs/images/readme/case-client-preview-en.jpgdocs/images/readme/case-client-preview-zh.jpgdocs/images/readme/case-roles-en.jpgdocs/images/readme/case-roles-zh.jpgdocs/images/readme/case-ssh-en.jpgdocs/images/readme/case-ssh-zh.jpgdocs/images/user-guide/edge-config-en.pngdocs/images/user-guide/edge-config-zh-CN.pngdocs/images/user-guide/login-en.pngdocs/images/user-guide/login-zh-CN.pngdocs/images/user-guide/relay-connected-clients-en.pngdocs/images/user-guide/relay-connected-clients-zh-CN.pngdocs/images/user-guide/relay-dashboard-en.pngdocs/images/user-guide/relay-dashboard-zh-CN.pngdocs/images/user-guide/target-config-en.pngdocs/images/user-guide/target-config-zh-CN.pngdocs/macos-tahoe-webui-style-guide.zh-CN.mddocs/release-v0.3.1.mddocs/release-v0.3.1.zh-CN.mddocs/release-v0.4.0.mddocs/release-v0.4.0.zh-CN.mddocs/security.mddocs/testing.mddocs/upgrade-guide.mddocs/upgrade-guide.zh-CN.mddocs/user-guide.ar.mddocs/user-guide.de.mddocs/user-guide.es.mddocs/user-guide.fr.mddocs/user-guide.hi.mddocs/user-guide.ja.mddocs/user-guide.ko.mddocs/user-guide.mddocs/user-guide.pt-BR.mddocs/user-guide.ru.mddocs/user-guide.zh-CN.mddocs/user-guide.zh-TW.mddocs/v2-acceptance.zh-CN.mdexamples/Caddyfileexamples/edge.jsonexamples/relay.jsonexamples/target.jsonfrontend/index.htmlfrontend/package-lock.jsonfrontend/package.jsonfrontend/package.json.md5frontend/public/molex-mark.pngfrontend/public/molex-mark.svgfrontend/public/theme-init.jsfrontend/scripts/build-icons.mjsfrontend/src/App.test.tsxfrontend/src/App.tsxfrontend/src/api.tsfrontend/src/i18n.test.tsfrontend/src/i18n.tsfrontend/src/main.tsxfrontend/src/styles.cssfrontend/src/test-setup.tsfrontend/src/types.tsfrontend/src/vite-env.d.tsfrontend/tsconfig.jsonfrontend/tsconfig.node.jsonfrontend/vite.config.tsgo.modgo.suminternal/client/client.gointernal/client/client_test.gointernal/client/diagnostics.gointernal/client/edge.gointernal/client/integration_test.gointernal/client/retry.gointernal/client/stream_group.go
07 / SOURCE NOTES
README 原文摘录
保留原始说明便于复核。中文研究结论以当前快照为依据,后续变化请以 GitHub 仓库为准。
MoleX · English · 简体中文 ·
系统在公司里,人在外面——又不能把机器裸露到公网
研发里最常见的卡点:演示站、SSH、内网 API 只活在公司电脑上。外地客户要看效果,出差同事要改配置,前端要联调模型。
开公网端口危险。拉整网 VPN 太重,对方还看到不该看的东西。搭一套云上测试环境,往往来不及、也不等于「正在开发的那台」。
**MoleX 让对方打开自己电脑上的一个本机地址,加密走到你指定的那一条内网服务。公网只开 443。看完,收回通行证,整组断开。**
客户打开 http://127.0.0.1:18080,看到的是公司开发机 :8080 上还没上线的系统。他进不了公司网,你也没有把 8080 映射到公网。
对着上图做完这件事:
- 云上开 Relay(门卫),生成一张 Token。
- 公司开发机开 Target(前台),登记
127.0.0.1:8080。 - 把 Token 发给客户。客户电脑开 Edge(自己这边的门),勾选演示站。
- 客户访问本机端口。演示结束,停用 Token。
同一张通行证只通向 一个 Target,Edge 可以有很多台。对方多一台电脑,就多开一份 Edge,不会把整段内网掏过去。
同一类问题,换个现场
人在外面,要登公司那台 Linux——又不能把 22 暴露出去。
ssh -p 2222 user@127.0.0.1Windows 远程桌面一样:公司登记 3389,自己电脑连 127.0.0.1:13389。
外地要调公司里的模型 / API——又不想开整段内网。
把那一个 ip:port 登记出去,前端 baseURL 改成 http://127.0.0.1:18080/v1。只这一条服务,不是整网。
它解决什么,不解决什么
| 你卡住的地方 | 常见做法哪里别扭 | MoleX 怎么收 |
|---|---|---|
| 外地看还没上线的系统 | 映射公网端口、拉整网 VPN、另搭云环境 | 对方打开本机地址;公网只开 443 |
| 出差要 SSH / 远程桌面 | 22 / 3389 暴露在公网 | 本机连本地端口,公司端口不出网 |
| 外地联调一条内网 API | 把整段内网或整台机器交给对方 | 只登记这一条服务 |
| 演示结束收不干净 | 端口还开着、VPN 账号还在 | 停用 Token,整组立刻断开 |
| 好几个客户要同时看 | 每人开一条公网映射 | 同一张通行证,多台 Edge |
不管 UDP 游戏、语音、HTTP/3,也不提供匿名上网。SSH / Windows 自己的登录还在,MoleX 只把 TCP 搬过去。
快速开始 · 架构 · 使用手册
架构
一个 Token 就是一组信任关系。跨 Token 完全隔离:互不可见、互不可达。
flowchart TB
subgraph Edges["需要服务的机器"]
AppA["本地应用"]
EdgeA["Edge A 目录勾选 · 本机端口"]
AppB["本地应用"]
EdgeB["Edge B"]
AppA --- EdgeA
AppB --- EdgeB
end
subgraph Public["公网主机 · 只开 443/tcp"]
Caddy["Caddy TLS 1.3"]
Relay["MoleX Relay 127.0.0.1:8080"]
Tokens["Token 注册表"]
Caddy --- Relay
Relay --- Tokens
end
subgraph Intranet["能到达后端的机器"]
Target["MoleX Target 发布目录 · 白名单拨号"]
Svc["内网 ip:port SSH / API / DB …"]
Target --- Svc
end
EdgeA -->|"出站 WSS + Token"| Caddy
EdgeB -->|"出站 WSS + Token"| Caddy
Target -->|"出站 WSS + Token"| CaddyRelay 不为每条隧道开公网端口。所有组共用 Caddy 的 /ws/session。重复 Target 会被拒绝;崩溃的 Target 由服务端心跳(20s ping / 75s 读超时)腾出槽位后即可重新入场。
Token 组互相隔离
flowchart LR
subgraph Office["Token office"]
T1["Target 家中 NAS"]
E1["Edge 办公室"]
E2["Edge 笔记本"]
T1 --- E1
T1 --- E2
end
subgraph Lab["Token lab"]
T2["Target 实验室"]
E3["Edge 工位"]
T2 --- E3
end
Relay["Relay 按 Token 分组复制密文"]
Office -.-> Relay
Lab -.-> Relayoffice 的 Edge 看不到 lab 的目录,构造寻址头也会被 Target 白名单拒绝。
一台进程加入多组
flowchart LR
subgraph OneProcess["单个 Target 进程"]
P["molex connect"]
P --> S1["office 会话池"]
P --> S2["lab 会话池"]
end
S1 --> C1["目录:web 仅 office 可见"]
S2 --> C2["目录:对 lab 为空或另一组服务"]services[].groups 为空表示对该进程已加入的全部组可见;列出组名则仅这些组能看见、能拨号。Edge 加入多组时,每条映射必须带 group。
三种角色
mode | 放在哪 | 做什么 | 怎么管 |
|---|---|---|---|
relay | 有公网域名的机器 | Token 准入、1 Target + N Edge 分组、复制密文 | 密码登录:创建 / 轮换 / 停用 / 删除、审计、在线客户端、踢线 |
target | 能访问后端的机器 | 发布目录,只拨号已发布地址 | 免登录本地页:wss + Token,服务与可见组热更新 |
edge | 使用服务的机器 | 把已发布服务映射到本地端口 | 免登录本地页:勾选目录、分配端口、局域网开关 |
管理面强制回环(默认 127.0.0.1:9090)。远程请走 HTTPS 反代或 SSH 转发。Target / Edge 额外校验本机 Host,防止 DNS 重绑定。
数据怎么走
本地应用连的是 Edge 上的普通 TCP 端口。出公网之后,全程是加密记录:
flowchart LR
TCP["应用 TCP"] --> Yamux["yamux 流 服务 id 寻址头"]
Yamux --> GCM["AES-256-GCM"]
GCM --> WSS["WSS 二进制帧"]
WSS --> TLS["Caddy TLS 1.3"]
TLS --> Copy["Relay 只复制密文"]
Copy --> Dial["Target 白名单拨号"]
Dial --> Backend["后端 TCP"]应用 TCP
→ Edge 映射监听
→ yamux(控制流发目录 / 数据流带服务 id)
→ AES-256-GCM 记录
→ WebSocket 二进制帧
→ TLS 1.3(Caddy :443)
→ Relay 密文复制
→ Target 白名单拨号
→ 内网服务sequenceDiagram
participant App as 本地应用
participant Edge as Edge
participant Relay as Relay
participant Target as Target
participant Svc as 内网服务
Edge->>Relay: WSS + Bearer Token
Target->>Relay: WSS + Bearer Token
Note over Edge,Target: X25519 + HKDF + AES-256-GCM PSK 由 Token 派生 · Relay 看不到明文
Target-->>Edge: 加密控制流:服务目录
App->>Edge: TCP 连映射端口
Edge->>Target: 数据流 + 服务 id
Target->>Svc: 仅拨号已发布地址
Svc-->>App: 全双工 TCP- 端到端密钥:
PSK = HKDF-SHA256(token, "molex/v2/e2e-psk"),再加 X25519 临时密钥做前向保密。 - 目录与寻址头都在密文里;Relay 只看到连接元数据、时序和帧长度。
- 每个 Edge 一条独立加密会话;Target 按需扩会话池(热备一条,上限 65535),密钥与 yamux 状态不混用。
- 每进程 / 每会话最多 256 条并发流。加密隧道禁用 WebSocket 压缩。
完整握手与信任边界见架构与协议。
快速开始
1. 下载或编译
Windows、macOS、Linux 的 amd64 / arm64 包在 GitHub Releases,附带 SHA256SUMS。
源码构建需要 Go 1.25+ 与 Node.js 20+:
cd frontend
npm ci
npm run build
cd ..
go build -trimpath -ldflags "-s -w -X main.version=0.4.0" -o bin/molex .必须先构建前端,再构建 Go,以便把当前 Web 资源嵌入二进制。
2. 公网 Relay
molex config init --mode relay --config relay.json
molex web --config relay.json --password-file ./web-password --autostart数据面 127.0.0.1:8080,控制台优先 127.0.0.1:9090(占用则后移)。登录后创建 Token,默认遮罩,可显示并复制。用 Caddy 发布 /ws/session 与管理页:见 Caddy 示例 和部署指南。
3. 内网 Target
在能访问后端的机器上:
molex web选 Target,填 wss://…/ws/session 和 Token,启动后添加服务(例如 10.188.200.16:30927)。保存即发布,运行中修改同样即时生效。
4. 本地 Edge(可多台)
molex web选 Edge,填同一 WSS 与 Token。目录出现后勾选服务,控制台会建议空闲端口。仅在局域网其他设备需要访问时打开「局域网可见」(0.0.0.0)。显示「监听中」后即可:
ssh -p 2222 user@127.0.0.15. 远程看控制台
ssh -N -L 9090:127.0.0.1:9090 user@molex-hostRelay 控制台有会话 Cookie、CSRF、同源检查和登录限速。Target / Edge 免登录,但只接受回环来源。
配置
未知字段会被拒绝。三种角色各自只保留少量字段:
{
"mode": "relay",
"listen": "127.0.0.1:8080",
"tokens": [
{ "id": "tok-example", "token": "mx2_generated-value", "note": "office" }
]
}{
"mode": "target",
"remote": "wss://molex.example.com/ws/session",
"token": "mx2_generated-value",
"name": "home-target",
"services": [
{ "id": "svc-web", "name": "web", "address": "10.188.200.16:30927" }
]
}{
"mode": "edge",
"remote": "wss://molex.example.com/ws/session",
"token": "mx2_generated-value",
"name": "office-edge",
"mappings": [
{ "service": "svc-web", "port": 28080, "lan": false }
]
}| 字段 | 角色 | 含义 |
|---|---|---|
mode | 全部 | relay / target / edge |
listen | Relay | 数据面回环地址,位于 Caddy 之后 |
remote | Target / Edge | wss://;明文 ws:// 仅回环 |
token | Target / Edge | 单组 Token(mx2_ 前缀)。与 tokens[] 互斥 |
name | Target / Edge | 控制台显示名,默认主机名 |
tokens[] | 全部 | Relay:签发记录(含轮换宽限)。客户端:{id, token} |
services[] | Target | id / name / address;可选 groups |
mappings[] | Edge | service / port / lan;多组时必填 group |
核对过的起点在 [examples/](examples/)。
CLI
molex serve --config ./relay.json
molex connect --config ./target.json
molex connect --config ./edge.json --remote wss://molex.example.com/ws/session --token "$MOLEX_TOKEN"
molex web --config ./molex.json --password-file ./web-password --autostart
molex config init --config ./molex.json --mode relay|target|edge
molex config check --config ./molex.json
molex versionRelay 密码也可用 MOLEX_WEB_PASSWORD。不要把 Token 写进节点名、日志或截图。
从 v1 迁移
v2 不自动迁移。mode: "punch" 以及 role / secret / tunnel 会启动失败并指向升级指南。
- Relay:
molex config init --mode relay --force,为每组信任关系创建一个 Token。 - 原 Target:
molex config init --mode target --force,把旧的tunnel.local(及多规则里的各个local)加成已发布服务。 - 原 Edge:
molex config init --mode edge --force,勾选服务并沿用原来的本地端口。 - 废弃 v1 的
secret与channel。v1 / v2 不能混跑。
稳定性与恢复
- 重连:约 1s → 15s,±20% 抖动,健康 30s 后重置。
- 映射只在路由就绪且服务仍发布时监听;Target 掉线或下架即关端口,恢复后自动重开。
- 端口占用只影响该条映射,释放后约 3 秒恢复。
- 停用 Token、重复 Target、管理员踢线都给出下一步操作。
- 停机有界:先关监听与会话,再关被追踪的本地连接,最后等待已接纳任务。
- Linux:
deploy/molex-relay.service;无 systemd:deploy/molex-keepalive.sh。
安全要点
- 未知 Token → HTTP 401;已停用 → 403。URL 必须是
/ws/session。 - Hello 为固定 128 字节,不含明文 Token 或产品标记。
- Relay 按 Token 预计算路由,并用实例 id 强制「每 Token 一个 Target」。
- 目录、服务 id、拨号状态都在 AES-256-GCM 内;Relay 代码没有载荷解密路径。
- Target 拒绝目录之外的一切拨号。
- 远程 WSS 必须使用有效证书。
漏洞报告与凭据管理见安全模型。
公开文档
| 文档 | 用途 |
|---|---|
| v0.4.0 发行说明 | 破坏性变更、必须升级的角色、验证范围 |
| 使用手册 | 12 语种:五分钟部署、控制台、场景、排障 |
| 升级指南 | 从 ≤v0.3.1 干净切换、回滚、验收 |
| 架构与协议 | 拓扑、目录协议、握手、记录、重连 |
| 安全模型 | 信任边界、凭据、白名单、漏洞报告 |
| Caddy 部署 | 生产 WSS、回环、systemd、健康检查 |
| 测试与发布检查 | Go / race / 前端 / 真实 Socket |
| v2 验收清单 | 逐项验收记录 |
| 配置示例 | Relay / Target / Edge / Caddy 最小起点 |
验证
go test -count=1 ./...
go test -race -count=1 ./...
go vet ./...
cd frontend && npm test && npm run check && npm run build集成测试覆盖:多 Edge 并发、目录增删同步、重复 Target、白名单、Token 停用/踢线自愈、跨 Token 隔离、Target 重启、端口占用恢复、有界停机、密文篡改拒绝。
名称与许可证
MoleX 把鼹鼠打隧道与 X(transfer / cross / exchange)合在一起:通过加密会合路径,转发你自己拥有的 TCP 服务。
源码与仓库文档采用 MIT 许可证。许可证覆盖代码,不自动授予项目名、图标或商标权利。

