saku – P2P匿名掲示板

P2Pにはあまり良いイメージを持っていないという人が多いかもしれません。しかしP2Pという技術に悪いことなんて何もなくて、一般的に利用されている技術です。今は違いますが、リリース直後のskypeでは利用者間でP2P通信を行っていました。

さて、今から15年くらい前、このP2P通信技術を使ってメッセージ交換を行うデータ分散型匿名掲示板システムの為のプロトコル(新月/shinGETsu)がネット上の有志で作られました。当時このプロトコル仕様を元にして、いくつかの実装が作られたようです。

一時期は盛り上がっていたようですが、現在はほとんど人がいません。おまけに現在も継続してメンテナンスされている実装は、python3で書かれている 朔(saku)だけなようです。ただ、接続ログを見ているとGo言語で書かれた合(gou)が動いているノードもいくつかあるようですが。

なぜ今sakuを運用するのか

以前動かしていた時はアクティブユーザが多く、掲示板にspamメッセージが大量に流れ込んだり、保存しているだけでも危険なファイルが流れてきたりと不穏な感じがしました。それが今ではユーザが減り当たり障りのないメッセージがたまに流れてくる程度で運用に気を気を使わなくて良くなりました。

常々pythonに慣れたいと思っている事もあって、適当なサイズのsakuはソースを読むのも勉強になるかなーとかとか。

朔(saku)をインストールして実行してみる

saku を動かすと決めたら、インストール前にいくつか決めなくてはならない事があります。

自分専用なのか、不特定多数に公開するのか

公開ゲートウェイノード(*1)のように不特定多数の人へ開放する事も、自分専用のノードとして運用する事も可能です。しかし、運用に慣れるまでは自分専用ノードとして運用するのが良いと思います。

(*1) 公開ゲートウェイノード情報は、https://shingetsu.info/ に載っています。

ノードの設置場所

saku をどこのサーバで動かすのか?という問題があります。自宅内に設置するのか、若しくは外部に設置するのか。それぞれで必要となる技術要件が異なってきます。慣れないうちは自宅の仮想環境などで何度か構築をしてみるのが良いと思います。

自宅に設置する

saku は(多分)起動時に直近の更新情報を取りに行くような動きをするので、24時間運用する必要はないかもしれません。しかし、この場合でも隣接ノードからの接続要求は受け入れる必要があります。

一般的な自宅のネットワーク環境は、境界にルータを設置しNAT等のアドレス変換をさせている事が多いと思います。なのでポートフォワーディングやIPフィルタリングを適切に設定する事が必要です。

外部に設置する

外部に遊んでいるサーバがあれば、そこに間借りするのも良いでしょう。稼働に必要なリソースが気になると思いますが、保持する掲示板のメッセージ量で変わってきます。保持するメッセージ数が少なければ、ほとんどリソースを使いません。

ぼくが動かしているノードでは保持している掲示板量がかなり少ないので、あまり参考にならないかもしれませんが、この位のリソース消費量です。

この状態でsaku が専有する物理メモリは30MBytes程度、ストレージ使用量は115Mバイトとわりとこじんまりとしています。ネットワーク転送量もテキストデータの転送が主体なので無視できるレベルです。

ところで外部サーバへsakuを設置する場合、自分が掲示板へアクセスするための手段を考えなくてはなりません。

公開ゲートウェイノードとして運用する場合でも管理者として接続する為には、接続元IPアドレスを設定ファイル内に記述しなくてはなりません(IPアドレスベースのACLになっている)

VPNを設置する等、いろいろな解決手段が考えられると思います。ぼくはお手軽に自宅の境界ルータと外部ノード間にGREトンネルを掘ってみました。

想定する環境

OS Ubuntu 20.04  LTS
saku 設置方法 インストール型
自宅環境足回り フレッツ光ネクスト PPPoE 接続
自宅環境N/W 192.168.0.0/24
ノード側N/W 172.16.1.0/24

関連ファイルツリー

Makefileに変更を加えなければ、saku は/usr/local/以下にファイル一式がインストールされます。

