ネットワーク監視ツールPasTmon

 PasTmonはパッシブ型のトラフィック・モニタだ。ネットワークを監視して、どのクライアントがどのサービスと通信したかや、通信の開始時刻と継続時間を記録する。ユーザは、PHPによるWebインタフェースを利用して結果を参照し、不適切なWebサービスと接続しているホストの有無、サービスへのアクセス回数が異常に多いホストの有無、応答時間の大幅な遅延の有無などを確認できる。

 Ubuntu、openSUSE、FedoraのリポジトリにはPasTmonのパッケージはない。PasTmonは、バージョン番号はまだ小さいが、3年前からリリースを重ねてきたソフトウェアだ。今回はバージョン0.12を試用してみた。64ビットのFedora 9マシンで、通常の「./configure; make; sudo make install」コマンドでソースからビルドした。PasTmonをビルドするには、libpcap、pcre、libdbiの各開発パッケージをインストールする必要がある。PasTmonを実行するには、さらにPostgreSQLとlibdbi-dbd-pgsqlも必要だ。Webインタフェースを利用するには、Apache、PHP、jpgraphのインストールも必要となる。

 Fedora 9では、パッケージ名はlibpcap-devel、pcre-devel、libdbi-devel、libdbi-dbd-pgsql、postgresql-serverだ。jpgraphはFedora 9のリポジトリにはない。openSUSE 11では、パッケージ名はlibpcap-devel、pcre-devel、libdbi-devel、libdbi-drivers-dbd-pgsql、postgresql-serverだ。jpgraphはopenSUSE 11のリポジトリにはない。Ubuntu Intrepidでは、パッケージ名はlibpcap-devlibpcre3-devlibdbi0-devlibdbd-pgsqlpostgresqlだ。

 デフォルトのインストール先は/usr/localではなく/usr/local/pastmonだ。PasTmonに関する全ファイルを同じディレクトリ内に格納できて都合がいい。

 PasTmon本体のセットアップだけでインストールは終わりではない。その後さらに、PostgreSQLデータベースをセットアップしたり、init.dのファイルを使ってPasTmonが自動で起動するようにしたり、PHPのWebインタフェースをセットアップしたりといった作業が必要となる。「./configure; make; make install」の手順はプロジェクトのドキュメントで解説されているので、それ以外に必要な手順を説明しておこう。PostgreSQLデータベースをセットアップするには、/usr/local/pastmon/bin/postgresql_adminディレクトリにインストールされたcreate_database_summaryスクリプトをrootで実行する。このとき、postmon2という名前のデータベースが既にあると、スクリプトによって黙って削除されてしまう。Fedoraマシンの場合、次のようなコマンドでPostgreSQLデータベースのセットアップとinit.dファイルの作成を行う。他のディストリビューションの場合は、init.dファイルの編集が必要なことがある。

# cd /usr/local/pastmon/bin/postgresql_admin
# ./create_database_summary

# cd /usr/local/pastmon/etc
# install -m 700 rc_pastmon.redhat  /etc/init.d/pastmon
# chkconfig --add pastmon
service pastmon start

 PasTmonのPHP Webインタフェースは/usr/local/pastmon/share/pastmonphpにインストールされている。Apacheからこのディレクトリにアクセスできるようにするには、設定の追加が必要だ。その前に、まずはjpgraphをダウンロードして展開し、PHPのinclude_pathに追加しておこう。そのうえで、次のようなコマンドを実行する。これで、http://localhost/PasTmonでPHP Webインタフェースにアクセスできるようになり、jpgraphライブラリをWebインタフェース用にセットアップできる。

# cd /etc/httpd/conf.d
# vi PasTmon.conf

Alias /PasTmon /usr/local/pastmon/share/pastmonphp

<Location /PasTmon>
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
    Allow from ::1
</Location>

# cd /usr/local/
# tar xzvf /.../jpgraph-2.3.3.tar.gz
# ln -s jpgraph-2.3.3 jpgraph
# cd jpgraph
# mv src jpgraph
# vi /etc/php.ini
...
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;

; UNIX: "/path1:/path2"
include_path = ".:/php/includes:...:/usr/share/pear:/usr/local/jpgraph"
;
...

