# ポート転送

ローカルポート転送を使うと、サーバーの向こう側にあるサービス（データベース、
ノートブック、開発用サーバーなど）に、あたかも手元にあるかのようにデバイスから
接続できます。

## ルールを追加する

エディタでホストを開き、**転送**タブに移動します。各ルールの内容は次のとおり
です。

- **ローカルポート** — デバイス側のポートです（1024 以上である必要があります。
  iOS のサンドボックスはそれ未満をバインドできません）。
- **リモートホスト** — SSH サーバーから見たアドレスです（既定は`localhost`）。
- **リモートポート**。
- 省略可能な**ラベル**。
- **接続時に自動で開始**。

プリセットには定番のものがそろっています。jupyter 8888、postgres 5432、mysql
3306、redis 6379、web 3000、web 8080 です。

1 つのホストの中でローカルポートを重複させることはできません。ルールの変更は、
すでに接続済みのホストにもその場で適用されます。

![ホストエディタの「転送」タブ。ローカルポート 8080 を localhost:18080 へ転送するルールが 1 つあり、dev server というラベルと有効化トグルが付いています。](https://bambouville.com/docs/assets/img/forwarding-rule.png)

*ホストエディタの「転送」タブに保存されたルール。有効化トグルと現在の状態が付いています。*


## 「トンネル」ページ

サイドバーの**トンネル**ページには、すべてのホストの転送ルールが集まり、ホスト
ごとにまとめられて、接続済み／未接続の状態とともに表示されます。各ルールには、
その状態（例:「待ち受け中 · アクティブ 0」）、リアルタイムの ↑/↓ のバイト数、
有効化トグル、そして HTTP 系のポートを Safari で開くボタンが並びます。

セッションの中では、トップバーの **⇄ N** のチップが、そのホストについて同じ状態を
示します。

[iPhone](https://bambouville.com/docs/ja/iphone/) では、トンネルはセッションのトップバーから確認できますが、
ルールの作成と編集は iPad で行います。

![「トンネル」ページ。8080 を localhost:18080 へ転送する dev server というラベルのルールが 1 つ、接続済みのホストの下にまとめて表示され、待ち受け中の状態と有効化トグルが見えています。](https://bambouville.com/docs/assets/img/tunnels-page.png)

*すべてのホストのすべてのルールを、ホストごとにまとめて表示します。それぞれに現在の状態とトグルが付いています。*


## トンネルを使う

ルールが待ち受けを始めたら、デバイス上の任意のアプリを`localhost:<local port>`に
向けてください。開発用サーバーならブラウザ、データベースなら Postgres クライアント
といった具合です。通信は SSH 接続の中を通ってサーバーに届き、サーバーがそこから
リモートの host:port へ接続します。

## mosh と転送

転送ルールは SSH 接続に相乗りします。**mosh** のトランスポートでは次のように
なります。

- **自動 tmux** と**名前付き tmux** の起動モードは tmux 用の SSH サイドチャネルを
  保持するため、転送はそこを通って機能します。
- **カスタム**の起動モードには転送を通せる SSH 接続がないため、ルールの追加は
  無効になります。起動モードを自動 tmux か名前付き tmux に切り替えてください。

## 制限

- ローカルポートは **≥ 1024** である必要があります（iOS のサンドボックス）。
- 1 つのホストの中で、ローカルポートを重複させることはできません。
- 転送はローカルからリモートへの方向のみで、リモート (-R) 転送はありません。
