ドキュメント

クイックスタート + 機能・デバイスごとの解説(随時更新中)

SSH Everywhere のアーキテクチャと技術スタック

> 本記事では、SSH Everywhere の全体アーキテクチャ、採用しているプロトコルと技術スタックを分かりやすい言葉で説明します。「いったいどのように動作しているのか」を知りたい読者向けで、技術的な前提知識がなくても読み進められます。

---

一文でプロジェクト全体を理解する

SSH Everywhere はオールインワンのサーバー/デバイス遠隔運用パネルで、1Panel / 宝塔(BT Panel)に相当します。中核となる能力は次のとおりです:あなたのデバイスがネットワークのどこにあっても——グローバル IP があっても、グローバル IP がなくても(NAT 配下)、あるいは Android スマホであっても——この 1 つのパネルから SSH を使うように管理できます。

パネル自体はグローバル IP を持つサーバーにデプロイします(0.0.0.0:5501 をリッスン)。ブラウザからパネルへアクセスし、パネルが各対象デバイスにさまざまな「接続方式」で到達します。

---

全体アーキテクチャ(図 1 枚で理解)

┌─────────────────────────────────────────────────────────────┐
│  ブラウザフロントエンド(SPA、デスクトップ OS を模倣)             │
│  デスクトップウィンドウ · タスクバー · スタートメニュー · カード型ダッシュボード │
│  · 実ターミナル · アイコンライブラリ · 純粋な素の JS(フレームワークなし) │
└──────────────────────────┬──────────────────────────────────┘
                           │ HTTP REST + SocketIO
┌──────────────────────────┴──────────────────────────────────┐
│  パネルバックエンド(Flask + Flask-SocketIO、Python)           │
│  メインプログラム · リバーストンネルサーバー · SocketIO サーバー · ファイル転送 │
│  クラッシュ保護 · サイト管理 · バックアップ · SQLite データベース    │
└───┬───────────────┬──────────────────┬──────────────────────┘
    │ SSH           │ リバーストンネル    │ SocketIO
    │ 直結/トンネル経由 │ (0.0.0.0:4433)   │ (HTTP 経由)
    ▼                ▼                  ▼
┌────────┐    ┌──────────────┐    ┌─────────────────┐
│ グローバル│    │ グローバル IP  │    │ Android スマホ    │
│ IP サーバー│    │ なし Linux /  │    │ (Termux)        │
│        │    │ NAS/ラズパイ等 │    │                 │
└────────┘    └──────────────┘    └─────────────────┘

---

4 つの接続方式(プロトコル)

SSH Everywhere は内部的に 4 つのプロトコルを使い、それぞれ役割を分担して異なる種類のデバイスに対応します。

1. SSH —— 主力チャネル

用途:すべての「通常の Linux サーバー」を管理する中核機能。

  • システム管理(概要、プロセス、スケジュールタスク、ファイアウォール、Docker、サイト、ミラー切り替え、クラッシュ保護)
  • ターミナル(対話的 shell)
  • ファイル管理(アップロード/ダウンロード/編集/圧縮)
  • ヘルスチェック(CPU/メモリ/ディスク/温度)
  • コマンド実行

接続方式:

  • グローバル IP あり:パネルが host:port に直結
  • グローバル IP なし:パネルがまずリバーストンネルでローカルプロキシポートを開き、そこへ SSH 接続

> 言い換えると、リバーストンネルの本質は「SSH をグローバル IP を持たないデバイスまで届けること」であり、最終的な着地プロトコルは SSH です。

2. リバーストンネルプロトコル —— トンネルチャネル

用途:「グローバル IP を持たないデバイス」をパネルから到達可能にします。デバイス側が能動的に「外へ」接続し、逆方向の TCP 長接続を確立します。パネルはこのトンネルを通じてコマンドを送信し、ポートを転送します。

特徴:TCP 長接続 + 暗号化(AES-256-GCM)、サーバー側は 0.0.0.0:4433 をリッスン。

典型的なシナリオ:

  • グローバル IP を持たない Linux サーバーの SSH トンネル運用(トンネル内でさらに SSH を実行)
  • ポートトンネリング:デバイス上のサービスポート(例 8090)をパネルのグローバルポートにマッピング

> 混同しやすい概念:ポート転送 vs ポートトンネリング

>

> | | ポート転送 | ポートトンネリング |

> |---|---|---|

> | 対象デバイス | グローバル IP を持つサーバー | グローバル IP を持たないデバイス |

> | 実現方法 | システムファイアウォールの DNAT、対象サーバー自身で実施 | リバーストンネル経由 |

> | データフロー | アクセス元 → 対象のグローバル IP → 対象ポート | アクセス元 → パネルのグローバルポート → リバーストンネル → デバイスポート |

> | デバイスのオンライン依存 | 依存しない | 依存する(デバイスは Agent をオンラインに保つ必要あり) |

>

> 一言で言えば:「転送」はグローバル IP を持つサーバー向け、「トンネリング」はグローバル IP を持たないデバイス向けです。

3. SocketIO —— Android スマホ専用チャネル

用途:Android スマホ上の Termux を管理します。スマホのモバイルネットワークは NAT の切り替えが頻繁で SSH が不安定なため、SocketIO による安定したロングポーリングチャネルを採用しています(実機で検証済みの成熟した方式)。

スマホ上で動作する Agent が SocketIO 経由で提供するもの:

  • システム管理(概要/プロセス/スケジュールタスク)
  • ターミナル(PTY ブリッジ)
  • ファイル管理
  • ヘルス監視(30 秒ごとに報告:負荷/メモリ/ディスク/バッテリー/温度)

> これはプロジェクト内で唯一「SSH を通らない」チャネルです——Android スマホは sshd を使わず、SocketIO の長接続を使うためです。

4. HTTP REST —— フロントエンドとバックエンドの間

ブラウザフロントエンドは REST API でパネルバックエンドを呼び出し、同時に SocketIO でターミナルなどのリアルタイム双方向通信を行います。

---

3 種類のデバイスの到達経路一覧

デバイス種別接続方式最終的な着地プロトコル説明
グローバル IP を持つ Linux サーバーパネルが直結SSH最も直接的なシナリオ
グローバル IP を持たない Linux サーバー(NAS/ラズパイ等)リバーストンネルでプロキシを作成 → SSHSSH(トンネル経由で運搬)トンネルは SSH の「運び屋」
Android スマホ(Termux)SocketIO ロングポーリングSocketIO(唯一 SSH を使わない)スマホ専用の安定チャネル

---

データの保存

  • SQLite データベース(data/ssheverywhere.db):サーバーカード、ポート転送、トンネル記録、ユーザー、タスクなど。
  • ファイルシステム:バックアップファイル、トンネル鍵、静的リソース。

---

デプロイ形態

  • パネル:systemd サービス ssh-everywhere.service、0.0.0.0:5501 をリッスン。
  • リバーストンネル:0.0.0.0:4433 をリッスン。
  • 対象デバイス側の Agent はサービスとして常駐(Linux は systemd / Termux は termux-services)。

---

プロジェクト名「SSH Everywhere」について

プロジェクト名は SSH Everywhere で、「SSH のように、どこからでも管理できる」という意味です。SSH はプロジェクトにおける圧倒的な主力の接続方式であり、Android スマホという 1 つのサブシナリオを除き、その他すべての機能(Linux サーバー管理、トンネル運用、ファイル転送、ヘルスチェック)は最終的に SSH に帰着します。そしてリバーストンネルの本質もまた「SSH をどこへでも届けること」です。したがって「SSH Everywhere」という名称は、プロジェクトの中核能力を正確に表しています。