導入
| GNUnet | |
![]() | |
GNOME でのフランス語の gnunet-gtk | |
| 最新バージョン | 0.8.1b [+/-] |
| 環境 | マルチプラットフォーム |
|---|---|
| 親切 | P2PおよびF2Fネットワーク |
| ライセンス | GNU GPL |
| Webサイト | www。 gnunet.org |
GNUnetは、集中型サービスや他の信頼できるサービスを使用せず、匿名性を保証する P2Pコンピューティングネットワークです。ネットワーク層より上の最初の実装では、匿名で検閲に強いファイル共有が可能になります。 GNUnet は、超過に基づいたリソース割り当ての経済モデルに基づいたシンプルなシステムを使用します。 GNUnet ノードは、利用可能なリソースを尊重しながら、他のノードからのリクエストを考慮します。ネットワークに貢献するノードには、より高品質のサービスが与えられます。これは GNUプロジェクトの一部であり、 Linux 、BSD、Solaris、およびWindowsで利用できます。 GNU GPL ライセンスに基づいてリリースされています。

GNUnet の歴史
GNUnet は、安全なピアツーピアネットワークを管理するための、研究論文から生まれた一連の新しい技術アイデアを取り入れて 2001 年末に発足しました。これらのアイデアには、検閲耐性コーディング(ERCS) や匿名ルーティング(ギャップ) 用の新しいプロトコルが含まれます。 GNUnet プロジェクトの開始時に、開始点を確立するために既存のシステム (当時は特にFreenetと mnet) が研究されました。しかし、想定されているシステムは既存のコードからかけ離れていて、それらのコードの 1 つに基づいて構築することはできないという結論に達しました。 GNUnet 開発者は、新しいピアツーピア プロトコルを開発するための優れた一般的なインフラストラクチャを作成するという野心を抱いていました。そのため、新しいピアツーピア アプリケーションを統合したり、ベース システムに代替トランスポート層を追加したりするために、簡単に拡張できるように設計されています。プロジェクトは、多くの場合、同様のプロジェクトの開発者との議論を通じて、技術的なアイデアと実装の点で進化し続けています。これらのプロジェクトの中で最もよく知られているのは、おそらく Tor です。それにも関わらず、GNUnet はベータ版のままです。やるべきこと、修正すべきことがまだたくさん残っています。
いくつかの GNUnet オプション
- GNUnet は明らかに、FS と呼ばれる (安全な) ファイル共有アプリケーションを提供しています。
- GNUnet は、友人間のネットワークを構築するための「F2F トポロジー」オプションを提供します。
- コマンドラインの使用に加えて、GNUnet は 3 つのグラフィカル インターフェイスを提供します。
- gnunet-gtk (最もよく使用される)
- グヌネットヒューズ
- gnunet-qt
GnuNet の仕組み
GnuNet は匿名の P2Pネットワークです。ネットワークの各ノードで、GnuNET カーネル gnunetd を実行します。 Gnunetd は、他のピアとの (暗号化された) メッセージの送受信を担当します。また、帯域幅の割り当てとメッセージ送信のスケジュール設定も行います。最後に、カーネルの最後の機能はモジュールのロードです。 Gnunetd はそれ以上何もしません。アプリケーション (ファイル共有など) はカーネル上に構築されます。したがって、後者には、たとえばファイル共有の概念がありません。
アプリの仕組み
GNUnet はアプリケーションを 2 つの主要な部分に分割します。
- 最初の部分はアプリケーション サービスで構成されます。サービス (またはモジュール) は、カーネルに接続される動的ライブラリです。通常、モジュールはカーネルの起動時に呼び出される単一の関数を定義します。この関数は、特定のピアツーピア メッセージを処理することを目的とした他の関数を登録します。正しい識別子を持つピアツーピアメッセージが受信されるたびに、対応する関数が呼び出されます。たとえば、ファイル共有 (FS) アプリケーションは、ルーティングに GAP サービスを使用し、データベースに sqstore サービスを使用します。サービスのもう 1 つの例は、ネットワーク層の信頼性の強化に役立つ RPC (リモート プロシージャ コール) サービスです。
- アプリケーションの2 番目の部分はユーザーによって呼び出され、サービスへのインターフェイスを提供します。その考え方は、ユーザーが gnunetd コアとはまったく異なるプログラム (gnunet-gtk など) を起動して、必要なサービスにアクセスするというものです。最初のパーティとの対話は、ローカル (したがって信頼できる) TCP 接続を介して行われます。

