I2Pネットワヌククラむアント開発の基瀎

この蚘事は、独自のI2Pクラむアントをれロから開発したい人を察象ずしおいたす。 I2Pの基本的な抂念ず抂念に粟通しおいるこずを前提ずしおいたす。 珟時点では、ロシア語に翻蚳されたものを含む、この䞻題に関する十分なドキュメントず蚘事がありたす。 䞀方、プロトコルずメッセヌゞ圢匏に぀いお十分に説明しおいる公匏ドキュメントがありたす。 残念ながら、断片化されおおり、倚くの明癜でないものがそこにありたせん。 この蚘事は、䞻に公匏I2P Javaクラむアントの調査ずデバッグに基づいお曞かれおいたす。 最終的な目暙は、C ++で完党に実装するこずです。 珟圚の状態のプロゞェクト゜ヌスコヌドはgithubにありたす。



䜿甚される暗号化



独自のI2Pルヌタヌを構築するには、次の暗号化アルゎリズムの実装が必芁です。

  1. ゚ル・ガマル。 ベヌスをモゞュロで环乗するこずに基づく非察称暗号化。 ベヌスずモゞュヌルは、I2Pネットワヌク党䜓の固定定数です。 514バむトの暙準サむズのブロックに加えお、512バむトのカスタムサむズのブロックも䜿甚されたす。
  2. Diffie-Hellmanは、公開鍵を亀換しお察称暗号化鍵の共有鍵を取埗したす。 El-Gamalず同じキヌが䜿甚されたす。
  3. 電子眲名を䜜成および怜蚌するためのDSA
  4. 2぀のモヌドのAES暗号化キヌず初期化ベクタヌIVを䜿甚するCBC、16バむトの長さでIV自䜓を暗号化するECB
  5. ハッシュを蚈算するためのSHA256
  6. メッセヌゞのチェックサムを蚈算するAdler32




䞻芁プロトコル



I2Pネットワヌクは、䞻に4぀のレベルで構成されおいたす。



各レベルは、異なる目的のために独自の暗号化を远加したす。 トランスポヌト局の暗号化は、トンネル間でメッセヌゞを送信するずきに、プロバむダヌのトンネル、トンネルの䞭間ノヌドからのコンテンツず方向、「ニンニク」からのトラフィックをトンネルの゚ンドノヌドから隠したす。



茞送レベル



トランスポヌト局接続を確立するには、IPアドレスずポヌトを知る必芁がありたす。 netDbず呌ばれる既知のノヌドのリストがあり、操䜜䞭に倉曎されたす。新しいノヌドに関する情報は他のノヌドから取埗されたす。 最初に、ノヌドのリストはアドレスがrouter / networkdb / Reseeder.javaファむルに明瀺的にリストされおいる特別なサむトからダりンロヌドされたす。 TCP / IP䞊で実行されるプロトコルはNTCPず呌ばれ、UDP䞊ではSSUず呌ばれたす。 接続蚭定のいく぀かの違いに加えお、SSUはパケットの性質䞊、長いメッセヌゞをいく぀かのフラグメントに分割するこずをサポヌトしおいたす。 送信されるメッセヌゞは、ヘッダヌ、I2PNメッセヌゞ以䞋のI2NPプロトコルに぀いお、およびチェックサムで構成されたす。 同期を目的ずした珟圚時刻を含む特別なメッセヌゞが定期的に送信されたす。 接続が確立されるず、ルヌタヌの公開鍵が亀換され、それに基づいお、AES暗号化の共通鍵がDiffie-Helmanアルゎリズムに埓っおそれぞれによっお蚈算されたす。



トンネル



トンネルは垞に単方向です。すべおのメッセヌゞは、入力ノヌドゲヌトりェむから出力ノヌド゚ンドポむントにのみ送信できたす。 トンネルのすべおの情報を持぀所有者に属するトンネルの端に応じお、トンネルは着信所有者-出力ノヌドず発信所有者-入力ノヌドに分けられたす。 トンネルの䞭間ノヌドは、トンネルが着信か発信かを知りたせん;䞭間ノヌドによっお実行される唯䞀のアクションは、暗号化キヌでメッセヌゞを暗号化し、次のノヌドに送信するこずです。 これからの重芁な結果は次のずおりです。所有者のみがすべおの䞭間ノヌドの暗号化キヌを持っおいるため、トンネルメッセヌゞの順次埩号化は所有者が実行する必芁がありたす。 この事実は、着信トンネルでは非垞に簡単です。぀たり、メッセヌゞを受信した堎合、出力ノヌドはそれを順次埩号化する必芁がありたすが、発信トンネルでは、送信前に元の暗号化されおいないメッセヌゞを順次埩号化する必芁がありたす。 このノヌドが所有者ではないトンネルは通過ず呌ばれたす。 トランゞットトンネルは倖郚トラフィックを送信し、I2Pネットワヌク党䜓の機胜をサポヌトするために必芁です。これにより、ノヌドがルヌタヌに倉わりたす。 トンネルノヌドは3぀の異なるキヌでAES暗号化を䜿甚したす1぀はトンネル䜜成時のノヌドの応答を暗号化するために䜿甚され、他の2぀はトンネルを介しおデヌタを送信するために䜿甚されたす1぀のキヌはデヌタ自䜓を暗号化し、もう1぀は識別ベクトルIVを暗号化しおデヌタを暗号化したす。 この堎合、IVは同じキヌで2回暗号化されたす。暗号化の前埌に、これは二重暗号化ず呌ばれたす。 ノヌドは、El-Gamalを䜿甚しお公開キヌで暗号化された関連トンネルレコヌドメッセヌゞでこれら2぀のキヌを受信したす。

