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


はじめに

この記事はremote.itについて私が書いた以下の内容の続編です。是非事前にご覧ください。

これは魔法か?! インバウンドポートを全閉したAWSのサーバに接続する方法

なぜP2Pか?

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

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

remote.itのデスクトップアプリケーションのインストール

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

Download - remote.it

dmgファイルを展開し、アプリケーションをインストールして実行します。
(Windows版はexeファイルを実行してインストールします。)

サインイン画面が表示されたら、remote.itアカウントでサインインします。

初回は必要なコマンドラインツールのインストール画面が表示されます。
「INSTALL AGENT」をクリックします。インストール中にOSの権限が求められたら認証します。

P2P接続の開始

アプリケーションにサインインすると、アカウントに対して登録されているデバイスのリスト(Webポータルと同じもの)が表示されます。
前回登録した「demo-ubuntu20」がありますね。

デバイス名をクリックすると詳細画面に移り、登録されているサービス(アプリケーション)のリストが展開されます。

接続したいサービスをクリックし、右下の「ADD TO NETWORK」ボタンをクリックします。

接続が待機状態になるとボタンが水色に変わります。また、このサービスへの接続が demo-ubuntu20-http.at.remote.it のポート33000で待機していることが分かります。

もう一つのサービスにも接続を行いました。こちらは demo-ubuntu20-http.at.remote.it のポート33001で待機しています。

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

$ ping demo-ubuntu20-http.at.remote.it

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

$ netstat -an |grep 127.0.0.1 |grep LISTEN

確かに3000030001でそれぞれ待ち受けているようです。

アプリケーションからP2P接続を使ってアクセスする

それでは実際にアプリケーションから接続します。
今回、demo-ubuntu20-ssh.at.remote.it:30001 がubuntuサーバのsshサービスでしたので、ターミナルからsshコマンドで demo-ubuntu20-ssh.at.remote.it:30001 に対して接続してみます。

無事接続できました。よく見ると接続元が 127.0.0.1 になっていることが分かります。(初回接続時は接続が成立するまで少し待ちます。)

ちなみに、接続先を localhost:30001 にしても同じターゲットにアクセスされます。

同様に、demo-ubuntu20-http.at.remote.it:30000 はubuntuサーバのWebサービスですので、ブラウザから demo-ubuntu20-http.at.remote.it:30000 に対してアクセスするとubuntuサーバのWebコンテンツ(今回はapacheのデフォルトページ)が表示されました。

こちらも同様に、 localhost:30000 にアクセスしても同じコンテンツが表示されます。

まとめ

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

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

2021.9.28 追記
現在のデスクトップアプリで接続した場合、実際にアプリケーションからローカルホストへアクセスしたタイミングでP2P接続を開始します。また、既定の設定では、P2P接続が成功しない場合に自動的にProxy接続にフェイルオーバーされます。(デスクトップアプリを使うことで、Proxy接続もローカルホストアドレスで待ち受けることができることを意味します。)
実際にP2P接続、Proxy接続のどちらで接続されているかは、接続後の詳細画面で確認することができます。