通信プロトコル
GnuNet の動作には、3 つの異なるコンテキストで通信プロトコルを使用する必要があります。ピアツーピア プロトコルは、ネットワーク ノードが情報を交換する方法を定義します。クライアントサーバープロトコルを使用すると、ユーザーは自分のマシン上の gnunetd デーモンと (gnunet クライアント経由で) 通信できます。最後に、3 番目のプロトコル ファミリはトランスポート層で使用され、ピアツーピア メッセージをカプセル化するために使用されます。
ピアツーピアプロトコル
このプロトコルは GNUnet ネットワークの基礎です。これは 7 つの異なるメッセージ (HELLO、SETKEY、 PING 、PONG、FRAGMENT、NOISE、HANGUP) を定義しており、すべてのピアでサポートする必要があります。一般に、これらのメッセージはすべてカーネル自体によって実装されるわけではなく、内部サービス プラグインによって実装されます。ただし、これらのサービスのロードはオプションではありません (カーネルは起動時にそれらを自動的にロードします)。
ネットワーク上に存在を知らせる
ホストがネットワークに到着すると、その存在を知らせるために、まず他のホストにHELLO を送信して、ネットワーク上にその存在を知らせます。実際、HELLO パケットは、GNUnet ネットワークに参加しているノードに関する情報を伝播するために使用されます。各 GNUnet ノードは、その公開鍵 K (2048 ビット RSA 鍵) によって識別されます。 HELLO パケットは、ノードが他のノードの公開鍵を伝播する方法です。さらに、ノードの ID はアドレスにリンクされます。アドレスの指定方法は、使用される基盤となるトランスポート メカニズムによって異なります。 GNUnet ノードは複数のアドレスを持つことができ、たとえばアドレスが DHCP で動的に割り当てられている場合など、いつでもアドレスを変更できます。 HELLO メッセージは、他のホストにアドレス変更を通知するために使用されます。このアドレスは、ネットワーク上で偽のアドレスが配布されるのを避けるために、ノードの秘密キーで署名されます。 HELLO の受信ホストは、到達可能であることを確認するために PING を返します。 PING の受信者は、受信を確認するために常に PONG を送り返します。このピンポンの目的は、ホストが参加していないマシンの IP アドレスで署名された有効な HELLO メッセージを送信できないようにすることです。 GNUnet は、疑わしいホストに PING を送信することでこの種の攻撃を防御し、受信した PONG のみを信頼します。したがって、偽の HELLO を送信する悪意のあるホストは、GNUnet をだまして、接続されていないホストへの接続を繰り返し試行させようとして失敗します。
接続を確立する
2 つの GNUnet ノード間のセッションは対称暗号化(AES-256) を使用し、256 ビットのセッション鍵のペアで構成されます。接続を確立するには、一方のノードがもう一方のノードに SETKEY (セッション キーを含む) と暗号化された PING (乱数のみを含む) を送信します。 SETKEY は常に、受信ノードの公開キーを使用して暗号化されます。セッションキーの送信者は、受信者の公開キーを使用してキーを暗号化するだけでなく、独自の秘密キーを使用してそれに署名します (そして作成時刻を追加します)。送信されたキーは、送信者が将来メッセージを暗号化するために使用するキーです。 PING は送信されるセッション キーで暗号化されます。次に、他のノードは、送信したばかりの PING に対して、SETKEY (セッション キーを含む)、PING (同じキーで暗号化)、および PONG (PING と同じ方法で暗号化) で応答する必要があります。最後に、最初のノードは、セッション キーで暗号化された PONG を使用して、受信したばかりの PING に応答します。
PING メッセージに応答する PONG メッセージには、同じ乱数が含まれている必要があります。乱数は、対戦相手が PING に対する PONG 応答を偽造することを非現実的にすることを目的としています。
ノードが予期していた PONG を受信すると、セッション キーを使用して暗号化されたチャネルで通信を開始できます。
メッセージの交換
接続が確立されると、ノードは特定のメッセージを交換できるようになります。 GNUnet ホスト間で交換されるパケットには、必要な数のメッセージを含めることができます (制限はトランスポート層 MTU によって設定されます)。 GNUnet コアは、メッセージの暗号化に加えて、チェックサム、帯域幅調整情報、およびシーケンス情報を追加して、同じメッセージが複数回処理されるのを防ぎます。暗号化、復号化、検証は GNUnet コアによって実行されます。アプリケーションもトランスポート コードも影響を受けません。セッションが非アクティブなままの場合(通常は 15 分後)、セッションは期限切れになります。
その他のカーネルメッセージ
- 電話を切る
2 つのノード間の接続を閉じるメッセージ。セッションの有効期限が切れるため、これは承認されず、必要もありません。
- 断片
MTU を超えるメッセージを通信するために使用されるメッセージ。
- ノイズ
攻撃者にとってトラフィック分析をより困難にするために、ノードは短いパケットにノイズを追加して、すべてのパケットのサイズを均一にします。一部のメッセージにはノイズのみが含まれる場合があり、メッセージを受信するノードはそれらを黙って無視する必要があります。
クライアントサーバープロトコル
これはローカルであるため、信頼できるローカル TCP 接続です。許可された IP アドレスのリストは構成ファイルに記載されています。これは、GNUnet コア (および GNUnet コアがロードしたサービス) とアプリケーションのユーザー インターフェイス部分の間の通信に使用されます。
トランスポート層プロトコル
GNUnet は特別なタイプのメッセージ (HELLO) を使用して、公開鍵を現在のアドレスにバインドします。各 GNUnet ノードには少なくとも 1 つのアドレスが必要です。トランスポート メカニズムでは、さまざまな形式のアドレスを使用できます。ノードは、使用するさまざまなトランスポート メカニズムに対して複数のアドレスを持つことができることに注意してください。トランスポート層には、内部プロトコル (IP) と同様に、ベスト エフォート セマンティクスがあります。メッセージが正しく配信されるという保証はありません。
UDP、TCP、HTTP
UDP、TCP、HTTP プロトコルは、GNUnet のトランスポート層として使用できます。これらのプロトコルの場合、アドレスはIPv4 (および/または IPv6) アドレスとポート () で構成されます。
SMTP
SMTP を使用すると、動的アドレス指定を持つ NATルーターの背後にあるノードにメッセージを送信し、仮想プライベート ネットワークの外部のノードとの TCP 接続を確立するようにノードに指示できます。この種の状況では、この最初のメッセージに対する異常なネットワーク過負荷があっても問題になりません。
その他のプロトコル
GNUnet ネットワーク用に独自のトランスポート メカニズムを作成することもできます。現在利用できるのは前述の 4 つだけです。