トンネルの内郚では、TunnelDataメッセヌゞのみが送信され、䞀般的にはいく぀かのフラグメントで構成されたす。 トンネル間の䌝送には、TunnelGatewayメッセヌゞが䜿甚されたす。 公匏のドキュメントでは、双方向接続には少なくずも4぀のトンネルむンバりンド2぀ずアりトバりンド2぀が必芁であるず蚘茉されおいたすが、実際には、発信トンネルを介しおメッセヌゞを送信する必芁はありたせんが、TunnelGatewayメッセヌゞを目的の着信トンネルの入力ノヌドに送信できたす。

TunnelDataメッセヌゞでは、れロバむトずそれに添付された暗号化されおいないIVに続く意味のあるデヌタからチェックサムが蚈算されたす。



I2NPプロトコル



I2Pネットワヌク内のデヌタ亀換は、さたざたなタむプのI2NPメッセヌゞを䜿甚しお行われたす。 各メッセヌゞにはタむプず長さのヘッダヌが含たれおいるため、メッセヌゞ間の境界を定矩できたす。 タむプに応じお、メッセヌゞの長さは20〜64Kバむトたで倉化したす。 各レベルは、より高いレベルの他のI2NPメッセヌゞを含む「ラッパヌ」メッセヌゞを䜿甚したす。 トンネルの堎合、これらの「ラッパヌ」は、トンネル内の䌝送甚のTunnelDataメッセヌゞず、トンネル間の䌝送甚のTunnelGatewayです。 「ニンニク」の堎合-ニンニク。 I2Pトラフィックのほずんどは、次の添付メッセヌゞで衚されたす。

デヌタ->ニンニク-> TunnelData。

原則ずしお、メッセヌゞはトンネルを介しお送信されたすが、特に新しいトンネルを最初に䜜成する堎合は、マヌシャタヌ間で盎接送信するこずもできたす。 ルヌタヌは、接続が確立された盎埌にDatabaseStoreメッセヌゞも亀換したす。 察応するフィヌルドはそこにのみ存圚するため、宛先ポむント間のメッセヌゞは「ニンニク」を介しお送信する必芁がありたす。



ルヌタヌず宛先



I2Pネットワヌクで動䜜するには、I2Pネットワヌクぞのアクセスを提䟛するルヌタヌず、意味のある情報の亀換先を備えたI2Pクラむアントが必芁です。 IPアドレスを含むルヌタヌに関する情報は公開されおいたす。さらに、ルヌタヌの珟圚のリストは特別なftpサむトからダりンロヌドできたす。 同時に、目的地の䜍眮情報は機密情報です。 このルヌタヌにある宛先ポむントに関する情報は、このルヌタヌでのみ䜿甚できたす。他のすべおのルヌタヌでは、この情報を取埗するこずはできたせん。これは、I2Pネットワヌクの匿名性を保蚌する䞻芁なメカニズムの1぀です。

ルヌタヌは䞻にネットワヌク参加者のコンピュヌタヌ䞊にあるため、その構成は垞に倉化しおいたす。 そのため、ルヌタヌは他のルヌタヌのリストを垞に最新の状態に保぀こずを匷制されたす。 このプロセスは探玢的ず呌ばれ、ランダムに遞択された32バむトのアドレスを持぀リク゚ストを、フラッドフィルず呌ばれる特別なルヌタヌに送信したす。 フラッドフィルルヌタヌには、ネットワヌクに関するすべおの情報があるず想定されおいたす。 ずりわけ、フラッドフィルルヌタヌは、怜出された新しいノヌドに関する情報を垞に盞互に䌝えたす。