近頃ではバージョンが上がる事はあまりないのですが、バージョンアップ時の作業を容易にする為にいくつか設置場所を変更しています。

  • /usr/local/saku-release-バージョン/以下へ配置する
  • 設定ファイル、cacheディレクトリをsakuツリーの外側に作る
  • symlinkを張り、バージョンアップ後も/usr/local/sakuでアクセスできるようにしている

インストール手順

windowsの事はよくわからないので、linux環境へのインストール方法になります。パッケージでは提供されていないので、ディストリビューションが異なっても基本的に同じ手順で設置できると思います。

pythonパッケージのインストール

ソースファイルのダウンロード

Makefileの変更
  • インストールパスの変更
  • 起動ファイルをinitからsystemdに変更

下記、パッチファイルをどこかに置いてからパッチを当てます。

以下パッチファイルです。

saku をインストール

インストールしてから、symlinkを張り、cacheディレクトリ作成、設定ファイルの設置を行います。

バージョンアップがあった場合は、同様にインストールをしてから symlink を張り替えればキャッシュと設定ファイルを再利用できます。

設定ファイルを設置

起動前に/usr/local/etc/saku/saku.iniを設定します。これを忘れてsaku を起動してしまうと、想定していないところにディレクトリが掘られたりファイルが配置されたりと混乱の元になります。

pathセクションは間違えやすいので、よく確認すること。重要なのはprefix,cache_dirです。

Gatewayセクションは、IPアドレスベースのACL設定を書いていきます。

うちの環境は、家庭内NWが192.168.0.0/24なので以下のようになります。公開ゲートウェイノードにするのならば、visitorの項目を
visitor: .と記述します。

その他、掲示板の保存期間等の項目は好みでどうぞ。

saku の起動

ノードが再起動した時でも自動的にプロセスを起動するように enable指定しておきます。

ログは/usr/local/saku/var/log/saku/%Y-%m-%dに出力されます。しばらく待っていると他ノード間でpingを送ったりjoinしている様子が見えると思います。

自宅内NWからsaku へ接続

さて、外部サーバ上で無事にsaku プロセスを起動できたと思います。しかし、IPアドレスベースのACLがかかっているのでhttp//IPアドレス:8000/にアクセスしても、掲示板を読むことができません。

そこで、自宅の境界ルータ – 外部サーバ間にGREトンネルを張り、掲示板を読めるように設定していきます。

ネットワーク MTU
自宅境界ルータ 192.168.0.0/24 1454
外部サーバ 172.16.1.0/24 1500

自宅境界ルータ

自宅の足回りはフレッツ光ネクストを使い、PPPoEで接続しています(MTU: 1454)

外部サーバ

外部サーバはethernet(MTU:1500)で接続されていますが、対向のMTUと合わせて MTUを1430に設定します。

疎通の確認

互いにpingを打って確認していきます。

自宅 → 外部サーバ

複数のIPアドレスを持っているノードの場合は、pingを打つときにsrc addr.を指定すべきです。意図しないsrc addr.で送信すると戻り経路が無くてdefault routeへ送られた結果、疎通に失敗と誤解される事が割とよくあります。

外部サーバ → 自宅

戻りも問題ない事が確認できました。

もしも通らないときは、tcpdumpを使いパケットを確認してみましょう。

掲示板へアクセス

自宅PCからブラウザでアクセスしてみます。IPアドレスは、外部サーバの内側のIPアドレスです。 http://172.16.1.1:8000/

無事に掲示板画面が開けました!

技術的課題

外部サーバ上で無事にsakuを動かすところまで成功しましたが、いくつかの技術的な課題が残っています。

  • 自宅のIPアドレスが変更された時、GREトンネルを自動で張り直すようにしたい
  • 外部サーバが再起動された時、GREトンネルを自動で張るようにしたい
  • 外部からのリクエストをsakuが直接受けるのではなくnginx等でreverse proxyしたい
  • 古いsaku で実装されていた、過去の掲示板データを自動収集する仕組みを組み込みたい
  • etc…

分散掲示板システムなので、いつでもプロセスを落として実験できるのも気が楽で良いところです 🙂

投稿日: publised:
updated:
カテゴリー PC

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)