Swarm: 高速なネットワークトラフィック解析ライブラリ

Swarm: 高速なネットワークトラフィック解析ライブラリ

C++で動作するネットワークトラフィック解析ライブラリを作成しました。(github)提供している機能はプログラミング初心者がlibpcapを使ってパケットの構造を調べるようなコードでやっていることとあまり大差はありませんが、毎回同じようなプロトコル解析処理を個別に作成するのが煩わしかったり、既存のリッチなプロトコル解析ツールだとプログラム解析後のデータ処理が面倒・あるいは性能が出にくいという課題があったりなどの理由から、自分で再利用可能なライブラリとして作成していました。

パケットからプロトコルを解釈し、プログラマが利用しやすい形で結果を提供します。集計・分析もC++のコードで記述できるため、高速な実ネットワークトラフィックのリアルタイム分析も可能です。例えば、ネットワークトラフィックに含まれるDNSの問い合わせのドメイン名を全て出力するには、以下のようなコードで記述することができます。

#include <swarm.h>
#include <iostream>

// コールバック関数を持つswarm::Handlerクラスを継承させる
class DnsHandler : public swarm::Handler { 
  // コールバック関数
  void recv (swarm::ev_id ev, const swarm::Property &p) {
    // DNS問い合わせに含まれるドメイン名を表示
    std::cout << p.param ("dns.qd_name")->repr () << std::endl;
  }
};

int main () {
  // デコーダを作成
  swarm::NetDec * nd = new swarm::NetDec (); 
  // DNSパケットが到着した場合に、DnsHandlerのコールバックを呼び出す設定
  nd->set_handler ("dns.packet", new DnsHandler ()); 

  // ファイルから読み込む場合
  // swarm::NetCap * nc = new swarm::CapPcapFile ("./my-dump.pcap");

  // NIC(eth0)から実トラフィックをキャプチャ
  swarm::NetCap * nc = new swarm::CapPcapDev ("eth0"); 

  // デコーダとパケットキャプチャを接続
  nc->bind_netdec (nd); 
  // 解析処理スタート
  nc->start ();
}

特徴

  • zero-copyベースの解析処理: 到着したパケットデータに対して基本的にメモリコピーをしないことにより、高速な解析処理を実現します。
  • シンプルなAPI: 解析結果の参照では実パケットに含まれる生のバイナリデータにアクセスすることもできますし、それぞれのフィールドを適切な表示形式へ変換してくれる機能も実装されています。また、パケット到着などのイベントによって呼び出されるコールバックだけでなく、タイマーで駆動するコールバックも用意されているため、
  • 拡張性の高い構造: 解析するプロトコル間で依存関係の低い設計になっており、ライブラリに新しいプロトコルを組み込むのが容易になっています。また、ライブラリ外でも自作したプロトコル解析モジュールを自由に組み込むことができます(サンプル

今後のToDo

  • TCPのセッション管理・ペイロード再構築
  • TCP上で動作するプロトコル(HTTP, HTTPS, IRCなど)のサポート
    • マルチスレッドによるトラフィック解析処理の並列化

URL

Comments