開発者がlocalhostで動作している作業中のサイトを共有したいとき、通常の選択肢はngrokやCloudflare Quick Tunnelsなどの商用サービス、または専用クライアントが必要なセルフホストツールです。Bernatは、ほとんどのサーバーに既にあるOpenSSHクライアント/サーバーペアとnginxのリバースプロキシだけを使用して、同じ結果を達成できることを示しています。
この技術は、ゼロポート指定子(`ssh -R 0:localhost:8080 user@remote`)を使ったSSHのリモートポートフォワードに依存しています。リモートポートがゼロに設定されていると、SSHサーバーは空いているハイナンバードポートを割り当てて報告します。nginxは、そのポートをキャプチャする正規表現サーバー名(`~^p(?<port>\d{5})\.ssh\.example\.cx$`)を配置し、`proxy_pass`ディレクティブで`http://127.0.0.1:$port`にリクエストを転送します。ポートを推測してサービスにアクセスされるのを防ぐため、この設定ではnginxの`ngx_http_secure_link_module`を使用します。クライアントは、有効期限タイムスタンプ、割り当てられたポート、共有シークレットのMD5ハッシュをBase64エンコードしたものを含むURLを構築し、nginxはそのハッシュを検証して、署名が欠如しているか期限切れの場合は401または410を返します。
カーネルの一時ポート範囲は約15ビットのエントロピーしか提供しないため、割り当てられたポートはブルートフォース攻撃の対象となり得ます。このため、署名付きリンクが必要な保護層を追加します。この方法ではワイルドカードDNSレコード(`*.ssh.example.cx`)とTLS証明書がまだ必要ですが、Let’s Encryptで自動化できます。余分の機能を備えた完成型トンネルサーバーを好むユーザーのために、オープンソースプロジェクトsishはHTTP(S)、WS(S)、TCPトンネル、トラフィックを検査するウェブコンソール、プライベートジャンプホスト用のTCPエイリアス、SNIベースのルーティングを提供し、これらは単一のSSHサーバーとして動作します。
この記事では、sishは基本的なSSH/nginxセットアップを超える機能を備えた完成型トンネルサーバーを提供するオープンソースプロジェクトとして言及されています。