termal.in

← ブログ

ポート転送なしで NAT・CGNAT の内側のサーバーに SSH する

· Termalin Team sshtunnelingnetworkinghomelab

接続を受け付けられないマシンに 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マシン上に cloudflaredCloudflare アカウント + ドメイン通常の 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 クライアントです。ダウンロードするか、鍵を安全に扱う仕組みをご覧ください。

まずは 1 台のホストで試してみてください。

Termalin は、あなたとあなたのエージェントのための高速な SSH クライアントです。

無料プラン · Pro を 14 日間お試し · 料金