Blog

リモート.イットコネクション - どのように作られているのですか?

2022年12月22日

リモート.Itコネクション - どのように作られるのですか?

以下の表1のラダーダイアグラムは、基本的なRemote.It接続に対応するものです。この例のラダーダイアグラムは、ssh接続を行う暗号化されたRemote.It P2P UDPトンネルの確立に対応するものです。このラダーダイアグラムは、接続中のエンドポイント間のUDPデータグラムトラフィックを示しています。

このラダー図は、Remote.Itソフトウェアの特別なインスツルメンテッド・バージョンを使用して、発信元クライアント(私の自宅ラップトップ)のパケットトレースからWiresharkで直接生成されたものです。Remote.Itのネットワークトラフィックは暗号化されているため、データ、パケットタイプ、メッセージ、パケットフローはWiresharkやパケット検査技術では見ることができません。

ここでは、2つのデバイス間でデータが流れ始めるまでの、接続の開始点のみを示しています。接続元のクライアントのローカルアドレスは、10.0.1.29(自宅のノートパソコン)です。接続には、Remote.ItフロントエンドサーバーとRemote.Itチャットサーバーの2つのサーバーが関与しています。Remote.Itのフロントエンドサーバーのアドレスは、174.36.235.146です。Remote.Itのチャットサーバーアドレスは、209.235.201.53です。

対象機器の外部IPアドレスは73.15.2.31(NATルータ越しの事務所のRaspberryPi)でUDPポートは55438です。これは、NATルータのIPアドレスとRaspberryPiの外部IPアドレスです。ラダー図は、発信元クライアント(自宅のラップトップ)上のWiresharkによって生成されているので、WiresharkがRaspberryPiの内部IPアドレスを知る術はありません。Remote.ItだけがRaspberryPiの内部IPアドレスである10.0.0.123を知っています。ラダー図にもRaspberryPiの内部IPアドレス10.0.0.123が表示されていますが、これについては追って説明します。

下のラダー図では、矢印は括弧内に対応するUDPポート番号を持っているため、ラダー図の慣習に従って、矢印の頭は終点であるラダー側に到達せず、接触していませんが、これはWiresharkがASCII版のラダー図(またはWiresharkではフローグラフと呼ばれています)を生成するための方法です。例えば、発信元デバイス(10.0.1.29の私のラップトップ)との間のトラフィックはUDPポート番号33013で示されていますが、どのポート番号でも使用でき、この場合、発信元デバイスでRemote.Itソフトウェアを起動するときに指定することが可能です。同様に、Remote.Itフロントエンドサーバー(174.36.235.146)のトラフィックはUDPポート番号5959に、Remote.Itチャットサーバー(209.235.201.53)のトラフィックはUDPポート番号5963に、RaspberryPi(外部アドレス73.15.2.31)はUDPポート番号55438に表示されることが示されていることが確認できます。

今まで発信側のデバイス(私のノートパソコン)を発信側クライアントと呼んでいたことにお気づきでしょうか。これは、私がRemote.ItのユーザーとしてRemote.Itの接続を開始し、remote.itのユーザーである私のRemote.Itログインを使用してRemote.Itで認証しているためです。デバイス自身が接続を開始している場合、接続元を(接続元クライアントではなく)接続元デバイスと呼びます。Remote.Itはデバイス間の接続を行うことができ、その場合、ユーザーログインを伴わない真のデバイス間接続を行うことができます。この場合でも、オフィスにあるRaspberryPiはターゲットデバイスと呼ばれます。

下のラダー図では、最初に交換される4つのメッセージは、認証プロセスの例の一部です。リモート.Itは、認証の実行方法について柔軟性があります。例えば、OAuthまたはOAuth 2.0を使用することができます。認証がどのように使用されるかを説明するために、簡単な例を示しました。認証は、リモート.Itサーバーに対する発信元クライアント(または発信元デバイス)としてのユーザーの識別を確認するために使用されます。認証は、Remote.Itサーバが生成してクライアントに送信するnonce(一回限りの乱数)と、発信側クライアントとRemote.Itサーバが共有する秘密(またはパスワード)を受け取り、ハッシュを生成する。このハッシュをリモート.Itサーバーに送信して認証を受け、送信されたハッシュがリモート.Itサーバーが生成したハッシュと一致すれば、認証に成功する。認証に成功すると、共有秘密鍵、セッション鍵の暗号化、サーバーとクライアントの暗号化のための鍵が生成されるようになる。鍵の生成と交換の詳細については、以下に説明する(すべてではない)。認証トラフィックは、以下のメッセージの説明でAUとタグ付けされている。鍵が交換されると、すべての暗号化されたメッセージのトラフィックは、以下のメッセージの説明でE1およびE2というタグで示される。E1 は暗号化されたサーバートラフィックを示すのに使われる。E2 は、デバイス間の暗号化された P2P トラフィックを示すために使用されます。E1 と E2 は、別々の鍵と別々の暗号化機構を使用します。

