# 分散デプロイ

自宅にスマートフォンを置いたまま、外出先から使用したいという状況に遭遇することがあるかもしれません。FIRERPAに内蔵されているFrpまたはOpenVPNクライアントを利用することで、分散デプロイを実現し、どこからでも分散デプロイされたデバイスに接続できます。これら2つのソリューションでは、パブリックIPを持つサーバーが必要であり、サーバー側の関連ソフトウェアを設定する必要があります。FrpおよびOpenVPNサーバーのデプロイ方法については、後続のドキュメントで説明します。

```{danger}
本章の操作は、お使いのスマートフォンをパブリックネットワークに公開し、セキュリティリスクを高める可能性があります。必ず注意深くお読みください。
```

本章では、ファイアウォールのポートを開閉するなどの基本的な操作については触れません。これらの設定については、お客様が理解し、要件に従って完了していることを前提とします。また、FrpおよびOpenVPNについての基本的な知識をお持ちであることも前提とします。これら2つのサーバーのデプロイ方法については、本文書および後続の章で詳しく説明します。ご自身でデプロイする場合は、OpenVPNを使用してネットワークを構築する方法を強く推奨します。


## FIRERPA Hub経由

また、[firerpa/hub](https://github.com/firerpa/hub) + [firerpa/hub-bridge](https://github.com/firerpa/hub-bridge) をご自身でデプロイして、デバイス間のP2Pアクセスを実現することも可能です。具体的な操作については、プロジェクトのドキュメントを参照してください。

## Frpによる内部ポートへの転送

まず、[fatedier/frp](https://github.com/fatedier/frp) のサーバープログラムをダウンロードし、厳密に以下のコマンドを使用して起動する必要があります。ポートとトークンは適宜変更可能ですが、frpsのバージョンは v0.45.0 以上が必要です。

```{danger}
パブリックネットワークへの転送は非常に危険な行為です。IPポートが隠されているから安全だと安易に考えず、必ずサービスの証明書認証を有効にしてください！
```

```bash
frps --token lamda --bind_addr 0.0.0.0 --bind_port 6009 --proxy_bind_addr 127.0.0.1 --allow_ports 10000-15000
```

コマンドに基づき、`properties.local` の設定項目を以下のように記述します。

```ini
fwd.host=サーバーのパブリックIPアドレス
fwd.port=6009

fwd.rport=転送先ポート（allow_portsの範囲内である必要があります）
fwd.token=lamda

fwd.protocol=tcp
fwd.enable=true
```

上記の設定を `properties.local` に追記または書き込み、FIRERPAサービスを再起動してください。


## Frpによるパブリックポートへの転送

どこからでもデバイスに接続したい場合でも、セキュリティ上の理由からこの方法は推奨しません。どうしても必要な場合は、OpenVPN関連機能を使用して、デバイスとPCを同じネットワークセグメントに配置してアクセスする方法をお勧めします。

```{danger}
パブリックネットワークへの転送は非常に危険な行為です。IPポートが隠されているから安全だと安易に考えず、必ずサービスの証明書認証を有効にしてください！
```

それでも上記frpの方法でどこからでもアクセスしたい場合は、まずFIRERPAサービスがサービス証明書を使用して起動されていることを確認し、上記のfrps起動コマンドの `--proxy_bind_addr 127.0.0.1` を `--proxy_bind_addr 0.0.0.0` に変更してください。これにより、上記の例の `12345` ポートが直接パブリックネットワークにバインドされます。FIRERPAをサービス証明書なしで起動した場合、誰でもアクセスできるようになり、これは非常に危険です。データが悪意のあるアクセスによって破壊される可能性があることを覚悟してください。

## Frpで転送されたデバイスへの接続

上記のドキュメントでは転送ポートをサーバーの `127.0.0.1` にバインドしているため、以下の内容はfrpsがデプロイされているパブリックサーバー自体で検証する必要があります。`fwd.rport` が `12345` ポートであると仮定し、以下にPythonライブラリを使用してデバイスに接続する方法を示します。

```python
from lamda.client import *
d = Device("127.0.0.1", port=12345)
```

また、サーバー上のブラウザで `http?s://127.0.0.1:12345` を開くことで、そのデバイスのリモートデスクトップにアクセスすることもできます。


## OpenVPNによるネットワーク構築

OpenVPNサーバーのデプロイに関する章を参照して、デバイスをOpenVPNネットワークに接続する方法を確認してください。

## OpenVPNで構築されたネットワーク上のデバイスへの接続

OpenVPNでネットワークを構築した後のデバイスの利用方法は、通常の使用方法と変わりありません。ご自身のPCもこのOpenVPNネットワークに参加させるだけで、デバイスのOpenVPNプライベートアドレスを通じて直接アクセスできます。OpenVPNの公式サイト [openvpn.net/client](https://openvpn.net/client/) から `OpenVPN Connect` クライアントをダウンロードして、同じネットワークに接続できます。