NodeLane Tunnel

September 12, 2026 · View on GitHub

通过 SSH 或常驻 CLI,把本地服务映射到公网。

  • 不填写隧道码:匿名随机地址,无需账号;单次连接最长 60 分钟,每个来源 IP 最多 3 条。
  • 填写正确隧道码:使用控制台创建的固定地址。码可重复使用,永不过期。
  • 填错码:拒绝连接并提示错误。
  • 手动更新码:固定地址保留,旧码和当前连接立即失效。
  • CLI 只连接和转发,没有登录、登出、账号缓存或单独的匿名命令。

原生 ssh -R 支持 HTTP、WebSocket 和 TCP。CLI 通过同一 SSH 服务连接,另外提供保留报文边界的 UDP 转发。

统一命令

Linux 终端、Windows PowerShell 和 CMD 使用完全相同的原生 SSH 命令。需要系统提供 OpenSSH 客户端,不需要 curl 或启动脚本。

将本地 HTTP 服务公开:

ssh -T -p 2222 -R 80:localhost:3000 http@tunnel.nodelane.net

将本机 SSH 服务作为 TCP 隧道公开:

ssh -T -p 2222 -R 0:localhost:22 tcp@tunnel.nodelane.net

密码提示处输入隧道码,或空密码直接回车进行匿名连接。SSH 用户名 http / tcp 必须对应控制台隧道协议。连接后终端显示公网地址。服务端只接受远程转发,不提供系统 shell、命令执行、SFTP 或到服务端内网的直接转发。

命令仅保留禁用终端分配的 -T、服务端口 -p 和转发目标 -R。服务端只提供密码认证,并负责保活和转发失败时断开连接。

服务遵循 SSH 远程端口转发协议。首次使用原生 SSH 时核对服务端主机指纹;CLI 从服务的 HTTPS /api/connection 获取并校验 SSH 公钥。

后台 CLI

需要关闭终端后继续转发时,下载对应设备的单文件客户端并加入 PATH,文件名保留为 nt / nt.exe。Linux 下载后赋予可执行权限。网页的 CLI 入口也提供下载链接;版本目录 /releases/{version}/ 包含 SHA-256 校验文件。

客户端x64ARM64
Linux下载下载
Windows下载下载

安装后,两种系统使用相同命令,省略码即匿名:

nt --background http localhost:3000

固定地址、其他协议和自建服务:

nt --background --code YOUR_TUNNEL_CODE http localhost:3000
nt --background --log ./tunnel.log tcp localhost:22
nt --background udp localhost:5353
nt --server https://your-tunnel.example http localhost:3000

所有选项放在协议前。也可以通过进程环境变量 NT_CODE 传码,CLI 只在内存中保留凭据。

--background 等待真实连接成功后才返回地址、PID 和日志路径。关闭终端后继续运行;网络断开时最多间隔 30 秒重试。错误码在启动终端直接报错;认证失败后退出。去掉该参数即可在前台运行,通过 Ctrl+C 结束。可通过系统进程管理器按 PID 结束后台进程;重启电脑后需要重新启动命令。

首页和控制台仅区分 SSH / CLI 连接方式,不再按操作系统生成命令。SSH 支持 HTTP、TCP;UDP 使用 CLI。暂停或更新固定隧道码会断开当前连接,恢复后使用有效码重新连接。

控制台与数据

浏览器使用 OIDC Web 应用登录,在 /console 管理固定隧道:

  1. 创建 HTTP 子域名,或分配固定 TCP / UDP 端口;每个账号最多 5 条。
  2. 保存首次显示的隧道码。服务端只存 SHA-256 哈希,不能再次读取原码。
  3. 将码作为 CLI 参数或 SSH 密码。复制命令、刷新页面不会消耗或更新码。
  4. 忘记码时手动更新。可以暂停、恢复或永久删除隧道;删除立即释放地址。

固定地址保存在 PostgreSQL,重启服务后保持不变。在线连接和当前连接的流量计数只保存在内存,重连后计数重新开始。HTTP 数据面和 TCP/UDP 监听器由同一个服务进程管理。每个 PostgreSQL 数据库只允许一个服务实例持有运行锁。

本次为全新数据库结构,需要一个空 PostgreSQL 数据库。初始化拒绝已有表的 schema,不自动清空数据库,不提供旧数据导入、升级迁移或旧 API。新结构只有格式标记、账号、固定隧道、浏览器会话和浏览器登录状态五张表。隧道凭据不包含有效期或兑换状态。

