I2PとVuzeで構築する匿名なBitTorrent(P2P)ネットワーク

I2Pって知ってますか

「I2P」=「Invisible Internet Project」です。

こちらのページで紹介されていたのが興味の発端だったんですが、とにかく通信の匿名性を高めるための技術としてI2Pという通信プロトコルがあります。Wikipediaのやオフィシャルページのここ(英語)にも説明がありますが、もの凄く平たく言うと、

  1. AさんからデータをもらいたいDさんがいます。
  2. でもDさんは自分がAさんからデータをもらったという事を間違っても知られたくない。
  3. そこで、BさんとCさんに協力してもらって、Aさん→Bさん→Cさん→Dさんという具合にデータを運んでもらう。
  4. ただし、DさんもBさんもCさんもお互いの住所を暗号化して持っているので、お互いがどこに住んでいるかは知らない。
  5. しかしデータを運ぶ際に、住所の欄に指定された文字列(暗号化された住所)を書けば、どこに住んでいるかを知らなくても相手に届く、という事は知っている
  6. そうして、Dさんの欲しいデータはCさん、Bさんを経由して手元に届く。
  7. データを運んだ後でAさんがそれを追跡しようとしても、BさんとCさんはお互いどこにデータを運んだのか知らないし、その記録を残しておく必要もないので、追跡がとても難しくなる。

とかそんな塩梅です。似たような仕組みにI2Pよりもっと有名なTor(The Onion Router)というのがありますが、そっちは結構沢山の人が使っているみたいなのでググれば情報は結構出てくるはずです。と言う訳でフロンティア精神に満ちあふれた私の興味はマイナーなI2Pの方に行ったわけですね。ちなみにI2Pのオフィシャルページはここ(英語です)
・・・で、偶然BitTorrentクライアントの「Vuze(Azureus)」がプラグインでI2Pプロトコル(サービスかな?)に対応しているというのを知りまして、じゃあ試してみんべ、となった次第です。

注:
今回、海外のサイトなどを参考に設定を行っていまして、VuzeにI2Pプラグインをインストールして設定して、エラーメッセージ等を出さずにBitTorrentを利用できるところまではもっていっています。・・・が、実際の動作(「I2P」ー「I2Pプラグイン」ー「Vuze」間の通信)がどのようになっているのかについては検証できていません。その辺りについてはどなたか詳しい方に知恵を借りたいところです・・・。

BitTorrent

えー、BitTorrentって何? ってことについてはここでは特に説明しません。というかBitTorrentという言葉を見たことがない、そもそもここより↑に書かれている内容が既にちんぷんかんぷんという人には、ここから下に書かれていることはかなり異教の呪文っぽくなると思うので、廻れ右をして別のページでも見に行った方が幸せになれるような気がします。
まあとにかくBitTorrentです。BitTorrentのクライアントソフトとして日本で人気があるのは「BitComet」というWindows上で動くソフトウェアで、「Vuze」はあまり使われていないのが現状でしょう。世界的に見れば「μtorrent」というソフトウェアが一番人気だと思いますが、日本では「BitComet」ですわね。そもそもこの「Vuze」、何をトチ狂ったかJavaプラットフォーム上で動くソフトウェアなんです。

「・・・ジャバって何よ? そんなこと言われても分からないわよ。もっと分かりやすく説明しなさいよこのジャバ野郎、イカ臭いのよ!」

とか言われないためにもう少し説明しますと、この「Vuze」というソフトを動かすためには、もう一つ「Java」というソフトウェアが必要になる、と考えてもらえればいいです。「Vuze」はこの「Java」の上に乗っかる感じで動くんです。
Java」と「Javaソフトウェア」の関係は他の例で例えると「Windows」と「その上で動くソフトウェア」みたいな関係なので、Javaソフトウェアから見た時にまるでOSのように振る舞うJava環境はJVMJava Vurtual Macine=Java仮想マシン)なんて呼ばれたりもします。つまり「Java」さえ動けばこの「Vuze」、どのOSの上でも動作する訳です。
つまり、Windows上でもMac上でもあるいはLinux上でもFreeBSD上でもUNIX上でも「Javaの実行環境」さえ動けば、同じプログラムが動く・・・というのが優位な所と言えます。うん、Javaは上記のどのOSにでもインストール出来るソフトウェアなんですね。最近だと携帯電話にも入ってます。確かiアプリとかJava環境で動いてなかったかな? あら、あなたの身近なところにもJavaが! ビックリですね!
・・・でもまあそんなもんをPCに余計に入れなくちゃならんとなると一般的にはいきなり敷居が上がる訳でして、しかもこのJava、結構動作が重いんですわ・・・。そりゃ嫌われるよね・・・という訳でVuzeもあんまり普及してないのが現実です。わざわざそんなもの使わなくてもボクにはBitCometがあるもんね! という塩梅です。

結果として

