FlowScan + CUFlow on Debian

Debian squeeze で flow-tools + FlowScan + CUFlow を動かしてみるメモ。以前(id:stereocat:20100617:1276786276) ntop 入れていたのだけどオプション細かめに設定してしばらく放置していたら /var 食いつぶしてそれ以来使っていないので。解析をやるのであれば ntop よりは flow-tools でデータ残しておいた方がいろいろやれそうだなあと思っていたところで良い本が出たので。参考書はこれ。

Device Setup

機器のセットアップは前に書いた(id:stereocat:20100617:1276786276)ので省略。

Install

本だと原則ソースから手動で入れるやり方になっているけどそれはそれでやっぱり面倒なので(ぉ package install してしまう。

$ aptitude search flowscan
p   flowscan             - flow-based IP traffic analysis and visualization tool
p   flowscan-cuflow      - Flowscan module combining CampusIO and SubNetIO
p   flowscan-cugrapher   - A CGI interface for flowscan-cuflow

aptitude install flowscan-cuflow で全部まとめて入れる。このとき、flow-tools も一緒にはいるのだけど、上の本(p.39)によれば

flow-tools 0.68 は使わないこと。このバージョンには小さな問題がいくつもあり、64ビットシステムでは正常に動作しない(64ビットシステムで動作するように見えるが、実際にはデータを破壊する。これならまったく動作しない方がましである。

とのこと。今回 debian squeeze だと p.40 の脚注にあるとおり flow-tools/0.68-12 (正確には Version: 1:0.68-12+b1) でした。気になるなら以下のサイトからソースを落としてインストールする。インストールは例によって ./confugre && make && make install で普通にコンパイルできた。デフォルトだと /usr/local/flow-tools 下にインストールされる。

flow-tools/flow-capture setup

まずはデータを集めておかないと何もできない。package install しておけば起動スクリプトとか設定ファイルが入っているので flow collector である flow-capture を起動する。

  • /etc/flow-tools/flow-capture.conf
    • まあオプション並べておくだけなのだけど。
-w /var/flow/router -S 5 -n 287 0/192.168.0.1/2055

詳しくは参考書参照…なんだけどまあ一応書いておくと -w はデータの保存先。/var/flow/router/YYYY/YYYY-MM/YYYY-MM-DD/ft-v05.YYYY-MM-DD.HHMMSS+0900 みたいな形で5分おきに flow data が集められる。v05 は netflow ver.5 だから。-n 287 は per day rotate (1day/5min = 288) を、"0/IP/PORT" は "すべてのインタフェースでListenする/IPからのflowを/Portで" を意味する。

chkconfig --list | grep flow して*1自動起動するかどうかを確認。あとは service flow-capture start して *2 起動する。指定したディレクトリにファイルが置かれること/Syslog にメッセージが出力されることを確認。

flowscan

デーモン起動するので flowscan user/group を用意しておく。

ディレクトリの用意

flowscan 用ディレクトリ(ディレクトリはいずれも chown -R flowscan しておく

  • /var/lib/flowscan
    • /reports/scoreboard: flowscan が出力するレポート用のデータ置き場
    • /rrd: flowscan が出力するグラフデータ置き場
    • /scandata: flowscan に読ませるフローデータ置き場

後述するけど flowscan はフローデータを呼んでレポートを出力する。HTMLで出力するレポートは http daemon が読める場所を指定する必要がある。今回はレポート用ディレクトリを以下に設定する。このディレクトリも user:flowscan が書き込みできるようになっている必要がある。

  • /var/www/flowscan

アクセス権については本にも書いてあるけど、フローデータを httpd の読めるようなところに置くのは危険なので注意。

flowscan setup
  • /etc/flowscan.cf
FlowFileGlob /var/lib/flowscan/scandata/ft-v*[0-9]
ReportClasses CUFlow
WaitSeconds 300

FlowFileGlob にはフローデータを指定する。フローデータはすなわち flow-capture で集めたデータなのだけど、flow-capture ではホスト名/日付ベースのディレクトリにおいてあるので、これを flowscan/scandata ディレクトリに持ってきてあげなければいけないの。そのために flow-capture 側でスクリプトを仕込む (-R option)。

  • /etc/flow-tools/flow-capture.conf
-w /var/flow/router -R /usr/local/bin/flow-rotate.sh -S 5 -n 287 0/192.168.0.1/2055
  • /usr/local/bin/flow-rotate.sh
#!/bin/sh
cp $1 /var/lib/flowscan/scandata/

見たままだけど、-R オプションで flow-capture がファイルを作るときにファイル名を引数としてスクリプトが実行される。単純にコピーしておくだけ。

CUFlow setup

次は CUFlow の設定。

  • /etc/flowscan/CUFlow.cf
    • 内部ネットワーク指定: flowscan は 内部 <=> 外部 でのやりとりを想定するそうなので内部とはどこか、というのを指定する。宅内は当然プライベートアドレス全域。
Subnet 10.0.0.0/8
Subnet 172.16.0.0/12
Subnet 192.168.0.0/16
    • サブネットとかホストアドレスとかの指定。フィルタリング条件として使用する。
Network 192.168.1.0/24 internal-seg
Network 192.168.1.1 router1
(略)
    • flowscan RRD ファイル出力先の指定
OutputDir /var/lib/flowscan/rrd
    • Scoreboard Report の指定、Top10/データディレクトリ/レポート(HTML)ファイルの出力先。
Scoreboard 10 /var/lib/flowscan/reports/scoreboard /var/www/flowscan/topten.html
    • Aggregate Score Report の指定。Top10/データファイル/レポート(HTML)ファイルの出力先。
AggregateScore 10 /var/lib/flowscan/reports/scoreboard/agg.dat /var/www/flowscan/overall.html
    • Netflow を出力するホストの指定(複数の機器(センサ)がひとつのコレクタにデータを出力している場合、ホストごとのデータを解析)
Router 192.168.0.1 router1
Exec flowscan

flowscan/scandata にフローデータがコピーされていることを確認して flowscan を起動する。起動スクリプトは /usr/share/doc/flowscan-cuflow/example/flowscan.rc にあるのでこれを /etc/init.d において chkconfig flowscan on しておけば良いだろう。

service flowscan start してログを確認する。……と

Use of uninitialized value in numeric gt (>) at /usr/share/perl5/HTML/Table.pm line 2685.

って出るんだけど、どうやら HTML Report を出すときに HTML::Table が出しているらしい。HTML::Table の問題と思われる。

こういうログが出てれば処理はされてる。

2011/05/02 14:27:20 flowscan-1.020 CUFlow: report took  0 wallclock secs ( 0.01 usr +  0.00 sys =  0.01 CPU)
2011/05/02 14:27:20 working on file /var/lib/flowscan/scandata/ft-v05.2011-05-02.094501+0900...
2011/05/02 14:27:20 flowscan-1.020 CUFlow: Cflow::find took  0 wallclock secs ( 0.00 usr +  0.00 sys =  0.00 CPU) for 416 flow file bytes, flow hit ratio: 10/12

flowscan は一度フローデータを呼んで処理すると 300秒(5分) 待機する。待機後にまたフローデータを読み込んでデータを更新する。

CUGrapher setup

RRD Tools でグラフを表示するフロントエンド CGI を動かす。といっても、パッケージインストールした時点で apache のデフォルト CGI ディレクトリ /usr/lib/cgi-bin に CUGrapher.pl が設置されているので、データディレクトリの設定をするとすぐ動く。

--- CUGrapher.pl.orig   2011-05-02 14:33:23.000000000 +0900
+++ CUGrapher.pl        2011-05-02 15:55:53.000000000 +0900
@@ -19,13 +19,13 @@
 my $aggregateScoreFile;
 my $scoreboardFile;
 # directory with rrd files
-my $rrddir;
+my $rrddir = "/var/lib/flowscan/rrd/";
 # default number of hours to go back
 my $hours = 48;
 # duration of graph, starting from $hours ago
 my $duration;
 # organization name
-my $organization = "";
+my $organization = "my network";
 # default graph width
 my $width = 640;
 # default graph height
@@ -236,7 +236,12 @@
                                  -values => [sort keys %reportName],
                                  -default => defParam('report', 'bin') ) );

-    my %hours = ( 12 => '12 hours',
+    my %hours = (
+                  1 => '1 hours',
+                  2 => '2 hours',
+                  4 => '4 hours',
+                  6 => '6 hours',
+                 12 => '12 hours',
                  24 => '24 hours',
                  36 => '36 hours',
                  48 => '48 hours',

rrddir は flowscan が出力している rrd file の場所。organization は CGI のタイトル。hours のところは最短12時間だったので直近分を確認できるように水増ししている。

これであとは http://localhost/cgi-bin/CUGrapher.pl とかで CGI にアクセスすれば良い。

*1:chkconfig package

*2:sysvconfig package