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 校验文件。
| 客户端 | x64 | ARM64 |
|---|---|---|
| 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 管理固定隧道:
- 创建 HTTP 子域名,或分配固定 TCP / UDP 端口;每个账号最多 5 条。
- 保存首次显示的隧道码。服务端只存 SHA-256 哈希,不能再次读取原码。
- 将码作为 CLI 参数或 SSH 密码。复制命令、刷新页面不会消耗或更新码。
- 忘记码时手动更新。可以暂停、恢复或永久删除隧道;删除立即释放地址。
固定地址保存在 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_ADDR | SSH 实际监听地址,默认 :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_DOMAIN | HTTP 隧道子域名后缀 |
OIDC_ISSUER | 默认 https://auth.nodelane.net/oidc |
OIDC_WEB_CLIENT_ID | OIDC 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_HOST | TCP/UDP 绑定 IP,默认 0.0.0.0 |
TRUSTED_PROXY_CIDRS | 可以提供真实客户端 IP 的反向代理网段 |
RELEASE_DIR | CLI 下载目录;容器内为 /releases |
OIDC Web 应用回调 URI 必须为 ${PUBLIC_ORIGIN}/auth/callback,使用 Authorization Code + PKCE、openid profile。只有浏览器执行登录流程。网站可在身份服务暂时不可用时继续提供现有凭据连接和匿名连接。
使用 Compose 或 镜像覆盖文件,仅启动 tunneld。配置 SSH_HOST_KEY_PATH 为宿主机密钥绝对路径。PostgreSQL 由部署环境提供。通过 OpenResty 或 Caddy 将控制台域名和通配子域名代理到同一个 HTTP 入口,配置对应 DNS 和通配 HTTPS 证书。
TCP/UDP 公网地址使用 SSH_ADDRESS 的主机名,HTTP 子域名使用 PUBLIC_DOMAIN。网页域名经过 CDN 时,将 SSH_ADDRESS 配为直连域名或公网 IP。SSH 端口通过原始 TCP 对外开放;例如公网 2223 映射到容器 2222,设置 SSH_ADDRESS=your-host:2223、SSH_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。