SSH+NginxでセルフホストHTTPトンネル構築

原題: Self-hosted HTTP tunnels with SSH and Nginx

なぜ重要か

専用エージェント不要でSSH標準機能だけを使う点が、社内セキュリティポリシーが厳しい開発現場での採用可能性を高める。

エンジニアのVincent Bernatが2026年10月3日、OpenSSHとNginxだけを使ってセルフホスト型HTTPトンネルを実装する手法をブログで公開した。ngrokやCloudflare Quick Tunnelsのような商用サービスや専用クライアントを必要とせず、標準的なSSHクライアントのみで`localhost`上のサービスを外部公開できる仕組みを解説している。

ローカル環境で動くWebサービスを一時的に外部共有したい場面は多い。Bernatが公開した手法は、OpenSSHのリモートポートフォワーディングとNginxのリバースプロキシを組み合わせた2ステップ構成だ。

まず`ssh -N -R 0:localhost:8080 web02.luffy.cx`を実行すると、サーバー側がフリーポートを自動割り当てする(例:41535)。次にNginxのワイルドカード設定でサブドメイン`p41535.ssh.luffy.cx`へのHTTPSアクセスをそのポートにプロキシする。DNS側には`*.ssh.luffy.cx`のCNAMEレコードとLet's Encryptのワイルドカード証明書(DNS-01チャレンジ)が必要だ。

セキュリティ面では、割り当てポートのエントロピーが約14.8ビットと低いことを率直に認めている。カーネルが奇数ポートを優先することで1ビット失われる点も指摘した。対策として`ngx_http_secure_link_module`を活用し、秘密鍵・ポート番号・有効期限タイムスタンプを組み合わせたMD5ハッシュをURL内のBasic認証ユーザー名として埋め込む方式を採用した。URLの形式は`https://ハッシュ--有効期限@pポート番号.ssh.luffy.cx/`となり、curlを含む主要なHTTPクライアントで動作する。

有効期限を付与する理由は、後続セッションが同じポートを再利用する可能性があり、それを検知する手段がないためだ。NginxのMapディレクティブでユーザー名からハッシュと期限を分離し、モジュールへ渡す構成を詳細なコードで示している。インフラにはNixOSを使用しており、証明書の自動取得も組み込み済みという。

出典

vincent.bernat.ch — 元記事を読む →