接続を受け付けられないマシンに SSH したい。たとえばルーターの内側の自宅サーバー、オフィスの Raspberry Pi、モバイルや 5G 回線上のマシンです。昔ながらの答え(ルーターでポート 22 を転送する)は、使える場面が減る一方で、使えたとしても悪手です。この記事では、実際に機能する 4 つの方式と、それぞれの代償、そして動く実例を順に見ていきます。どれも、到達しようとしているマシンに受信ポートを開きません。
なぜもう単純にポート転送できないのか
邪魔をするものが 2 つあります。1 つ目は キャリアグレード NAT(CGNAT) です。いまや家庭用の光回線、ケーブル、モバイル、Starlink の多くは、1 つのグローバル IP を多数の契約者で共有しています。そのため「あなたの」アドレスに転送できるポートは存在しません。あなたが管理しているルーターは、グローバル IP を握っているルーターではないのです。2 つ目は、本物のグローバル IP があっても、転送された SSH ポートは数分でスキャナーに見つかることです。公開した瞬間から、ログは総当たりの試行で埋まっていきます。以下のどのケースでも、解決策の形は同じです。プライベートなマシンが、到達可能な何かへアウトバウンドの接続を行い、その接続に乗って逆向きに入ってくるのです。アウトバウンドは、CGNAT や固く閉じたファイアウォールの中でも機能します。ネットワークから出ていく、ただのもう 1 本の接続にすぎないからです。
4 つの選択肢を一目で
| 方式 | 動かすもの | 追加のインフラ | マシン上に長期の鍵は残る? | 向いている用途 |
|---|---|---|---|---|
| リバース SSH トンネル | マシン上で ssh -R + autossh | グローバル IP 付きの VPS | あり(VPS 向け) | すでに VPS を借りている |
| メッシュ VPN(Tailscale/WireGuard) | 両端に VPN クライアント | 調整サービス | 通常の SSH 鍵 | 複数のマシンに到達する |
| Cloudflare Tunnel | マシン上に cloudflared | Cloudflare アカウント + ドメイン | 通常の SSH 鍵 | すでに Cloudflare を使っている |
| アウトバウンドの Connector | マシン上に小さなエージェント | Termalin アカウント | なし(短期証明書) | ブラウザーアクセス、VPS も VPN も不要 |
最初の 3 つは、ノート PC からの通常の ssh you@… を与えてくれます。最後の 1 つは、その代わりにブラウザーや AI エージェントからマシンに到達します。どれが合うかは、続きをお読みください。
オプション 1 — VPS 経由のリバース SSH トンネル
グローバル IP 付きの安い VPS をすでに借りているなら、プライベートなマシンがそこへダイヤルアウトし、自分の SSH ポートを逆向きに転送できます。NAT の内側のマシンで:
ssh -N -R 2222:localhost:22 tunnel@vps.example.com
これで VPS 上にポート 2222 が開き、そこへの接続がすべて自宅マシンのポート 22 へ戻されます。どこからでも、VPS を経由してマシンに着地します:
ssh -J tunnel@vps.example.com -p 2222 you@localhost
生の ssh -R はネットワークが最初につまずいた瞬間に落ちるので、systemd ユニットの下で autossh にラップし、再起動や切断をまたいで生かし続けます。-o ServerAliveInterval=30 -o ExitOnForwardFailure=yes も加えます。GatewayPorts の落とし穴や、なぜトンネルが既定で VPS のループバックにバインドされるのかを含む詳しい仕組みは、SSH リバーストンネルの解説にあります。トレードオフ:VPS を 1 台維持し、そこに到達できる長期の鍵をマシン上に置くことになります。そしてその VPS は、いまやあなたの攻撃対象領域の一部です。
オプション 2 — メッシュ VPN(Tailscale または WireGuard)
1 つのポートを公開する代わりに、両方のマシンを、両者だけが見えるプライベートネットワークに乗せます。Tailscale は手間の少ない選択肢です。NAT の内側のマシンで:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
ノート PC にも Tailscale を入れれば、両方が安定した 100.x.y.z アドレス(と MagicDNS 名)を得ます。あとは単に:
ssh you@home-box
まるで同じ LAN にいるかのように接続できます。マシンが公開インターネットにさらされることは一切ありません。sudo tailscale up --ssh なら SSH 認証まで引き受けてくれるので、そのための鍵を管理する必要もありません。WireGuard は同じ発想を手作業で組み上げたものです。調整を自前で運用し、ピアを手動で設定します。手間は増えますが、第三者の調整役はいません。NAS と数台の Pi がある自宅ラボなら、メッシュ VPN がたいてい答えのすべてで、自宅 NAS/サーバーのガイドでもまず手に取る既定の選択肢です。トレードオフ:アクセスが必要なすべてのデバイスがネットワークに参加する必要があり、それはインストールするクライアントと運用するアカウントを意味します。
オプション 3 — Cloudflare Tunnel
ドメインがすでに Cloudflare にあるなら、cloudflared が開放ポートなしのアウトバウンドトンネルを与えてくれます。マシンで:
cloudflared tunnel login
cloudflared tunnel create home
トンネルの設定でホスト名をトンネルにルーティングし、ローカルの sshd(ssh://localhost:22)に向けたうえで、cloudflared をサービスとして実行します。クライアント側では、~/.ssh/config(英語)の ProxyCommand を介して SSH が到達します:
Host ssh.example.com
ProxyCommand cloudflared access ssh --hostname %h
これで ssh you@ssh.example.com が Cloudflare のエッジを通ってマシンへ流れます。無料プランでまかなえます。トレードオフ:SSH を第三者を経由させ、Cloudflare アカウントと、そこでホストするドメインに依存することになります。すでにそうしているなら申し分なく、そうでなければ大げさです。
オプション 4 — アウトバウンドの Connector(VPS も VPN も不要)
上の 3 つの選択肢は、いずれも常駐するインフラ(VPS、VPN、または Cloudflare のドメイン)を求めます。Termalin の Connector はそれを 1 つのコマンドにまとめ、ローカルの ssh の代わりに、ブラウザー、Termalin アプリ、または AI エージェントからマシンに到達します。プライベートなサーバーでは、1 行で小さな静的エージェントがインストールされます(Linux の x86_64 と arm64):
curl -fsSL https://termal.in/tunnel-install.sh | sudo TERMALIN_TOKEN=<token> sh
エージェントは 1 本の WebSocket で Termalin へ外向きにダイヤルし、それを開いたまま保持します。ポートをリッスンすることは決してありません。Web クライアントでターミナルを開くと、リクエストはそのリンクを下っていき、エージェントは localhost 上のマシン自身の sshd に接続します。動かすのは不透明な SSH のバイト列だけなので、あなたの認証情報やセッションの平文を見ることはありません。登録(enrollment)により、マシンの sshd は Termalin の SSH 認証局を信頼するようになります。そのためログインには、サーバー上に居座る長期の秘密鍵ではなく、短期証明書を使います。これが、表の中で*マシン上に長期の鍵は残る?*の列が「なし」になっている、唯一の行です。
率直に言う注意点:マシンへの到達は Termalin のホスト型の側を通して行います。Web ターミナル、Termalin のデスクトップアプリと iOS アプリ(同じゲートウェイ経由で接続します)、または MCP サーバー越しの AI エージェントです。自分のマシンからの生の ssh コマンドではありません。そして Connector は有料プラン(またはトライアル)の一部です。ノート PC からの通常のターミナルが欲しいなら、オプション 1〜3 のほうが合っています。どのデバイスからでもブラウザーでアクセスしたい場合、あるいはグローバルアドレスも盗める鍵も持たないマシンでエージェントに作業させたい場合は、これがそのために作られた選択肢です。同じアウトバウンドの Connector は、開放ポートのないマシンのための軽量な監視とアラートも運びます。
どれを選ぶべきか
- すでに VPS を借りている: リバーストンネルがそれを再利用します。autossh の下で
ssh -Rを 1 本、それで完了です。 - 到達したいマシンが複数ある、または LAN のように感じさせたい: Tailscale のようなメッシュ VPN が最もよくスケールし、何も公開しません。
- ドメインが Cloudflare にある: 新しいベンダーを増やさずに済む、Cloudflare のトンネルが自然に合います。
- 常駐インフラをゼロにしたい、ブラウザーアクセスが欲しい、監督付きのエージェントアクセスが欲しい: サーバーに長期の鍵を残さない、アウトバウンドの Connector です。
4 つすべてに共通する、覚えておく価値のある原則が 1 つあります。スキャンされては困るマシンに、受信ポートを決して開かないこと。代わりに、そのマシンから外へ到達させるのです。この向きのたった 1 回の反転こそが、NAT の内側の SSH を安全にします。
Termalin は、保存できるトンネル、Web ターミナル、そしてプライベートサーバー向けのキーレスな Connector を備えた、無料のクロスプラットフォーム SSH クライアントです。ダウンロードするか、鍵を安全に扱う仕組みをご覧ください。