当开发者想要分享正在 localhost 上运行的进行中的站点时,通常的选择是诸如 ngrok 或 Cloudflare Quick Tunnels 之类的商业服务,或需要专用客户端的自托管工具。Bernat 演示了只需使用大多数服务器上已有的 OpenSSH 客户端/服务器对和一个 Nginx 反向代理即可达到相同的效果。
该技术依赖于 SSH 的远程端口转发,使用零端口说明符(`ssh -R 0:localhost:8080 user@remote`)。当远程端口设置为零时,SSH 服务器会分配一个空闲的高编号端口并报告回来。Nginx 被配置为使用正则表达式服务器名称(`~^p(?<port>\d{5})\.ssh\.example\.cx$`)来捕获该端口,并在 `proxy_pass` 指令中使用它将请求转发到 `http://127.0.0.1:$port`。为了防止任何猜中端口的人访问该服务,该设置采用了 Nginx 的 `ngx_http_secure_link_module`。客户端构建一个 URL,其中包含一个过期时间戳、分配的端口和共享密钥的 base64 编码 MD5 哈希;Nginx 验证该哈希,如果签名缺失或过期,则返回 401 或 410。
由于内核的临时端口范围仅提供约 15 位的熵,分配的端口可能被暴力破解,这就是为什么签名链增加了一层必要的保护。该方法仍然需要一个通配符 DNS 记录(`*.ssh.example.cx`)和一个 TLS 证书,可以使用 Let’s Encrypt 进行自动化。对于更喜欢具备额外功能的现成隧道服务器的用户,开源项目 sish 提供了 HTTP(S)、WS(S) 和 TCP 隧道、用于检查流量的网络控制台、用于私有跳板机的 TCP 别名以及基于 SNI 的路由,所有这些都作为单一 SSH 服务器运行。
文章提到 sish 是一个开源项目,提供现成的隧道服务器,具有超出基本 SSH/Nginx 设置的额外功能。