I2PもVuzeも日本語の情報が少ないのです。使っている人間が少なければネット上の情報も少ない、これ自然の摂理。
特にI2Pに到ってはgoogle先生に聞いても全然日本語で答えてくれないんです! 世界標準語はEnglishなのよバカとか言わんばかりの勢いなのです。しかも私の場合実行環境がMacだったりするのでさらに情報が無いわけで、もの凄く手探り感丸出してやってみました。以下はその全記録です。いやもう戦闘記録と言い換えてもいいかもしんない。まあ・・・趣味でやってるんですけど・・・。
という訳でゼロから始める場合の手順としては、

  1. Java仮想マシンのインストール
  2. Vuzeのインストール
  3. ルーターのポートを開ける
  4. Vuzeの動作確認
  5. I2Pのインストール
  6. I2Pサービスのセットアップ
  7. VuzeのI2Pプラグインのインストール
  8. Vuzeの設定変更
  9. I2Pネットワーク経由でのファイルのダウンロード

・・・という感じになると思います。まずVuze単体で動かしてみて、その後I2P経由でのVuze使用、という流れですね。色々なサイトを参考にしましたが、主だった流れとして参考にしたのはこのページ「Computers 'n Stuff: Azureus I2p Network plugin configuration Howto for Linux」と、このページ「How to set up Azureus to work with I2P」です。両方とも英文ですが、I2P + Vuzeを行うための基本的な流れがまとめてあるので目を通してみるといいんじゃないかと。
ところでJavaプラットフォームのお陰で、やることは基本的にWindowsでも同じなはずなので、私のやったことはWindowsでVuzeを動かす場合にも応用がきくはずです。その辺は使えますねJava。いいんだかわるいんだか・・・。

手順1:Java仮想マシンのインストール

難しいことを考えずにオフィシャルページからダウンロードしてインストールしましょう。細かい説明は省きます。インストールして下さい。ちなみにMac OS Xの場合は標準でJava仮想マシンがインストールされているはずなので、特に何かをする必要はありません。

手順2:Vuzeのインストールと起動

Mac中心の説明なのでWindowsユーザーの人は適宜読み替えて下さい。
Vuzeをインストールします。オフィシャルページからダウンロードしてインストールしましょう。難しくはないのでここでつまずく事はない・・・はずなんですが。
実は最初こそちゃんと起動してくれるVuzeですが、一度終了して再度起動しようとすると、「Vuzeが壊れています」といった感じのエラーが表示されてしまい、Vuzeが初回以降起動しなくなるという現象が発生しますMacっでのみ確認)。どうやら調べてみると結構有名なバグらしく、解決策がネット上にありました(例えばこことかここ)。2バイト文字環境に依存している問題らしく、Vuzeのパッケージの中に含まれている「Info.plist」というファイルの先頭に文字化けした文字が挿入されているのが原因ということです。
このファイルをテキストエディタで開いて編集すれば良いみたいですが、ここで一回引っかかりました。そもそも解決策の手順にある
「Vuze/Contents/Info.plist」
ファイルってどこにあるんじゃい? Vuzeディレクトリ(フォルダ)なんて無いぞ? という事だったんですが・・・。これは以下のような手順で発見できます。

  1. /Applicationsディレクトリ以下に格納されたVuze選択。
  2. 右クリックメニューから「パッケージの内容を表示」を選択。
  3. FinderでVuzeの中身が表示される。
  4. /Contents/Info.plistファイル発見!

あとはリンク先のページでも紹介されている通りに手順を踏めば大丈夫です。

  1. Info.plistファイルを開いて、先頭行の一番前に入っている「?ソ」という謎半角文字を削除。
  2. Info.plistファイルを上書き保存。
  3. Vuzeを再び起動・・・起動成功。

となります。
・・・普通に起動しようとするだけでいきなり失敗する辺りにVuzeの日本での普及していなさ加減が透けて見えますが、まあとにかく仕方がありませんね。とにかくこれで起動には成功すると思います。

手順3:ルーターのポートを開ける

ブロードバンドルーターのポートの開放はしなくても使えるんですけどね、BitTorrent自体は。
自分のPCに日常的にグローバルIPアドレスを割り当てて(つまりインターネット直結)いるツワモノはそういないと思いますので、家にあるルーターのポートの開放(ポート転送、ポートマッピングとか色々な言い方をします)という作業が発生します。
これは使用しているルーター毎に設定方法が違いますのでここで詳しく説明することはしませんが、BitCometのページにあるBitCometのためにポートを割り当てるというページと、そこからのリンク先が説明を丁寧にしていていいんじゃないかと思います。とにかく気合いで設定してください。
でも最近のルーターはほとんどUPuP(Universal Plug and Play)に対応していますので、ポート開放という面倒な作業は省略できるかも知れません。I2P自体もUPuPに対応しています。UPuPに対応しているルーターを使用している場合にポートがUPuPでちゃんと開いているかどうかを確認するには、どうせならJava仮想マシン環境で動くこのツールなんかを使ってみるといいんじゃないでしょうか。インストール済みのJava仮想マシンのテストをするのを兼ねてみる意味でもいい感じです。
とにかく、ここで必要になるのは

  • UDPのポート8887(I2Pが使用)
  • UDPのポート123(I2Pが使用)
  • TCPUDPの任意のポート番号(Vuzeが使用するはずだけど、ひょっとしたらいらないかも?)

