続・インバウンドポートを全閉したAWSのサーバに接続する方法 〜P2P編〜

#はじめに
この記事はremote.itについて私が書いた以下の内容の続編です。是非事前にご覧ください。
> [これは魔法か？！ インバウンドポートを全閉したAWSのサーバに接続する方法](https://qiita.com/tkhmhiroc/items/0724d4b1d6bc688aa474)

#なぜP2Pか？
先の記事の最後に「実は、今回紹介した接続方法は、remote.itがクラウドにホストしているProxyサーバ経由で接続しています。」と書きました。この記事に対して多くの好意的な反響をいただいた反面、remote.itがホストしているサーバを介して接続されることによる不安やリスクについてのコメントも寄せられました。
そこで今回は接続がremote.itのサーバを経由しない、P2P接続の方法をご紹介します。

:::note info
2021.9.30 追記
これ以降の手順を、最新のデスクトップアプリを使う手順に更新し、画面なども差し替えました。
:::

#remote.itのデスクトップアプリケーションのインストール
今回はremote.itデスクトップアプリを使います。
まず、下記のremote.itのダウンロードサイトの「Desktop Applications」から、ソフトウェアをダウンロードします。

> [Download - remote.it](https://remote.it/download/)

dmgファイルを展開し、アプリケーションをインストールして実行します。
（Windows版はexeファイルを実行してインストールします。）
![スクリーンショット 2021-09-30 14.06.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/c2432efb-daa3-b1c7-b701-2e071ff3f089.png)


サインイン画面が表示されたら、remote.itアカウントでサインインします。
![スクリーンショット 2021-09-28 13.59.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/67ea96e6-7e0e-079c-fc73-06b0c0fe1f71.png)

初回は必要なコマンドラインツールのインストール画面が表示されます。
「INSTALL AGENT」をクリックします。インストール中にOSの権限が求められたら認証します。
![スクリーンショット 2021-09-28 14.01.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/9ec19886-18b2-0b64-890c-d2ce10651449.png)


#P2P接続の開始
アプリケーションにサインインすると、アカウントに対して登録されているデバイスのリスト（Webポータルと同じもの）が表示されます。
[前回](https://qiita.com/tkhmhiroc/item/0724d4b1d6bc688aa474)登録した「demo-ubuntu20」がありますね。
![スクリーンショット 2021-09-30 14.02.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/12bab497-a166-c827-1df3-9e22e4275944.png)


デバイス名をクリックすると詳細画面に移り、登録されているサービス（アプリケーション）のリストが展開されます。
![スクリーンショット 2021-09-30 14.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/b8cc57ed-8336-2117-0832-127f356e22f8.png)


接続したいサービスをクリックし、右下の「ADD TO NETWORK」ボタンをクリックします。
![スクリーンショット 2021-09-30 14.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/5847e5b2-8e50-2437-ccd1-69db4aa94e85.png)



接続が待機状態になるとボタンが水色に変わります。また、このサービスへの接続が `demo-ubuntu20-http.at.remote.it` のポート`33000`で待機していることが分かります。
![スクリーンショット 2021-09-30 14.03.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/7ac4df0a-39cc-6e01-ef2b-aef7a2bf0fe3.png)


もう一つのサービスにも接続を行いました。こちらは `demo-ubuntu20-http.at.remote.it` のポート`33001`で待機しています。
![スクリーンショット 2021-09-30 14.03.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/3b0bcfd8-a3df-806c-7fc1-aab023962ccf.png)


なお、`demo-ubuntu20-http.at.remote.it` は何かというと、ローカルホスト（localhost=127.0.0.1)を指しています。試しに `ping` を打ってみると、`127.0.0.1` から応答があることが分かります。つまり、remote.itの接続はローカルホストでリスニングしていることになります。

```console
$ ping demo-ubuntu20-http.at.remote.it
```
![スクリーンショット 2021-09-28 14.04.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/ec0ea510-c0f2-f719-d242-8b480ee3a091.png)

実際にローカルホスト（127.0.0.1）でLISTENしているポートを確認してみます。

```console
$ netstat -an |grep 127.0.0.1 |grep LISTEN
```

確かに`30000`と`30001`でそれぞれ待ち受けているようです。
![スクリーンショット 2021-09-28 14.05.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/fb7c6809-bdf2-f3f8-1c5e-e360e289180e.png)


#アプリケーションからP2P接続を使ってアクセスする
それでは実際にアプリケーションから接続します。
今回、`demo-ubuntu20-ssh.at.remote.it:30001`　がubuntuサーバのsshサービスでしたので、ターミナルからsshコマンドで　`demo-ubuntu20-ssh.at.remote.it:30001`　に対して接続してみます。
![スクリーンショット 2021-09-28 14.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/e9ec64ea-5b1c-e071-ca83-9c9c6c5ab3f9.png)


無事接続できました。よく見ると接続元が `127.0.0.1` になっていることが分かります。（初回接続時は接続が成立するまで少し待ちます。）
![スクリーンショット 2021-09-28 14.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/d5306e94-372f-121a-f624-aafba0dcaa9f.png)

ちなみに、接続先を `localhost:30001` にしても同じターゲットにアクセスされます。
![スクリーンショット 2021-09-28 14.07.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/aef4269a-36de-78d0-8aa8-313a70330ffb.png)



同様に、`demo-ubuntu20-http.at.remote.it:30000` はubuntuサーバのWebサービスですので、ブラウザから `demo-ubuntu20-http.at.remote.it:30000` に対してアクセスするとubuntuサーバのWebコンテンツ（今回はapacheのデフォルトページ）が表示されました。
![スクリーンショット 2021-09-28 14.08.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/ce913cce-2e33-f37e-d2da-fd0c71c278f9.png)

こちらも同様に、 `localhost:30000` にアクセスしても同じコンテンツが表示されます。
![スクリーンショット 2021-09-28 14.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/e859b688-9594-0c14-a4da-7804db0c86a4.png)
 

#まとめ
接続元側にもremote.itのクライアントを用意することで、自分のアカウントに登録されている接続先デバイスに対して簡単にP2P接続を行うことができます。
今回はAWS上のHTTPとSSHの例を紹介しましたが、一般的なTCP/IPの作法に則ったアプリ（IPアドレスとポート番号で会話できるアプリ）であれば、**プロトコルやターゲットのロケーション（回線の種別）は問いません。**VPNのようにインターネットをプライベートなネットワークとして使える一方で、**VPNのようにインターネットに対して入り口を用意する必要がありません。**

前回の記事ではさも魔法かのように書きましたが、実際はもちろんカラクリがありremote.itはいわゆるNAT越えを実現するサービスです。そのため、双方のネットワーク環境によっては今回紹介したP2P接続が成功しない可能性があることにご注意ください。

__*2021.9.28 追記*__
現在のデスクトップアプリで接続した場合、実際にアプリケーションからローカルホストへアクセスしたタイミングでP2P接続を開始します。また、既定の設定では、P2P接続が成功しない場合に自動的にProxy接続にフェイルオーバーされます。（デスクトップアプリを使うことで、Proxy接続もローカルホストアドレスで待ち受けることができることを意味します。）
実際にP2P接続、Proxy接続のどちらで接続されているかは、接続後の詳細画面で確認することができます。
![スクリーンショット 2021-09-30 14.05.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/04f63881-cdde-e3aa-db17-90d160b2a4cf.png)