ノヌドに関する情報を芁求するために、I2NPはDatabaseLookupメッセヌゞを䜿甚し、databaseStore情報自䜓を送信したす。 原則ずしお、メッセヌゞはトンネルを介しお送信されたすが、DatabaseStoreは、接続が確立された盎埌にノヌドによっおトランスポヌトレベルで盎接送信されるため、ネットワヌクにその存圚が通知されたす。 そうしないず、新しいノヌド甚のトンネルの構築が䞍可胜になりたす。

DatabaseStoreには、RouterInfo構造がこのアドレスに察応する堎合、アドレスがルヌタヌである堎合、およびLeaseSetが宛先である堎合、2皮類の情報を含めるこずができたす。

RouterInfoには、ルヌタヌの公開キヌずさたざたなサヌビス情報が含たれたす。最も重芁な情報は、IPアドレス、ポヌト、接続甚のサポヌトされおいるトランスポヌトプロトコル、および特定のルヌタヌがフラッドフィルかどうかに関する情報です。 RouterInfoには非垞に倚くのテキスト情報を含めるこずができるため、アヌカむブされたgzipによっお送信されたす。

LeaseSetには、特定の宛先の着信トンネルのリストず、この宛先を宛先ずするニンニクメッセヌゞを暗号化するための公開キヌが含たれおいたす。



アプリケヌション局サヌビス



I2Pクラむアントの実質的なアクションを怜蚎しおください。オンラむンリ゜ヌスの匿名ホスティングず、それに応じたそれらぞのアクセス。 たず、FlibustaなどのWebサむトからデヌタを取埗しおみたしょう。 珟時点では、I2Pアドレスの32バむトのハッシュしか持っおいたせん。目暙はHTTPリク゚ストを送信し、レスポンスを受信するこずです。

もちろん、そのようなアドレスを持぀ルヌタヌはデヌタベヌスに存圚したせんそうでない堎合、リ゜ヌスのIPアドレスはすべおのナヌザヌに衚瀺されたす、リク゚ストを送信する唯䞀の方法は、最初にリク゚ストしおLeaseSetを取埗する必芁がある特定の時間に存圚する目的のノヌドの䜕らかの着信トンネルを経由するこずです。 トランスポヌトレベルで隣接ノヌドから芁求および受信できるRouterInfoずは異なり、LeaseSetは、最初に構築する必芁があるトンネルを通じおのみ芁求および受信できたす。 したがっお、「オンデマンド」でI2Pネットワヌクを䜿甚するず倱敗するずいう残念な結論は、I2Pルヌタヌが皌働しおいる必芁があり、垞にトンネルを構築しおサポヌトする必芁があるずいうこずです。 分散ネットワヌクのため、トンネルの構築は簡単な䜜業ではありたせん-トンネルを䜜成するほずんどの詊みは倱敗したす。

トンネルの建蚭を成功させるには、2぀の条件が必芁です。

  1. トンネルに参加するすべおのノヌドは、少なくずもトンネル内の前のノヌドからトランスポヌトレベルでアクセス可胜でなければなりたせん
  2. トンネルに関係するすべおのノヌドは、新しいトンネルを構築するこずに同意する必芁がありたす。 ノヌドは、たずえば茻茳のためにトンネルの䜜成を拒吊する堎合がありたす


トンネルの最倧存続期間は10分です。トンネルに参加しおいるノヌドがオフラむンになるず、トンネルは予定より早く停止する可胜性がありたす。 そのため、トンネルの所有者は垞にテストメッセヌゞを送信しお、ラむブトンネルのリストを最新の状態に保ちたす。

そのため、トンネルが利甚可胜であり、必芁なLeaseSetが利甚可胜です。 これで、HTTPリク゚ストを送信でき、宛先に到達するこずさえできたすが、レスポンスも受信したいず思いたす。 これを行うには、メッセヌゞに独自のLeaseSetを指定する必芁がありたす。そうするず、䜕らかの着信トンネルを介しお回答が送信され、ノヌドに正垞に到達する可胜性が高くなりたす。 耇数の接続がノヌドを介しお同時に機胜するため、各接続に独自のI2Pアドレスを割り圓お、耇数の着信トンネルからLeaseSetを圢成するか、適切なフィヌルドを持぀特別なプロトコルを䜿甚しお接続を倚重化する「共有」アドレスを䜜成する必芁がありたす。アプリケヌション局プロトコル。 このようなプロトコルはI2CPず呌ばれ、公匏のI2Pクラむアントでのみ䜿甚されたすが、独自のサヌビスを構築するために必芁なわけではありたせん。 もちろん、I2CPを䜿甚しおFlibustにアクセスする必芁がありたす。 ただし、たずえば、独自のトレントのようなネットワヌクを構築するには、I2Pアドレッシングのみを実行できたす。



I2CPプロトコルずその䞊に構築されたプロトコルスタックは別のトピックであり、別の蚘事で説明されおいたす 。



All Articles