1

特定のサービスを監視するための統計監視プラットフォームをセットアップしたいのですが、どうすればよいかわかりません。傍受されたデータを処理することは私の関心事ではなく、それをどのように処理するかだけです。1 つのアイデアは、クライアント アプリケーションとサービスの間にプロキシを設定して、すべての TCP トラフィックが最初にプロキシに送信されるようにすることでした。プロキシは、傍受されたメッセージを待機中のスレッド/フォークに委任して、メッセージを渡し、結果を受け取ります。もう 1 つは、クライアントとサービスの間のトラフィックを盗聴しようとすることでした。

私の主な目標は、クライアントとアプリケーション間の伝送速度の重大な損失を回避し、クライアントとサービス間の 100% 完全な通信を実現することです。

環境: Ubuntu 8.04

言語: c/c++

バックグラウンドでは、メモリ内で完全に実行されている sqlite DB を使用するか、プロセスに従属する 20 ~ 25 MB の memcache デーモンを使用することを考えていました。

更新: 具体的には、memcache デーモンのキーの使用状況を追跡しようとしており、セット/取得の成功/失敗の数をキーに保存しています。ほとんどのキーには、一種の名前空間を作成するために、ある種の区切り文字 [`|_-#] が含まれているという考え方です。アイデアは、デーモンとクライアントの間に介入し、構成されたセパレーターでキーを分割し、それらの統計を記録することです。

4

4 に答える 4

1

正確に何を追跡しようとしていますか?パケットまたはバイトの単純なカウント、または基本的なヘッダー情報が必要な場合は、それ iptablesを記録します。

iptables -I INPUT -p tcp -d $HOST_IP --dport $HOST_PORT -j LOG $LOG_OPTIONS

より詳細な情報が必要な場合はiptables ULOG、分析のために各パケットをユーザー空間に送信するターゲットを調べます。

詳細ドキュメントについては、 http://www.netfilter.orgを参照してください。

于 2008-11-08T05:08:56.713 に答える
1

スニファの方法を使いたい場合は、tcpdump や libpcap の代わりに tcpflow を使用する方が簡単かもしれません。tcpflow は TCP ペイロードのみを出力するため、データ ストリームを自分で再構成する必要はありません。たくさんのプログラムをくっつけるのではなく、ライブラリを使用したい場合は、libnid に興味があるかもしれません。

libnids と tcpflow は他の Unix フレーバーでも利用でき、Linux だけに制限されません (iptables とは対照的に)。

http://www.circlemud.org/~jelson/software/tcpflow/ http://libnids.sourceforge.net/

于 2008-11-08T22:16:32.910 に答える
0

1 つのアプローチについて言及していませんでした。必要な統計を記録するように memcached またはクライアントを変更できます。これはおそらく最も簡単でクリーンなアプローチです。

プロキシと libpcap アプローチの間には、いくつかのトレードオフがあります。

- If you do the packet capture approach, you have to reassemble the TCP
  streams into something usable yourself. OTOH, if your monitor program
  gets bogged down, it'll just lose some packets, it won't break the cache.
  Same if it crashes. You also don't have to reconfigure anything; packet
  capture is transparent. 

- If you do the proxy approach, the kernel handles all the TCP work for
  you. You'll never lose requests. But if your monitor bogs down, it'll bog
  down the app. And if your monitor crashes, it'll break caching. You
  probably will have to reconfigure your app and/or memcached servers so
  that the connections go through the proxy.

要するに、プロキシはおそらくコーディングが簡単ですが、それを実装するのは大変な作業になる可能性があり、完璧にするか、キャッシュを削除する方がよいでしょう. アプリまたは memcached を変更することは、私にとって最も健全なアプローチのようです。

ところで: memcached の組み込みの統計レポートを見たことがありますか? あなたが望むものには十分な粒度ではないと思いますが、それを見たことがない場合は、実際の作業を行う前に見てください:-D

于 2008-11-08T07:06:01.393 に答える
0

iptables は、ユーザー空間のパケット キューイング ライブラリであるlibipqを提供します。マンページから:

Netfilter は、スタックからパケットを渡してユーザー空間にキューイングし、これらのパケットをカーネルに戻して、パケットの処理方法 (ACCEPT や DROP など) を指定するためのメカニズムを提供します。これらのパケットは、カーネルに再注入する前に、ユーザー空間で変更されることもあります。

パケットを libipq に転送するように調整されたiptablesルールを設定することにより、それらの判定を指定することに加えて、統計分析のためのパケット検査を行うことができます。

別の実行可能なオプションは、libpcap または socket-filter サポートを備えた PF_PACKET ソケットを使用して手動でパケットをスニッフィングすることです。

于 2008-11-08T13:32:54.013 に答える