の開放です。もちろんパーソナルファイアウォールとかのセキュリティソフトウェアが入っている場合はそちらで通信を許可してやらなければなりません。通信が上手く行かないような場合、問題の切り分けがしやすいようにファイアウォール関係はあらかじめ切っておくのが無難でしょう。

手順4:Vuzeの動作確認

Vuzeには基本の動作モードとして「初心者」、「中級者」、「上級者」というのが用意されていますので、じゃあ最初は初心者モードで・・・といきたいところですが、実際の所はこのモード変更、あまり役にはたっていなくて、初心者モードでもほとんどの環境設定をいじることができます。個人的にはもっと思い切って簡略化した方が受けが良くなると思うんですけどね・・・。というわけでここでは敢えて以下の設定変更を行っておいてください。

  • 「環境設定」−「モード」を開いて、「初心者モード」→「上級者モード」へと変更する

VuzeをI2Pネットワークに繋ぐには上級者モードで「環境設定」を行わなくてはなりませんので、今のうちに変更しておきます。

設定変更を保存したら、ネット上にあるトラッカーサイトから適当な.Torrentファイルを拾ってきて(Vuze自身が複数のトラッカーサイトを検索するインターフェースを持っていますので、そちらを利用するのもいいでしょう)、ダウンロードを試してみてください。普通にブラウザとかで.Torrentファイルを落としてきた場合は、Vuze上に.Torrentファイルをドラッグ&ドロップするだけでダウンロードが開始されます。もし、ここでまともにファイルがダウンロード出来ない場合には、

  1. そもそもその.Torrentで指定されたファイルがもうネットワーク上にほとんど無い可能性
  2. ルーターのポート開放が上手くできていない

を疑ってみてください。BitTorrentは人気のあるファイル程早くダウンロードでき、古いか人気のないファイルはほとんどダウンロード出来ないという性質があります。普通のファイルのダウンロードとは逆の性質ですね。この辺りは、BitTorrentが人気ソフトの修正パッチなどを配布するのに便利と言われる由縁です。某エロゲのように、修正パッチのサイズが3ギガでも大丈夫。

手順5:I2Pのインストール

さて、ここからが本番です。Vuzeだけならそれ程難しくは無いんですがね・・・。
という訳でオフィシャルページから「I2P」をダウンロードしてきましょう。ここから落とせます。2009/12/05時点での最新版は「i2pinstall-0.7.7.exe」です。バージョン番号から大体の想像がつく通り、基本的にまだまだテスト状態にあるソフトウェアですので、インストール環境によっては個別の問題が出るかも知れません(それでもI2Pのノード自体はアメリカ、欧州を中心にそこそこあるようです。)
また、動作環境としてJava仮想マシンのVer1.5以上(最新版はVer1.6)が必要です。・・・インストール済みですね?

Java仮想環境のバージョンを確認

自分のJava仮想環境のバージョンが分からないという場合は、ターミナル(Windowsならコマンドプロンプトかな)をひらいて、以下のコマンドを実行してみれば分かります。

$ java -version

実行すると以下のような返事が返ってきます。ここでバージョンを確認してください。古かった場合、Macだったらソフトウェアアップデートを実行すれば自動的に最新版のJavaがインストールされるはずです。

java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04-248-10M3025)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01-101, mixed mode)
ではインストール

Java仮想マシンのバージョンも分かった。さてI2Pをインストール・・・となったところで、Mac使いなら「オヤ?」となるんじゃないでしょうか。ダウンロードしてきたファイルの拡張子が「.exe」で提供されているためです。Windowsなら(おそらく)ファイルをダブルクリックするだけでインストール開始出来ると思いますが、Macではそれは出来ません。ではどうするか? となるわけですが心配いりません。以下のようにします。
ターミナルから以下のコマンドを実行します(以下はダウンロードしたファイルがデスクトップ上に置いてある場合です)

$ cd /Users/あなたのアカウント名/Desktop (デスクトップに移動)
$ java -jar i2pinstall-0.7.7.exe -console

実行すると以下のような表示があらわれます。

Welcome to the installation of i2p 0.7.7!
 - I2P <http://forum.i2p2.de/>
The homepage is at: http://www.i2p2.de/ 
press 1 to continue, 2 to quit, 3 to redisplay
1	←インストールを続行するために1を入力してEnter


Select target path [/Users/あなたのアカウント名/Desktop] 
/Applications/i2p	←アプリケーションディレクトリに「i2p」というフォルダを作成してそこにファイルを展開します


press 1 to continue, 2 to quit, 3 to redisplay
1	←インストールを続行するために1を入力してEnter


[ Starting to unpack ]
[ Processing package: Base (1/1) ]
[ Unpacking finished ]
[ Console installation done ]