自建部署

构建:

pnpm --dir web install --frozen-lockfile
pnpm --dir web build
node deploy/sync-web.mjs
go build -o bin/tunneld ./cmd/tunneld
go build -o bin/nt ./cmd/nt

生成一次 SSH 主机密钥,后续部署保留同一个文件:

bin/tunneld keygen --out ssh_host_ed25519_key

生成器拒绝覆盖已有文件。容器使用 UID 65532,挂载前将密钥文件所有者设置为容器用户,并保留仅所有者可读权限。

配置用途 / 默认值
DATABASE_URL必填,独立的空 PostgreSQL 数据库
SSH_HOST_KEY_FILE必填,稳定的 SSH 私钥文件
SSH_LISTEN_ADDRSSH 实际监听地址,默认 :2222
SSH_ADDRESS客户端连接的公网 host:port,默认 tunnel.nodelane.net:2222
LISTEN_ADDR网页、API 和 HTTP 隧道入口,默认 127.0.0.1:9000
PUBLIC_ORIGIN控制台 HTTPS origin,默认 https://tunnel.nodelane.net
PUBLIC_DOMAINHTTP 隧道子域名后缀
OIDC_ISSUER默认 https://auth.nodelane.net/oidc
OIDC_WEB_CLIENT_IDOIDC Web 应用的 App ID
OIDC_WEB_CLIENT_SECRET同一个 Web 应用的 App Secret
PORT_START / PORT_END固定 TCP/UDP 端口范围,默认 20000–24999
ANONYMOUS_PORT_START / ANONYMOUS_PORT_END匿名端口范围,默认 25000–29999,必须与固定范围分开
FORWARD_HOSTTCP/UDP 绑定 IP,默认 0.0.0.0
TRUSTED_PROXY_CIDRS可以提供真实客户端 IP 的反向代理网段
RELEASE_DIRCLI 下载目录;容器内为 /releases

OIDC Web 应用回调 URI 必须为 ${PUBLIC_ORIGIN}/auth/callback,使用 Authorization Code + PKCE、openid profile。只有浏览器执行登录流程。网站可在身份服务暂时不可用时继续提供现有凭据连接和匿名连接。

使用 Compose镜像覆盖文件,仅启动 tunneld。配置 SSH_HOST_KEY_PATH 为宿主机密钥绝对路径。PostgreSQL 由部署环境提供。通过 OpenRestyCaddy 将控制台域名和通配子域名代理到同一个 HTTP 入口,配置对应 DNS 和通配 HTTPS 证书。

TCP/UDP 公网地址使用 SSH_ADDRESS 的主机名,HTTP 子域名使用 PUBLIC_DOMAIN。网页域名经过 CDN 时,将 SSH_ADDRESS 配为直连域名或公网 IP。SSH 端口通过原始 TCP 对外开放;例如公网 2223 映射到容器 2222,设置 SSH_ADDRESS=your-host:2223SSH_LISTEN_ADDR=:2222。TCP/UDP 公网端口范围同样需要开放并映射,固定端口与匿名端口不能重叠。

验证与发布

go test ./... -count=1
go vet ./...
pnpm --dir web test:built
node deploy/sync-web.mjs
pnpm --dir web test:embedded

数据库测试只读取 NODELANE_TEST_DATABASE_URL,并强制其主机为 loopback、数据库名为 nodelane_tunnel_ssh_test。每个测试创建独立 schema。未配置时会明确跳过数据库测试,不会使用生产配置。Linux 上可运行 go test -race ./... 验证并发。

cmd/nt 测试会构建真实 CLI,实测空码和固定码的后台进程、父进程退出后的转发以及错误码启动失败;网关测试会调用已安装的 OpenSSH,验证空密码、正确码和错误码。数据库测试覆盖多次用码、跨重启固定地址、手动轮换、账号隔离、并发配额及浏览器 OIDC 流程。完整 HTTP 服务测试同时验证直连和可信代理后的转发。

client-version.txt 为 CLI 版本;deploy/build-client-assets.sh 生成 Linux / Windows 的 amd64 / arm64 单文件客户端及 SHA-256。构建 Docker 镜像包含新网站和客户端。Git 提交、镜像推送和生产部署需要分别执行;本地测试不代表公网已经更新。

MIT License。漏洞报告请使用 GitHub Security Advisories