下のラダー図において、REQUEST_AUTH_MESSAGEなどのメッセージは、UDPデータグラムに含まれるRemote.It CHATプロトコルのメッセージです。Remote.It CHATプロトコルは、Remote.Itが機器を接続するために使用する基本的なプロトコルです。各Remote.It CHATプロトコルメッセージには、パケット型があります。この例のトレースでは、私が書いたカスタムLua WiresharkディセクタによってRemote.It CHATプロトコルメッセージタイプがデコードされており、ラダー図にメッセージタイプが表示されているのがその理由です。Remote.Itのトラフィックは暗号化されているため、この例で使用した特別バージョンのRemote.Itデバイスソフトウェアがなければ通常見ることができないことを再度強調しておきます。

下のラダー図では、接続開始からの経過時間(秒)がラダー図の左側に表示されています。接続の開始とは、この簡単な例では、接続元のクライアント(10.0.1.29の私のノートパソコン)でRemote.Itソフトウェアが起動することを指します。

ここで理解すべき重要なコマンドは2つあります。sshw.16.shスクリプトは、私が所有し、接続する権利を持っているRaspberryPiを、私が「B2 RPi3 v1 ssh」と名付けたRemote.Itのサービスとして、既知のユーザーと既知のデバイスでRemote.Itソフトウェアを起動させるものです。このサービスは、Remote.Itに登録したsshタイプで、ssh接続に使用するため、Remote.Itに知られています。RaspberryPiにユーザー "pi "として接続するように要求しています。これは、Remote.ItによってP2Pトンネルが確立され、そのトンネルを使ったssh接続が可能になったことを意味します。次のコマンドは、リモートのRaspberryPiからRemote.Itの接続トンネルを経由してsshで送られてくるパスワードのプロンプトを表示するものです。このプロンプトはまるで 127.0.0.1 か localhost アドレスに接続されているかのようです。Remote.ItソフトウェアがTCP接続を終了し、別のlocalhost接続を使用してTCPデータをホストに渡すため、localhostアドレスが得られます。ローカルホストアドレスとローカルホストインターフェースを使用すると、ローカルホスト接続のみを許可する必要があるため、ホストを外部から完全に隠蔽または隠蔽することができます。これは、Remote.It システムの非常に重要な機能です。

以下のラダー図では、Remote.It 接続のプロセスは、確立された Remote.It 接続上でデータが流れるところまでが示されています。完全な Remote.It 接続セッションでは、 ssh が Remote.It 接続上でデータを転送する際に、 TUNNEL_DATA_MESSAGE と TUNNEL_ACK_MESSAGE の交換がさらに何度か発生します。最後に、接続が終了すると、いくつかのメッセージが交換されます。例えば、RaspberryPi のシステムプロンプトで "exit" と入力することができます。

Remote.It 表1 - ラダーダイアグラム

表1.基本的なRemote.It接続の確立方法を示すラダーダイアグラム。接続元のクライアントのローカルアドレスは、10.0.1.29(ノートパソコン)です。Remote.Itのフロントエンドサーバーアドレスは174.36.235.146、Remote.Itのチャットサーバーアドレスは209.235.201.53です。ターゲットデバイス(RaspberryPi)の外部アドレスは73.15.2.31、内部アドレスは10.0.0.123です。このラダー図は、Remote.Itソフトウェアの特別バージョンを使用して、発信元クライアントデバイスのパケットトレースからWiresharkで直接生成したものです。

Remote.It 表2 - メッセージの内容

表2.Remote.Itの基本的な接続のためのメッセージの内容と機能。上の表の各行は、ラダー表1の図の行に対応する。これらを並べて表示すると、両方の表を横断して、各Remote.It CHATプロトコルメッセージのタイミング、方向、エンドポイント、機能を読み取ることができるはずです。

 