ここでのインストールはあまり難しく考えることはないです。上で指定したSelect target pathの場所に「i2p」という名前をつけたフォルダが一つ作られるだけだからです。よく分からない所に大量のファイルがコピーされたりすることはありません。私の場合は他のアプリケーションと同じ場所が良かったので/Applications/i2pと指定しましたが、基本的にどこにインストールしてもOKです。
実際、インストールディレクトリを指定せずにブランクのままインストールを実行しても大丈夫なのですが、やってみるとフォルダを作らずにファイルをばらまくのでおすすめしません。インストールしたい場所をフルパスで指定した方がいいんじゃないかと思いますね。
続けて以下を実行します。

$ cd /Applications/i2p	←作成された「i2p」フォルダに移動します
$ ./postinstall.sh	←インストール後のために用意されたスクリプトを実行します
cp: ./lib/wrapper/macosx/libwrapper.jnilib: No such file or directory
cp: ./lib/wrapper/macosx/wrapper.jar: No such file or directory
cp: ./lib/wrapper/macosx/i2psvc: No such file or directory

このスクリプトでは幾つかエラーが返るようですが、どうもこのスクリプトで実行しているのはインストールされたファイルのパーミッションの変更、インストール後の不要なファイルの削除、OS毎に異なるライブラリファイルと実行ファイルの指定箇所へのコピー、といったところのようです。しかし、実際にはそそれらのうちの幾つかはインストール時点で完了しているようで、結果としてこのpostinstall.shはあまり意味の無いものになっているんじゃないかと思います(大まかにしかスクリプトが読めないので断言できませんが)。
これらが終わったらI2Pの起動をします。

注:
上で使用している「i2pinstall-0.7.7.exe」以外にも、ソースコードとして「i2psource-0.7.7.tar.bz2」というファイルが提供されています。こちらをコンパイルすれば「install.jar」というJava仮想マシン上で動くグラフィカルなインストーラを作成できます。インストーラを作成するにはファイルを解凍して、出来たフォルダに移動して、
$ ant pkg
と実行するだけ・・・なのですが、実際にはここでもやっぱりインストーラを作成する際に使われるファイルの中にある文字関係でのエラーが起こります(文字のエンコードに失敗する)。しかもI2P起動後に起こる幾つかのエラーが回避できるわけでもないので、無駄にインストーラコンパイルするより、コマンドラインから実行した方が手間がかからないはずです。

手順6:I2Pの起動

I2Pを起動するにはインストールディレクトリにある「i2prouter」という実行ファイルを使用します。ちなみに引数にstopやrestart、あるいはstatusなどを使用することも出来ます。

$ ./i2prouter start	←i2pを起動します
Starting I2P Service...

このコマンドが実行し終わったらWebブラウザからhttp://localhost:7657/index.jsp(I2P Router Console)にアクセスしてみましょう。以下のような画面が見えると思います。ここまで来たらI2Pは起動しています。I2Pはルーター、ブリッジ、あるいはプロキシサーバーとして動作します。

I2Pでは標準的に使用される設定はインストールディレクトリ以下のconfigファイルに最初から作られていて、ブロードバンドルーターのポート転送が正常に設定されていれば起動するだけで、しばらくすると(2〜3分?)I2Pネットワークに接続するのが確認できます。

LOGを確認してみる(エラーその1)

まず最初にエラー関係をつぶせるだけつぶしておきます。
Webの管理画面の左上部にある「Logs」を叩いてみます。具体的にはhttp://localhost:7657/logs.jspです。
Windows環境であれば、あるいはLinuxあたりであれば特に問題無く起動しているかも知れませんが、我がMac OS Xでは見事に以下のようなエラーが表示されていました。

jbigi Native BigInteger library jbigi not loaded - using pure Java - poor performance may result - see http://www.i2p2.i2p/jbigi.html for help

「『jbigi Native BigInteger library』というライブラリがロード出来なかったよ。純粋なJavaを使ってね。じゃないとパフォーマンスが出ないよ。該当ページのヘルプを見てちょうだい」・・・とまあそんな感じのことが書かれているようです。jbigi Native BigInteger libraryというのがなんなのかサッパリですが、Javaが通信をするときに使うライブラリみたいですね(多分)。
・・・まあこのエラーが表示されていてもI2Pネットワークが利用不可能になるわけではない(経験上)ですが・・・気分が良くないのは確かですよねぇ・・・。と言う訳で素直にヘルプページを見てみます。・・・どうやらFAQの一つみたいですね。Mac OS XSolaris、あるいは64bitで動作するシステムは自前の環境でこの「jbigi」という名前のライブラリをコンパイルする方が良いみたいです。という訳で色々と書いてあるんですが、私は以下のような手順で実行しました。一部手順を端折っていますが、概ねヘルプにある通りです。

  1. オフィシャルからI2Pのソースファイルをダウンロードする(i2psource-0.7.7.tar.bz2):2009/12/06現在の最新版
  2. ファイルを解凍し、中にある/core/c/jbigiに移動する
  3. 当該フォルダにある「build.sh」を適宜編集(注)して、実行する
  4. ライブラリ「libjbigi.jnilib」がビルドされる
  5. 完成した「libjbigi.jnilib」ファイルをI2Pのインストールディレクトリ以下にある/libフォルダにコピーする
  6. I2Pを再起動する

