検証
ネットワーク管理者のためのGnutella入門

5.Gnutellaの通信メカニズム(2)

井口圭一/デジタルアドバンテージ
2000/09/15

ファイルの検索とダウンロード

 ログイン処理と同様、ファイルの検索も相互に接続されたホスト間で検索パケットを順次中継しながら行なわれる。

ファイルの検索とダウンロード
ファイルの検索要求(Query)を接続しているホストに送ると、やはりコマンドが隣同士で順次中継されていく。求めるファイルを持っているホストだけがHit応答を返すが、この応答もやはり順次中継されて、もとのホストまで戻ってくる。
  自分の接続しているホストに対して、ファイルのQueryコマンドを送信する。
  このコマンドは順次中継されて、各ホストまで届く。
  ファイルを持っている(すべての)ホストは、Hit応答を返す。
  Hit応答はQueryとは逆の経路を順にたどって、Queryの送信元のホストへ返される。
  ファイルが見つかったホストに対してTCPで接続する
  ファイルのGet要求を送信する
  ファイルの内容が送り返されてくる。

 [Search]ボタンを押して検索を行なうと、以下のように動作する。

@直接接続しているホストに対して、Queryコマンド(「Query」は「問い合わせ」の意味)を送信する。
AQueryコマンドはPingコマンドと同様に、TTLが0になるまで順次中継される。Queryコマンドの引数には、要求する最低通信速度([Minimum connection speed]で指定する)と、検索キーワードが含まれている。
B送られてきたQueryコマンドの条件に合致するファイルを持っているホストは、Query Hitコマンドを返す。持っていないホストは、単にパケットを中継するだけで、Hitしなかったという意味のコマンドを返したりはしない。そのため、実際にファイルがヒットしなかったのか、それとも通信事情などが悪くて応答が遅れているのかどうかを判断することはできない。これについては、結果が表示されるウィンドウを見てユーザー自身が判断するしかないだろう。
CQuery Hitコマンドは、Pingに対するPongと同じように、Queryコマンドが送られて経路を逆順にたどって発信元に戻っていく。Query Hitコマンドの引数には、条件に合ったファイルの総数、待ち受けTCPポート番号、IPアドレス、接続通信速度、条件に合ったファイルの名前とサイズ、ファイル インデックス(どのファイルであるかを示すために、ホスト側で付けている一連の番号)が含まれている。

 検索結果のリストからファイルを選択してダウンロードを指示すると、以下のように動作する。

DQuery Hitコマンドに含まれていたIPアドレスのホストに向けて、直接TCPコネクションがオープンされる。
Eファイルを要求するGetコマンドを送る。Getコマンドは、HTTPプロトコルのGETコマンドとほぼ同じような形式になっている(HTTPと似てはいるが、同じではない)。
Fファイルを転送する。Getに対する応答もHTTPプロトコルに似ており、HTTPヘッダとともにファイル データを転送してくる。ただし、ファイル名はNapsterのようにフルパスで指定するのではなく、インデックス(ファイル提供側で管理している、ファイルを表すための番号。Query Hitのファイル情報に含まれている)とファイル名によって指定している。

ファイアウォール環境下におけるGnutella

 Napsterもそうであったが、Napster/Gnutellaクライアントが企業のファイアウォールNATなどの環境内に置かれている場合、外部からのファイル ダウンロード要求(上の図のDのTCP接続)を受け付けることはできない。このような場合でも動作するにように、やはりNapsterと同様に、ダウンロード動作を逆方向から開始するための機能が用意されている。以下にその動作を示す。

ファイアウォール環境下におけるファイルのダウンロード
ファイアウォール内に置かれたGnutellaホストに対してファイルのダウンロード要求を行なおうとしても、TCP接続が確立できないので失敗する。この場合は、ファイル提供側から接続を確立することにより、ファイルを転送する。
  ファイル検索要求が送信される。
  コマンドが中継されて相手先ホストまで届く。
  Hit応答が返送される。
  Hit応答が中継されながら元のホストまで返される。
  ファイル提供側のホストのIPアドレスは、ファイアウォールの内側のもの(プライベートIPアドレスなど)なので、TCPの接続要求はファイアウォール環境では失敗する。
  接続要求が失敗した場合、代わりにPush Request要求を、通常の経路を使って送信する。引数には、ファイルを受信するホストのIPアドレスやポート番号などが含まれる。
  Push Request要求も中継されながら届く。
  ファイル提供側から、ファイル受信側に対して、TCP接続を確立する。この場合、ファイル受信側はインターネット側からTCP接続が確立できるようになっていなければならない。
  ファイル提供側から、ファイル受信側に対して、ファイルの内容が送信される。