Remote.Itの接続メッセージ

 

次に、各Remote.It CHATプロトコルメッセージの情報の流れをより詳細に見ていきます。以下の各Remote.It CHATプロトコルメッセージは、上のラダーダイアグラムの各行と対応しています。例えば、接続や使用に関する制限、製造や配備に関する様々なオプションは、接続の仕組みを理解する上で重要でないため、表示されないことがあります。

(REQUEST_AUTH_MESSAGE) AU: このメッセージで始まる最初の4つのメッセージとこのメッセージを含む4つのメッセージは、安全な認証の簡単な例であり、これらの4つのデータグラムには「AU」のフラグが付けられる。これは、私のノートパソコンからRemote.Itフロントエンドサーバーへの「I am m*****@remote.it 」というメッセージであり、この接続セッションを識別するために使用される1回だけ生成される発信クライアントUID、および最後に接続されたIPアドレスとポートを含んでいます。

(RESPONSE_AUTH_MESSAGE) AU: Remote.ItチャットサーバーのIPアドレスとポートへのリダイレクト。Remote.Itフロントエンドサーバーから見たNATマップのIPアドレスとポートも含まれています。

(REQUEST_AUTH_MESSAGE) AU:最初のREQUEST_AUTH_MESSAGEメッセージと同じですが、Remote.ItチャットサーバーのIPアドレスとポートにリダイレクトされます。

(RESPONSE_AUTH_MESSAGE) AU: Remote.Itのフロントエンドサーバーから私のノートパソコンに送信されるメッセージ。内容:発信元クライアントUID、nonce(一回限りの乱数)、使用する暗号化タイプ、ログインソルト(暗号化する前にデータに加える種)、Remote.Itチャットサーバーから見たNATにマッピングされたIPアドレスとポート。Remote.Itフロントエンドサーバーから見たNATマッピングされたIPアドレスとポート、Remote.Itチャットサーバーから見たNATマッピングされたIPアドレスとポートは、NATタイプを決定するためにRemote.Itによって使用されます。

(IDENTIFICATION_MESSAGE) E1:今後、すべてのRemote.Itサーバトラフィックが暗号化されることに注意してください(この暗号化タイプで暗号化されたすべてのデータグラムはE1としてフラグされます)。含まれる。SPI、パケットソルト、(認証ハッシュ)、(シーケンス番号)。()=使用しない、ローカルIPアドレスとポート、NATタイプ、クライアントフラグ(製造IDなど)、プロトコルサポート(TCPトンネル)、P2P暗号化サポート、使用制限。

(ACK_MESSAGE) E1: 含まれています。SPI、パケットソルト、セッション制限。

(REQUEST_P2P_MESSAGE) E1: 含まれる。SPI、ソルト、ターゲットデバイスのUID(データ型0x0a)、接続元のクライアントまたは私のUID(データ型0x01)、接続元のクライアントがサポートする暗号化、NATタイプで必要な場合は専用ポート、使用制限を含む。これは、私が接続したいターゲットデバイスのUIDが含まれているため、重要なメッセージです。

(INITIATE_P2P_MESSAGE) E1: 含まれています。SPI、ソルトなお、INITIATE_P2P_MESSAGEは、信頼性と速度のチューニングの経験から、2つの同じメッセージが送信される。含む。SPI、salt、このセッションで使用する暗号化タイプ、セッションID、ターゲットデバイスUID、NATタイプで必要な場合は内部IPアドレスとポートOrt、使用制限を含む。

(INITIATE_P2P_MESSAGE) E1: このメッセージは、最初のINITIATE_P2P_MESSAGEと同じものです。注:信頼性と速度のために、2つのINITIATE_P2P_MESSAGEがRemote.Itチャットサーバーからターゲットデバイスに送信されます。

(P2P_HELLO_MESSAGE) E2:このメッセージはネゴシエーションされた暗号化タイプで暗号化されている。内容:セッションID、ターゲットデバイスUID、送信元クライアントUID、最大パケットサイズ、バッファの深さに関連する最大未処理リクエスト。このメッセージはRaspberryPiのローカルアドレス10.0.0.123への接続を試みるもので、Remote.Itだけが知っていることに注意してください。例えば、10.0.1.29にある私のラップトップは10.0.0.123にルーティングできる可能性がありますが、この場合はできません。この場合、それはできません。このメカニズムは、いくつかの異常なNATやネットワーク環境での接続を可能にする可能性があるため、重要です。