ここまでやって、先ほどエラーメッセージが表示されていた箇所に、

jbigi Locally optimized native BigInteger library loaded from the library path

というメッセージが表示されれば取りあえずライブラリの置き換えには成功したとみていい・・・んじゃないかな・・・。微妙に自信がないですが、その辺りは勘弁してください。この「build.sh」スクリプトの終わりでは、元からあった「libjbigi.jnilib」と、新しく作られた「libjbigi.jnilib」でのスピードテストが行われるのですが、こんな感じにテストの結果が返ってきます。

native run time: 	134ms (1ms each)
java run time:   	639ms (6ms each)
native = 20.970266040688575% of pure java time

コンパイルして作成したライブラリファイル(native run time)の方が元もとあったライブラリファイルの5倍ほど早くなっているのが確認できます。エラー対策という意味ではこの「libjbigi.jnilib」ファイルは用意したいところですね。

注:
このbuild.shをMacOSX環境で正常に実行するには、中身を編集する必要があります。参考までに。

#/bin/sh
#
#  Build the jbigi library for i2p
#
#  To build a static library:
#     download gmp-4.2.2.tar.bz2 to this directory
#       (if a different version, change the VER= line below)
#     build.sh
#
#  To build a dynamic library (you must have a libgmp.so somewhere in your system)
#     build.sh dynamic
#
#  The resulting library is lib/libjbigi.so
#
mkdir -p lib/
mkdir -p bin/local
VER=4.3.1	  #  ←ダウンロードするgmpのバージョンにあわせて数値を変更

if [ "$1" != "dynamic" -a ! -d gmp-$VER ]
then
        TAR=gmp-$VER.tar.gz	#  ←lzmaバージョンではなくgzバージョンを指定する
                                #  ←MacOSのtarコマンドにはlzmaオプションが指定できないため
        if [ ! -f $TAR ]
        then
            echo "Downloading ftp://ftp.gnu.org/gnu/gmp/gmp-4.3.1.tar.gz" 
            curl -O ftp://ftp.gnu.org/gnu/gmp/gmp-4.3.1.tar.gz   #  ←MacOSXにはwgetコマンドがないのでcurlに変更
        fi

        echo "Building the jbigi library with GMP Version $VER"

        echo "Extracting GMP..."
        tar -xzf gmp-$VER.tar.gz	#  ←-lzmaオプションを削除し、-zオプションを追加する
fi

cd bin/local

echo "Building..."
if [ "$1" != "dynamic" ]
then
        case `uname -sr` in
                Darwin*)
                        # --with-pic is required for static linking
                        ../../gmp-$VER/configure --with-pic;;
                *)
                        ../../gmp-$VER/configure --with-pic;;
        esac
        make
        sh ../../build_jbigi.sh static
else
        sh ../../build_jbigi.sh dynamic
fi

cp *jbigi???* ../../lib/
echo 'Library copied to lib/'
cd ../..

I2P=/Applications/i2p	#  ←I2Pのインストールディレクトリにあわせて変更
if [ ! -f $I2P/lib/i2p.jar ]
then
        echo "I2P installation not found in $I2P - correct \$I2P definition in script to run speed test"
        exit 1
fi
echo 'Running test with standard I2P installation...'
java -cp $I2P/lib/i2p.jar:$I2P/lib/jbigi.jar net.i2p.util.NativeBigInteger
echo
echo 'Running test with new libjbigi...'
java -Djava.library.path=lib/ -cp $I2P/lib/i2p.jar:$I2P/lib/jbigi.jar net.i2p.util.NativeBigInteger

途中で「make」コマンドを使用しますが、makeコマンドが無いというエラーが出た場合には「Xcode」を「ADC(Apple Developer Connection)」のページにある「Downloads」ー「Developer Tools」からダウンロードしてインストールすればOK(なはず)です。

LOGを確認してみる(エラーその2)

上のエラーが表示されている下の方、「Service (Wrapper) logs:」という場所にこんなエラーが出るんですわ。

WARNING - Unable to load the Wrapper's native library 'libwrapper.jnilib'.
             The file is located on the path at the following location but
             could not be loaded:
               /Applications/I2P/lib/libwrapper.jnilib
             Please verify that the file is readable by the current user
             and that the file has not been corrupted in any way.
             System signals will not be handled correctly.