# service httpd restart

 PasTmonのメインの設定ファイルは/usr/local/pastmon/etc/pastmon.confだ。デフォルトのデータベース名を使わなかった場合や、PostgreSQLをPasTmonとは別のマシンで稼動する場合は、アクセスに必要な情報やデータベースの場所を、pastmon.confのoutput_DBIセクションで、キーと値のパラメータで設定する。設定ファイルには詳しいコメントが付いている。データベース・パラメータのセクションでは設定の変更が必要になることがある。設定変更の詳細については、/usr/local/pastmon/share/pastmondocs/install_guide.pdfを参照してほしい。

 PasTmonをインストールして稼動させるまでは、思ったより手間がかかった。私は最初、適切なDBIプロバイダ・パッケージをインストールしておらず、/var/log/messagesに妙なバックトレースが記録されていた。その問題に偶然気付いて、やっと解決できた。

 次はいよいよPasTmonの起動だ。初めての起動から、表示に足るだけの十分なデータがPostgreSQLデータベースに書き込まれるまでには、しばらく時間がかかる。その後、http://localhost/PasTmonをWebブラウザで開くと、[level 1][level 2][All][favorites][Internal]という5項目のメニューが表示される。最後の3つは、すべてのデータを時間/日/週ごとに集計して表示する。[favorites]ページはPasTmonを使い始めた時点では空だ。[internal]ページは、ネットワーク・インタフェースで受信したパケット数などの情報を表示する。目的のデータをきちんと取得しているかどうかを手早くチェックしたい場合などに便利だ。

 [level 1]メニューでは、5分間隔で集計したデータを参照できる。どのクライアントがどのサービスにどんな頻度で接続しているかをすばやく確認可能だ。[level 2]メニューでは、1カ月以上が経過したデータを参照できる。なお、5分間隔でデータをログに記録したままだと、データベース・テーブルがどんどん大きくなる一方だが、PasTmonに付属のpastmon/bin/pastmon_summarise_level_2.plというスクリプトを使えば、アーカイブ・テーブルにデータを移動できる。これなら、新しい情報のみをある程度決まったサイズでテーブル内に保持できるため、最近のイベントに関するクエリが次第に遅くなっていくという事態を防げる。crontabで次のようなエントリを指定しておくと、pastmon_summarise_level_2を使って、32日以上が経過したイベントをアーカイブに移せる。

0 1 * * * /usr/local/pastmon/bin/pastmon_summarise_level_2.pl \
--age=32 --interval=3600 --delete 2>&1 \
| logger -t pastmon_summarise_level_2.pl

pastmon1_thumb.png
PastTmonの[level 1]ページ

 [level 1]ページ(右図を参照)の最上部の表は、表示条件を設定するごとにその内容が追加されていく。その下の[Filter]セクションはその名のとおり、フィルタを設定する部分だ。その中の[Signature filter]コンボボックスでは、HTTP Get、SMTP EHLO、TCP SYNACKなど、特定の種類の処理のみに表示を絞り込める。フィルタを入力していない状態では、ページ下部の円グラフに、実行回数の多かった処理の情報(図の例ではHTTP Get)と、SYNACK、ICMP、DNSのトランザクションに関する情報が表示される。

 フィルタ・セクションで条件を入力すると、それに該当するデータがページ下部の表に表示され、いくつかのセルには詳細情報へのリンクが張られる。たとえば、正規表現でサーバのIPアドレスを指定すると、そのサーバに対するトラフィックの概要が表示される。その結果の中に、サーバからのDNSトラフィックがあった場合なら、ページ下部の表には、DNSトラフィックの数とその期間を示した行がある。その行の中のリンクをクリックすると、その種類のイベントのみに表示対象を絞り込むことができる。こうしてリンクをたどって対象データを絞り込むごとに、ページ上部の表には現在の条件を示す項目が増えていく。左下に示したスクリーンショットでは、まずホスト名を指定し、次にクライアントIPアドレスをクリックし、最後にDNSイベントを選択した。

pastmon2_thumb.png
フィルタリング後の画面

 誰がどんなサービスが使ったかを調べることは、セキュリティの観点からきわめて有効だが、PasTmonの本領が発揮されるのは、ネットワークやサービスに関するさまざまな指標を確認するときだ。たとえば、トランザクション数、平均のラウンドトリップ時間、パケット統計といった指標や、クライアントとサーバのセグメントやウィンドウ・サイズに関するTCPの低レベルな指標などを確認でき、ネットワークやサービスの監視に役立つ。こうした指標を参照するには、サービスの種類(たとえばHTTP GETトラフィック)、クライアント、サーバを選択する必要がある。ただし、クライアントとサーバについては、「*」を選択すればすべてが対象となる。参照する指標は選択でき、それぞれの最小値、最大値、平均値を確認できる。指標を選択し、対象とする開始時刻と終了時刻を指定すると、時間、ネットワーク・サービス、クライアント、サーバが指定条件に合致するデータが表示される。この機能を使うと、たとえば、Webの平均アクセス数が午前9時頃に高まるといったことを確認できる。それをふまえて、その時間帯のレスポンス時間が最大でどの程度かを確認すれば、ユーザをどれだけ待たせているかを知ることができる。

 PasTmonのWebインタフェースでは、各種指標のグラフ表示という強力な機能が前面に出ていない。サービス、クライアント、サーバを選択してグラフ表示を行えるということを知らないと、見過ごしてしまうかもしれない。グラフ表示では、表示内容の編集(時間間隔の変更)を行うことができ、お気に入り(favorites)として保存できる。そのうえで、トップレベル・メニューから[favorites]を選択すると、今日、昨日、今週、先週、および過去の期間について、グラフを参照できる。

 グラフを設定してお気に入りに保存しておけば、所定の時間間隔の中で平均/最大のトランザクション数やラウンドトリップ時間が急上昇していないかどうかが一目瞭然だ。あるいは、クライアントからの要求の処理で夜間にサーバの負荷が高まっているといった、これまで気付いていなかった状況があっさり判明するかもしれない。お気に入りのグラフのWebページをブックマークしておいて、目的の情報に直接アクセスすることも可能だ。

Ben Martinは10年越しでファイルシステムと取り組んできた。博士課程終了。現在、libferris、ファイルシステム、サーチソリューションを中心にコンサルタント業務を展開している。

Linux.com 原文(2008年12月2日)