ドキュメント

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

ポートトンネリング

本記事では、パネルの「ポートトンネリング」機能——グローバル IP を持たないトンネルサーバー上のアプリケーションポートを、パネルサーバーのグローバルポートにマッピングし、外部ユーザーがアクセスできるようにする機能——について説明します。

ひとことで理解

あなたのサーバーが社内ネットワークに隠れていて(グローバル IP なし)、その上でサイトやアプリが動いていると、外部からはアクセスできません。ポートトンネリングは「パネルサーバーにグローバルポートを開き、外部からのアクセスを暗号化トンネルでこの社内サーバーのアプリケーションポートへ運ぶ」ものです。結果として、外部の人が パネルサーバーIP:ポート にアクセスすると、あなたの社内サーバー上のアプリにアクセスしたのと同じになります。

機能概要

「トンネル運用」で接続したグローバル IP を持たないサーバーでは、その上のアプリ(Navidrome の音楽、Nextcloud のクラウドストレージ、Memos のノートなど)が外部からアクセスできません。ポートトンネリングは、これらのアプリケーションポートをパネルサーバー(グローバル IP あり)のポートにマッピングし、外部ユーザーが「パネルサーバー IP:ポート」でアクセスできるようにします。

適用シーン

  • トンネルサーバー上で Web アプリを動かしていて、外部からアクセスさせたい
  • 社内デバイスのサービスをグローバルに公開したい
  • グローバル IP を持たないデバイス上のサイト、API、パネルにグローバルの入口を提供したい

仕組み(データの流れ)

外部ユーザー → パネルサーバーのグローバルポート (例 :9117) → 暗号化トンネル → トンネルサーバーのアプリケーションポート (例 :9117)

外部トラフィックはまずパネルサーバー(唯一グローバル IP を持つ場所)に到達し、次に暗号化されたリバーストンネルを通って社内デバイスへ送られ、最後にデバイス上で実際に動作しているアプリケーションポートに届きます。

統一チャネル(すべてのデバイス、手動での選択は不要):

デバイスタイプ転送チャネル説明
Linux サーバー(グローバル IP なし)4433 リバーストンネル(AES-256-GCM 暗号化)ネイティブな TCP バイトストリームで高速かつ安定、大量の同時接続に対応
Android/Termux デバイス4433 リバーストンネル(AES-256-GCM 暗号化)Linux デバイスと同じ暗号化トンネルを通り、安定していて余分なオーバーヘッドなし

パネルは統一して 4433 リバーストンネルを使うため、トンネル作成時に下位のチャネルを気にする必要も、手動で選択する必要もありません。

> 補足:Android/Termux デバイスのシステム管理(コマンド実行、ターミナル、ファイル)は SocketIO の安定したチャネルを通りますが、ポートトンネリングは統一して 4433 リバーストンネルを通ります。両者はそれぞれの役割を担い、互いに干渉しません。

使い方

1. 対象デバイスが「トンネル運用」で接続済み(Agent がオンライン)であることを確認します

2. 「ポートトンネリング」を開き、「トンネルを追加」をクリックします

3. トンネルサーバー(Agent)を選択し、以下を入力します:

  • 待ち受けポート:パネルサーバーのグローバルポート(外部アクセス用)、例 9117
  • 対象ポート:トンネルサーバー上のアプリケーションポート、例 8080

4. 作成後、外部から http://パネルサーバーIP:待ち受けポート にアクセスできます

例

パネルサーバーのグローバル IP が 203.0.113.10 で、社内の Raspberry Pi 上で Navidrome(待ち受け 4533)が動いているとします:

  • 待ち受けポートに 4533 を入力
  • 対象ポートに 4533 を入力
  • 作成後、外部ユーザーは http://203.0.113.10:4533 にアクセスすると Raspberry Pi 上の Navidrome を開けます

リソース上限

制限値
Agent あたりの最大転送チャネル32 本
パネル全体の最大 Agent 数64 個

超過すると新しい接続は自動的に拒否されますが、稼働中のトンネルには影響しません。

注意事項

1. クラウドファイアウォール:パネルサーバーのクラウドファイアウォール/セキュリティグループで対応する待ち受けポートを許可しないと、外部からアクセスできません。

2. Agent のバージョン:SSH 以外のポート(22 以外)の転送には、トンネルサーバーに新しいバージョンの Agent がインストールされている必要があります(旧版は 22 番ポートの転送のみ対応)。他のポートを転送する場合は、Agent を再インストールしてください。

3. Agent のオンライン状態:トンネルは Agent がオンラインであることに依存します。Agent がオフラインになるとトンネルは中断され、再接続後に自動的に復旧します。

4. パネル再起動時の自動復旧:パネルサービスの再起動後、トンネルは自動的に復旧します(Agent の再接続時にトリガーされます)。

5. Android の対象サービスは同時接続に対応している必要あり:Android 上でトンネルされる対象サービス(python3 -m http.server など)がシングルスレッドで keep-alive を有効にしている場合、同じ接続が閉じられないと後続のリクエストがブロックされます。対象サービスはマルチスレッドにするか、接続が速やかに閉じられるようにしてください。

関連ドキュメント

  • トンネル運用 — まずグローバル IP のないデバイスをパネルに接続する
  • ポート転送 — グローバル IP を持つサーバーの従来型ポート転送(両者の違いは下記)

ポートトンネリング vs ポート転送(どちらを選ぶか)

ポートトンネリング(本記事)ポート転送
対象サーバーグローバル IP なし(トンネルサーバー)独立したグローバル IP あり
実現方法リバーストンネルシステムファイアウォール DNAT
転送を行う位置パネルサーバー対象サーバーの自機
Agent が必要はいいいえ

ひとことで:グローバル IP がなければトンネリング、あれば転送。