Wrapper (Version 3.1.1) [http://wrapper.tanukisoftware.org:title=http://wrapper.tanukisoftware.org]

またライブラリ関係のエラーかよ・・・もうやだよボク・・・という感じで心が折れかけたんですが、取りあえずエラーが消えるべく試行錯誤してみました。エラーの内容は先ほどのエラーと同じような感じで、「libwrapper.jnilibというライブラリが読み込めなかったぞこの野郎! I2Pを実行したユーザーの権限で読めるようになっているか? じゃなけりゃファイルが壊れてんじゃねえか?」という感じのエラーっぽいです。
以下このエラーを消すための試行錯誤の記録。めんどかった。

  • さっきのライブラリを作ったときに落としたソース(i2psource-0.7.7.tar.bz2)の中にあるlibwrapper.jnilibをコピーして/Applications/I2P/libに置く

→失敗。エラーは変わらず。

  • エラーで表示されているリンク先のサイト(上記)に飛んで、Wrapper (Version 3.1.1) とやらを探してみる

→失敗。そもそもリンク先にVersion 3.1.1がない

  • 仕方がないので近いバージョンの3.1.2(Mac用)をダウンロードしてきて、中にあるlibwrapper.jnilibをコピーして/Applications/I2P/libに置いてみる

→失敗。エラーは変わらず。

→失敗。このソースはJava1.5環境じゃないとコンパイル出来ないんだと! 当方Java1.6・・・アホ! 死ね!

WARNING - The Wrapper jar file currently in use is version "3.1.1"
             while the version of the native library is "3.3.9".
             The Wrapper may appear to work correctly but some features may
             not function correctly.  This configuration has not been tested
             and is not supported. 
Wrapper (Version 3.1.1) http://wrapper.tanukisoftware.org 

・・・警告は出るものの、ライブラリのロード自体は成功したっぽいですね・・・。テストもしてないからサポートはしてないし、正しく動作するかどうかも分からない、なんて書かれていますが、取りあえず良しとすることにします。というかこれ以外の解決方法を知っていたら教えてください。

手順7:I2Pサービスのセットアップ

とにかく、I2Pが動き出したらセットアップしたI2PルーターをWebプロキシにしてWebにアクセスしてみます。Webプロキシとしての機能はI2Pを起動するとデフォルトで稼働していますので、自分が使っているWebブラウザのネットワーク接続をプロキシを使うように設定します。I2Pプロキシは127.0.0.1localhost)の4444番ポートで起動しています。
とりあえずgoogleあたりに接続できることを確認したら、有名な診断くんに繋いでみて下さい。「REMOTE_HOST」の値がプロキシを通さないときと通したときでちゃんと変わっているのが確認できると思います。普通に接続したときにはの診断くんの回答は、

疑惑 〜20%:proxy の可能性もわずかにあります。

という内容でしたが、I2Pプロキシを通して接続すると

疑惑 〜100%:怪しい点がたくさんあって限りなく proxy の疑いが濃厚です。

という結果になりました。
こうしてアクセスしたWebページ(Webサーバ)には、自分が繋いだという痕跡が残りません。もちろん誰かがアクセスしたというログは残りますが、それは自分ではなく他のI2Pネットワークに繋いでいる誰かを経由したログです。しかもI2Pネットワークは各I2Pノードを経由して接続するだけなので、通常のプロキシサーバなどと比べてアクセスログなどが残される確率が遥かに低いです。また、標準のI2PWebプロキシサーバは最低でも2hop(出発点から到着点までの間に2つのI2Pノードを経由)するように設定されていますので、Webサーバのアクセスログから実際の接続者を割り出すことは困難です。
これがI2Pの基本的な動きですが、ではさらにそのネットワークをBitTorrentの通信が流れるようにセッティングをしていきます。

BitTorrent用のトンネルを作成する

先ほど繋いだI2PのWeb管理画面から、http://localhost:7657/i2ptunnel/index.jsp(I2P Tunnel Manager)に繋ぎます。繋いでみるとすぐ分かると思いますが、幾つかの設定がすでにされています。先ほど使用したI2PWebプロキシもここに設定があります。順に以下のように設定を行います。

  1. 「I2P Server Tunnels」の右下にある「New server tunnel」から「Standard」を選択して「Cleate」ボタンを押します。
  2. 各項目に必要な情報を入力していきます。下記(注)参照。
  3. 入力後、画面の一番下にある「Save」を押して保存します。
  4. 「I2P Tunnel Manager」のトップページに自動で戻ります。
  5. 新しく作成したトンネルが表示されているので、「Start」ボタンを押します。
  6. しばらく待って(10秒くらい)、その後「Refresh」ボタンを押します。
  7. 作成したトンネルに文字列が表示されたことを確認して下さい(例:dsRHGGG53Ddhfx….i2p)。必ず「.i2p」で終わる文字列です。
  8. 星のマークが緑色になり、「Running」と表示されていることを確認して下さい(環境によっては表示されないかも知れません)。

入力箇所 説明
Name 作成するサーバの名前を入力します BitTorrent Tunnel
Description サーバーの説明を入力します BitTorrent用I2Pトンネル
Auto Start チェックします n/a
Target:Host 127.0.0.1 デフォルトのまま
Port 任意のポート番号を入力します 55384
Private Key File 自動で作成され、必要な情報が既に入っているはずです n/a
Profile bulk Connection デフォルトのまま