@、A、B、Cファイル検索要求の送信と、結果の返送までは先の図と同じ。
D先の図では、ファイルのダウンロードを指示すると、DのようにTCP接続を確立しようとする。しかしファイアウォールやNATが導入されていると、外部からのTCP接続要求は拒否されてしまい、接続することはできない。このTCP接続のオープンが失敗すると、Gnutellaプログラムはそれを検出して、逆方向からダウンロードを行なうように(ファイル提供側からプッシュするように)プロトコルを切り替える。
Eファイルを受け取る側からの接続要求が失敗すると、今度はファイルのPush Requestコマンドを相手側に送信する。
FPush Requestコマンドは、Query Hitが戻ってきた経路(すなわちQueryコマンドが伝わった経路)をたどってファイルの提供側に届く。Push Requestコマンドの引数には、ファイル受信側のIPアドレスや待ち受けしているTCPポート番号などの情報が含まれている。
Gファイルの提供側では、Push Requestに含まれているIPアドレスとポート番号へ向けて、TCP接続をオープンする。
HGIV(Give)コマンドを使って、ファイル提供側から受け取り側へファイルを送信する。

 以上のような仕組みで、ファイアウォール環境下でもファイルを転送することができる。ただしNapsterと同様であるが、双方のホストがファイアウォールの内側に置かれている場合は、(現状のGnutellaプロトコルでは)ファイルを転送することはできない。どこかのホストが仲介しながら中継するようにプロトコルを拡張すればこれは可能であろうが、強力なイニシアティブを取ってGnutellaプロトコルなどの改良を進める母体がすでに存在しない以上(Gnutellaクローンやその改良などを行っている団体は多数あるが、それらがすべて協調して作業しているわけではない)、GnutellaやNapsterなどにならった、次世代の(より合法的で、より実用的な)ピア・トゥ・ピア アプリケーションでは実装されるものと思われる。

Gnutellaの利用を禁止する方法

 Napsterに限らず、Gnutellaでも、違法なMP3ファイルなどのやり取りを禁止したり、ネットワーク トラフィックの浪費を抑えたりするために、Gnutellaの使用を禁止したい場合があるだろう。特に、常に外部のホストのコマンドを中継するという構造になっているGnutellaでは、何もしていない場合でもそれなりのトラフィックを発生させている。企業のネットワーク管理者ならば、このようなソフトウェアの利用を禁止したいと考えても不思議はない。ここでは、そのための方法について検討してみよう。

 だが残念ながらGnutellaでは、Napsterのような集中管理をしているサーバは存在していないので、その入り口(サーバへのログイン接続要求)を止めるという手法は使えない。また、通信に使うTCPポートの番号もユーザーが自由に設定できるので、TCPポートに対するフィルタを使ってブロックする方法でも完全には防ぐことはできない。どのポートがGnutellaの通信に使われているかが完全には分からないので、確実に禁止することができないからだ。ではどのようにして防げばよいのだろうか。完全ではないものの、いくつかの方法を考えてみた。

1.デフォルトTCPポートを閉じる

 Gnutellaの通信を禁止する最も簡単で、最初に思いつく方法は、GnutellaのデフォルトのTCPポートでの通信路を閉じてしまうことだ。Gnutellaプログラムをインストールすると、最初に接続先相手の情報(IPアドレスとTCPポート番号)を入力する必要があるが(サービスを公開する、自分の側のポート番号も指定する必要がある)、このTCPのポート番号はデフォルトでは「6346」になっている。そのため、多くのGnutellaユーザーは、このポート番号のままでサービスを利用していると考えられる。よって、このデフォルト ポート番号を使ったTCP接続を禁止すれば(外部ホストへのTCPの6346番への接続をルータのフィルタ設定などでブロックすれば)、とりあえずはGnutellaの利用を禁止することができる。

 しかしこのポート番号は設定によって自由に変更できるし、実際にはHTTPの80番やPOP3の110番を使っているホストもいるようなので(これらは明らかに擬装するためだろう)、この方法でも完全に禁止することはできない。けれどもほとんどのユーザーはデフォルト設定のまま使っているようなので、ある程度の効果は期待できる。

2.通信禁止先ホストの一覧を作成してブロックする

 管理者にかなりの負担のかかるやり方だが、Gnutellaでよく使われるホストの一覧表(ブラックリスト)を作り、そのホストとの通信を遮断する方法もある。といってもすべてのGnutellaホストを見つけ出してブロックする必要はなく、多くのユーザーが最初に接続する有名なホストがいくつかあるので、それらの情報を入手して禁止するようにすれば、それなりに効果があると思われる(つまり、管理者もGnutellaのユーザーの立場で情報収集をする必要がある、ということ)。

3.パケットの内容をチェックして動的にブロックする

 ファイアウォールが、パケットの中身を調べて、それに基づいてフィルタをかけるという高度な機能を備えているならば(実際にこのようなファイアウォール製品があるかどうかは不明。情報をご存知の方がおられましたら、ご連絡ください)、Gnutella特有のプロトコルだけを検出してブロックさせるということもできるだろう。すでに述べたようにGnutellaでは、コネクション開設直後に「GNUTELLA CONNECTION」、「GNUTELLA OK」というメッセージの交換をしている。そのため、このようなコネクションを見つけ出してブロックするようにフィルタを設定できれば、確実にその利用を止めることができるだろう。End of Article

関連記事(Windows Server Insider)
  検証:ネットワーク管理者のためのNapster入門
 
  関連リンク
  Gnutellaのホームページ(Gnutella)
     
 

 INDEX
  [検証]ネットワーク管理者のためのGnutella入門
    1.Gnutellaとは何か?
    2.Gnutellaのインストールと実行 (1)
    3.Gnutellaのインストールと実行 (2)
    4.Gnutellaの通信メカニズム (1)
  5.Gnutellaの通信メカニズム (2)
 
 検証


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間