(P2P_HELLO_MESSAGE) E2: このメッセージは、ターゲットデバイスへの最初のローカル接続 P2P_HELLO_MESSAGE と全く同じですが、今度はターゲットデバイス RaspberryPi 外部 IP アドレス 73.15.2.31 に宛てたものです。P2P_HELLO_MESSAGEが先に到達した方(発信元クライアントまたはターゲットデバイス)が、P2P接続を完了させることに注意してください。

(P2P_HELLO_MESSAGE) E2:送信元クライアントからのP2P_HELLO_MESSAGEと全く同じだが、UIDが入れ替わっている。

(ACK_MESSAGE) E2: この ACK_MESSAGE で P2P 接続を完了するか、あるいはさらに P2P_HELLO_MESSAGE メッセージが送信される。

(ACK_MESSAGE) E2; P2P接続を双方向で完了するために、ACK_MESSAGEは双方向に流れる必要がある。

(P2P_CONNECTED_MESSAGE) E1:この ACK_MESSAGE は Remote.It サーバに接続が完了したことを通知するものである。

(P2P_CONNECTED_MESSAGE) E1:信頼性などのために、2つのP2P_CONNECTED_MESSAGEメッセージが送信されることに注意する。

:33013 → 5963 Len=1 U:必要なルータのNATテーブルのパラメータが失効しないように、意図的にTTLを短くしたパケットです。このパケットは実際にはRemote.Itサーバに到達していない。

(TUNNEL_CREATE_MESSAGE) E2: このメッセージは、任意の TCP 接続確立プロセスによって引き起こされる。たとえば、ssh が起動すると TCP 接続が確立されます。このメッセージは、すでに確立されている暗号化されたUDPトンネル内にTCPデータパイプを形成する原因となります。各デバイスのRemote.ItソフトウェアがTCP接続を終了させることに注意してください。TCPデータのみが、例えば127.0.0.1アドレスのローカルホスト接続を介して、ホストに渡されます。したがって、Remote.ItのUDPトンネル内にはTCPヘッダーがありません。つまり、Remote.Itを使用して伝達されるTCPヘッダ情報は一切存在しません。これは、何らかの方法で何重もの暗号化が破られ、TCPデータが公開されたとしても、そのTCPデータに対してできることは何もなく、ルーティング可能な情報は存在しないことを意味します。

(TUNNEL_ACK_MESSAGE) E2: 暗号化された Remote.It P2P UDP トンネル生成に成功し、ターゲットデバイスに TCP 接続が確立されたことを確認するメッセージで、TUNNEL_CREATE_MESSAGE を再度試す。

(TUNNEL_DATA_MESSAGE) E2:このメッセージには、暗号化されたRemote.It P2P UDPトンネル内のTCPデータ(およびTCPヘッダー情報のないTCPデータのみ)が含まれています。

(TUNNEL_ACK_MESSAGE) E2: このメッセージは暗号化された Remote.It P2P UDP トンネル上でフロー制御されたデータ交換を確認し、実行するものです。

Remote.Itの詳細はこちら

上記のコネクションラダー図に使用したWiresharkのトレースでは、UDPパケットの内容は表示されませんでした。もしUDPデータグラムを表示していたら、TCPデータとTCPコネクションの詳細(フロー制御など)は表示されますが、TCPヘッダー情報は表示されません。つまり、Remote.It接続の何重もの暗号化が何らかの方法で破られたとしても、ヘッダーがないため、ルーティング情報がないため、明らかになるTCPデータは使用できないのです。

コネクションラダー図に使用したWiresharkのトレースでは、UDPパケット長や総データ使用量は表示されませんでした。Remote.It CHATプロトコルは、非常に低いオーバーヘッドで設計されており、例えば、データ使用量の監視を可能にするメッセージを含んでいます。

コネクションラダー図に使用したWiresharkのトレースでは、Remote.Itの接続が127.0.0.1接続であることは明らかではありません。これは、Remote.Itデバイスソフトウェアが、暗号化されたRemote.It P2P UDPトンネル内で運ばれるTCP接続を終了させた結果です。これは、ホストデバイスが隠蔽された方法ですべてのポートを閉じることができるようにするため、非常に重要な機能です。127.0.0.1または他のローカルホスト接続のみが許可される必要があります。

関連ブログ