これで設定は完了です。以上が完了したらhttp://localhost:7657/index.jsp(I2P Router Console)のページに戻って画面の右下を確認して下さい。以下のような表示が出ていると思います。

これでI2P側の基本的な設定は終わりました。I2P自体は非常に多彩な機能をもっているので使い方は他にも沢山ありそうなのですが(匿名Webサーバーとか匿名メールとか、シンプルなものですがやはり匿名のBitTorrentクライアントなんかもついてます)、とりあえずBitTorrentで使用する場合のI2P側の設定は以上です。この後は続けてVuze側の設定を変更していきます。

手順7:VuzeのI2Pプラグインのインストール


さて、ここからはVuzeの設定を変更して、BitTorrentで使用する通信がI2Pネットワーク内を通るようにしてやる必要が出てきます。
それを実現するのがVuze(元々は「Azureus」というBitTorrentクライアントと、「Vuze」というコミュニケーションソフトが統合されたソフトウェアです)になるわけですが、標準状態ではI2Pに対応していません。別途専用のプラグインをインストールする必要があります。プラグインをインストールするには2つの方法が提供されています。

  • プラグインファイルをダウンロードして保存し、そのファイルを読み込ませる方法
  • Vuze自身が外部サイトに接続し、利用可能なプラグインの一覧をダウンロードしてインストールする方法

どちらも簡単に行うことができます。好きな方を選んでインストールを行って下さい。ここで必要になるプラグインは「I2P Network Plugin」というものです。
インストールを実行するとポップアップでエラーが表示(計2つ)されます。これをそれぞれ「環境設定(Preference)」から設定の変-更をすることで消していきます。が、それより前にトラブルシューティングに役に立つ機能を有効にしておきます。

  • 「環境設定」ー「ログ」ー「ログを保存」「ログ記録を有効にする」の2つにチェックを入れる

ログはかなり詳細に吐き出させる事が出来るので、何か問題が起きたときの解決の糸口になります。また同時に以下もやっておくと便利です。

  • 「ツール」ー「コンソール」を選択する

これを選択するとVuzeのメイン画面の左ペインに「コンソール」という表示が現れ、選択して開くと上で設定したログがここに流れるようになります。

インストール直後のI2Pプラグインエラーの解消

インストールするとすぐにポップアップでエラーが表示されると思います。ここではそれを解消します。

I2P install location not defined,plugin initialisation failed.

「I2Pのインストール場所が定義されていないのでプラグインの初期化に失敗した」という内容のエラーです。以下の設定を変更してください。

  • 「環境設定」ー「プラグイン」ー「I2P Network Plugin」内の「I2P install location」に、I2Pのインストールディレクトリを指定する

今までI2Pの方で行ってきた設定に従うと、「/Applications/i2p」となります。I2Pのインストール環境にあわせて変更してください。

I2P Plugin requres that the 'inform tracker of limitation' setting for 'Connection' is deselected -please amend it

「I2Pプラグインは「接続」にある「トラッカーに制約を通知」のチェックが外れている事を必要としています。修正してください」という内容のエラーです。以下の設定を変更してください。

  • 「環境設定」ー「接続」ー「プロキシ」ー「トラッカーに制約を通知」のチェックを外す

「トラッカーに制約を通知」のチェックを外すには、そのすぐ上にある「ピア間の通信でプロキシを使用」のがチェックされている必要があります。チェックを入れた後で「トラッカーに制約を通知」のチェックを外してください。
以上の設定が終わったら、一度Vuzeを再起動してください。

I2Pプラグインの動作をログで確認する

ここまでの修正でポップアップによるエラー通知は出なくなったと思います。ですがまだ別の所に別のエラーが出ていますのでそれを続けて修正していきます。

  • 「ツール」ー「プラグイン」ー「ログ」ー「I2P Network Plugin」を選択する

これを選択するとVuzeのメイン画面の左ペインに「I2P Network Plugin」という表示が現れ、選択して開くとI2P Network Pluginに関連したログがここに流れるようになります。I2P Network Pluginのログを確認すると現時点の設定では以下のようなエラーが出ていることが確認できると思います。まず1つめ。

I2P poxy port not defined, can't initialise

これはI2Pプロキシのポートが設定されていないために初期化に失敗した、というエラーですかね。以下のように設定を変更してください。

  • 「環境設定」ー「プラグイン」ー「I2P Network Plugin」内の「Network relay proxy port」に任意のポート番号を入力する(例:15223)。
UPnP disabled for the plugin, not attempting port mapping

UPnPプラグインで使用不可のため、ポートマッピングの割り当てを試みません、というエラー(?)ですかね。以下のように設定を変更してください。

以上の設定が終わったら、一度Vuzeを再起動してください。以下のようなログが表示されれば成功です。ポップアップでもメッセージが表示されるので分かりやすいと思いますが。

