P2Pメッセンジャーを企業から独立させるという考え方は新しいものではありませんが、そのための新しいプロトコルとクライアントアプリケーションの開発は、非常に費用と時間がかかるプロセスです。 しかし、すべてがすでに考え抜かれ、長い間洗い流されてきた古き良きXMPPを使用するとどうなるでしょうか?
しかし、これは本当のピアツーピアではない、とあなたは言う、XMPPはそれ自身のサーバーとドメインが動作する必要がある。 これはそうですが、ローカルホストでサーバーを起動し、I2P仮想ネットワークの隠しサービスを使用して他のユーザーのサーバーと通信できます。 I2Pを使用すると、ホスティングでドメインの費用を支払う必要がなくなり、 犯罪のオンライン監視から通信を保護できます 。
したがって、以下を取得します。
- ユーザーデバイスと本格的なサーバーの両方で実行できるハイブリッドP2Pメッセンジャー。
- 他のP2Pメッセンジャーにはない機能:オフラインメッセージ、連絡先と履歴の「クラウド」の保存、1つのアカウントでの複数のクライアントの作業。
- あらゆる好みに対応した既製のクライアントアプリケーション。
- I2Pを使用しているため、さまざまな監視(マットあたりの敷料)には耐えられません。
実装に進みましょう...
I2Pをインストールしてサーバートンネルを作成する
このガイドでは、軽量C ++ i2pdクライアントをI2Pルーターとして使用します。 インストール手順はドキュメントに記載されています 。
インストール後、サーバーI2Pトンネルを作成します。これは、XMPPサーバーが世界中で利用できる仮想アドレスです。 tunnels.confファイルに 、次の行を追加します。
[prosody-s2s] type=server host=127.0.0.1 port=5269 inport=5269 keys=prosody.dat [prosody-c2s] type=server host=127.0.0.1 port=5222 inport=5222 keys=prosody.dat
ローカルホストでのみ使用する場合は、prosody-c2sセクションを省略できます。 i2pdを再起動して設定を適用します。 I2P tunnels
ページのWebコンソールhttp://127.0.0.1:7070/で、作成されたトンネルのI2Pアドレスを探しています。
ログを掘り下げることで、新しいトンネルのb32アドレスを見つけることもできます。
grep "New private keys file" /var/log/i2pd/i2pd.log | grep -Eo "([a-z0-9]+).b32.i2p" | tail -n1
このxxx.b32.i2pアドレスを保存します。これはXMPPサーバーのドメインになります。
XMPPサーバーをインストールして構成する
XMPPサーバーとして韻律を使用します。これは最も軽量で、I2Pを介して作業するための既製のモジュールがあります。 インストールは公式ドキュメントに記載されています ; Ubuntuでは、 apt install prosody
は基本的に行われます。
mod_darknet
を機能させるには、lua bit32ライブラリmod_darknet
必要です。 luaバージョンが5.2未満の場合(ほとんどの場合)、 apt install lua-bit32
を実行します。
mod_darknet
モジュールをインストールします。 韻律は、Socks5 i2pdサーバーを介して発信接続を行う必要があります。 このファイルをprosodyモジュールディレクトリ、通常は/usr/lib/prosody/modules
ダウンロードします 。
次に、config /etc/prosody/prosody.cfg.luaを編集します。 xxx.b32.i2p
を自分のアドレスに置き換えます。
interfaces = { "127.0.0.1" }; admins = { "admin@xxx.b32.i2p" }; modules_enabled = { "roster"; "saslauth"; "tls"; "dialback"; "disco"; "posix"; "private"; "vcard"; "ping"; "register"; "admin_adhoc"; "darknet"; }; modules_disabled = {}; allow_registration = false; darknet_only = true; c2s_require_encryption = true; s2s_secure_auth = false; authentication = "internal_plain"; -- On Debian/Ubuntu daemonize = true; pidfile = "/var/run/prosody/prosody.pid"; log = { error = "/var/log/prosody/prosody.err"; "*syslog"; } certificates = "certs"; VirtualHost "xxx.b32.i2p"; ssl = { key = "/etc/prosody/certs/xxx.b32.i2p.key"; certificate = "/etc/prosody/certs/xxx.b32.i2p.crt"; }
韻律を設定する最後の手順は、暗号化証明書を生成することです。 nixでは、次のように行われます。
openssl genrsa -out /etc/prosody/certs/xxx.b32.i2p.key 2048 openssl req -new -x509 -key /etc/prosody/certs/xxx.b32.i2p.key -out /etc/prosody/certs/xxx.b32.i2p.crt -days 3650 chown root:prosody /etc/prosody/certs/*.b32.i2p.{key,crt} chmod 640 /etc/prosody/certs/*.b32.i2p.{key,crt}
prosodyサーバーを再起動して設定を適用します。
ここで少し余談が必要です。 I2Pネットワークでは、すべての接続はエンドツーエンド暗号化で暗号化されます。ここでは、追加の暗号化は不要であると思われます。 しかし、実際には、プレーンテキストを使用するようにすべてのプログラムを構成しようとするよりも、キーを生成する方が簡単であることがわかりました。 あなたは試すことができますが、私はあなたに警告しました。
アカウントの作成とクライアントの接続
管理者アカウントを追加します。
prosodyctl adduser admin@xxx.b32.i2p
次に、XMPPクライアント(たとえば、 Pidgin )を構成します。
ローカルホストに接続する場合、クライアント設定でサーバー127.0.0.1ポート5222への接続を示します。
I2P経由でサーバーにリモートで接続する場合、Socks5プロキシ設定で127.0.0.1:4447を指定します。
すべてが正しく行われた場合、他のユーザーをI2Pフェデレーションに追加して対応できます。 I2P内のサーバーに対応するように、通常のインターネット上の既存のサーバーを構成することもできます。 これを行うには、他のすべてのユーザーが自分の構成にドメインの韻律マッピングを追加する必要があります。 例えば、これは私がi2p.rocks
サーバーと通信するためにi2p.rocks
方法です:
darknet_map = { ["i2p.rocks"] = "ynkz7ebfkllljitiodcq52pa7fgqziomz4wa7tv4qiqldghpx4uq.b32.i2p"; ["muc.i2p.rocks"] = "ynkz7ebfkllljitiodcq52pa7fgqziomz4wa7tv4qiqldghpx4uq.b32.i2p"; }
それだけです。 ハッピーチャット!