ドキュメント
クイックスタート + 機能・デバイスごとの解説(随時更新中)
ポートトンネリング
本記事では、パネルの「ポートトンネリング」機能——グローバル 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 を有効にしている場合、同じ接続が閉じられないと後続のリクエストがブロックされます。対象サービスはマルチスレッドにするか、接続が速やかに閉じられるようにしてください。
関連ドキュメント
ポートトンネリング vs ポート転送(どちらを選ぶか)
| ポートトンネリング(本記事) | ポート転送 | |
|---|---|---|
| 対象サーバー | グローバル IP なし(トンネルサーバー) | 独立したグローバル IP あり |
| 実現方法 | リバーストンネル | システムファイアウォール DNAT |
| 転送を行う位置 | パネルサーバー | 対象サーバーの自機 |
| Agent が必要 | はい | いいえ |
ひとことで:グローバル IP がなければトンネリング、あれば転送。