Established network proxy on port 15223
Initialising I2P Socket Manager
I2P Router connection succeeded

ここまででI2P Network Pluginプラグインに関する設定変更は終わりです。

手順8:Vuzeの設定変更

続けて、プラグイン以外の設定を中心に見ていきます。

Vuzeの接続設定を変更する

Vuzeの接続設定を変更していきます。

  • 「環境設定」ー「接続」ー「TCP待ち受けポート」を上で作成したI2Pトンネル(BitTorrent Tunnel)のポート番号に変更する(例:55384)
  • 「環境設定」ー「接続」ー「一般のIPネットワーク」のチェックを外す
  • 「I2Pネットワーク」のチェックを入れる
  • The Onion Routerネットワーク」のチェックを入れる
Vuzeのプロキシ設定を変更する

続けてプロキシに関する設定を変更していきます。

  • 「環境設定」ー「接続」ー「プロキシ」ー「トラッカーとの通信にプロキシを使用」にチェックを入れる
  • 「Socksプロキシを使用」にチェックを入れる
  • ホスト名とポートに以下の値を入れる
入力箇所 説明
ホスト名 プロキシサーバが動いているアドレスを入力する 127.0.0.1
ポート 「I2P Network Plugin」内の「Network relay proxy port」に合わせて設定する 15223
ユーザ名 プロキシで設定している場合に入力する 空白
パスワード プロキシで設定している場合に入力する 空白
  • 「ピア間の通信でプロキシを使用」にチェックが入っているのを確認する
  • 「トラッカーに制約を通知」のチェックが外れているのを確認する
  • 「Socksバージョン」を「V4」から「V4a」に変更する
  • 「ピア間の通信もトラッカーとの通信と同じプロキシ設定を使用」にチェックを入れる

以上の設定が終わったら、一度Vuzeを再起動してください。起動後に以下のようなログが表示されれば成功です。

connect request to //IPアドレス
delegating unresolved
(中略)
I2P router ping response = OK, elapsed = 26
Vuzeのトラッカー関連の設定を変更する

トラッカークライアントとしての設定を変更していきます。

  • 「環境設定」ー「トラッカー」ー「クライアント」ー「トラッカーに通知するIPアドレスを個別に指定」の欄に上で作成したI2Pトンネル(BitTorrent Tunnel)の作成時に生成された文字列(例:dsRHGGG53Ddhfx….i2p)をペーストする

このハッシュ値はこちらからi2pネットワークに接続したとき、トラッカーまたはピアに対してアナウンスされるアドレスです。普通の通信におけるIPアドレスに相当する役割をこのハッシュ値がする(んだと思います)。この値を指定しておかないとi2pネット側から自分側の宛先が分からないので、優良なピアと接続されにくくなる・・・とどこかで読んだんですけど・・・ソースが不明です。

Vuzeのアップデート関連の設定を変更する

Vuzeのアップデートの設定を変更します。

  • 「環境設定」ー「インターフェース」ー「起動時にVuzeの最新バージョンを確認する」「定期的にVuzeの最新バージョンを確認する」の2つのチェックを外す
  • 「環境設定」ー「プラグイン」ー「プラグインアップデート」ー「プラグインのアップデートを確認」のチェックを外す

アップデートまわりのチェックをオフにした形になりますが、I2P Network Pluginのオフィシャルページにも書いてあることですので、無用なトラブルを避ける意味でもチェックを外しておきます。

手順9:I2Pネットワーク経由でのファイルのダウンロード

ここまでやればI2P経由でのBitTorrentの利用が出来るはずです。実際に動きもします。ただ、動作上で気になる点が。

  • 本当にこのプラグインを利用することでI2Pネットワーク経由での動作が出来ているのか

という一番重要な点なのですがね・・・。ファイアウォールソフトウェアとかで必要なポート以外を全て塞いでテストするとかで確認が可能なんでしょうが、Macでは適当なフリーソフトが見つかりませんでした。アプリケーションレベルでのインバウンド/アウトバウンドを制御できるようなソフトがあれば良かったんですが。
結果として、I2PトンネルとI2Pプラグインを利用する場合に、Vuzeとインターネットの間でどのようにパケットが流れるのかイマイチ把握しきれなかったというオチがついてしまいました。I2PトンネルとVuzeの間の通信、あるいはVuzeと外部ネットワークの通信の全てがどう流れていくのかがはっきりと分からなかったんです。私の想像するそれらの通信経路と実際の挙動が異なっているのがその理由なんですが(Vuzeに対して明示的にI2Pトンネルを使うように指示しているにも関わらず、I2Pトンネルが止まっている状態でVuzeを使用したファイルのダウンロードが出来てしまったり、などです)。
その辺りはVuzeがどう通信を行っているのか、そもそもBitTorrentの通信がどうなっているのかという全貌をしっかりと分かっていないとダメだという事になると思いますが・・・どうにも知恵と知識が足りないのが原因ですね。その辺り誰か詳しい人がいたら教えて欲しいですね。