netflowでネットワークフロー解析(FlowScanとCUFlowでグラフ化)

投稿者: | 2011年8月28日
Pocket

目次

  1. はじめに
  2. 設定前の事前準備
  3. ローテーションスクリプトとflow-captureの設定変更
  4. CUFlowの設定
  5. flowscanの直接起動
  6. daemontools経由でflowscanを起動
  7. CUGrapherによるRRDデータのグラフ化

サーバ環境

製品名 OpenBlockS 600/R
CPU 600MHz(AMCC PowerPC 405EX)
メモリ 1GB(DDR2 SDRAM)
ストレージ 8GB(Compact Flash)

はじめに

前々回の記事「netflowでネットワークフロー解析(softflowdでサーバをセンサにする)」でOpenblocks600にsoftflowdを導入し、netflowのセンサにしました。

前回の記事「netflowでネットワークフロー解析(flow-toolsでフローデータ受信)」では、Openblocks600にflow-toolsを導入し、netflowのコレクタにしました。

今回は、コレクタにしたOpenblocks600にFlowScanとCUFlowを導入し、アプリ単位でトラフィックがどのぐらい流れているか分かるようなグラフを作成します。

flow-tools導入のためにflowscan-cuflowをインストールした際に、FlowScanとCUFlowもインストールされましたので、本記事ではインストールの記載を割愛します。

参考書はネットワークフロー解析入門 flow-toolsによるトラブルシューティングです。この本ではP146~156に手動インストール方法が載っていますが、本環境ではaptitudeでインストールしたため、一部を読み替える必要があります。

 

ネットワーク構成は前回と同様です。作業対象はOBS-SBY側です。

    internet
       |
       |
       |
       | fa0/1
  +-----------+                +-------------+
  |           |----------------|             |
  |           |fa0/5      eth0 |   OBS-ACT   |
  |           |----------------|  (センサ)   |
  |           |fa0/3      eth1 +-------------+
  |  cat2940  |
  |           |                +-------------+
  |           |----------------|             |
  |           |fa0/8      eth0 |   OBS-SBY   |
  |           |                |  (コレクタ) |
  +-----------+                +-------------+
       |fa0/6
       |
       |
       |
      LAN

設定前の事前準備

FlowScanやCUFlowで使用するディレクトリを事前に作成します。

参考書ではflowscanユーザを作成して、一般ユーザであるネットワーク管理者がrootにならなくてもいいように色々と設定していますが、本環境ではセキュリティ考慮不要なためflowscanユーザについては作成しません。

・ディレクトリの用意

Apache用ディレクトリ作成

root@OBS-SBY:~# mkdir -p /var/www/flowscan

CUFlowのRRDデータファイルの保存場所

root@OBS-SBY:~# mkdir -p /var/db/flows/test/flowscanrrd

※Webからアクセスできる場所、またはflow-captureのログディレクトリにレコードを保存しないようにします。

最新のコレクタのログファイル(ft-*)保存場所

root@OBS-SBY:~# mkdir -p /var/db/flows/test/flowscandata

FlowScanの設定

FlowScanの設定の設定ファイルであるflowscan.cfを修正します。

flowscan.cfファイルの設定値は、FlowFileGlob、ReportClasses、WaitSeconds、Verboseの4つだけです。

root@OBS-SBY:~# vi /etc/flowscan/flowscan.cf

# flowscan Configuration Directives ############################################

# FlowFileGlob (REQUIRED)
# use this glob (file pattern match) when looking for raw flow files to be
# processed, e.g.:
# FlowFileGlob /var/local/flows/flows.*:*[0-9]
#FlowFileGlob flows.*:*[0-9]
FlowFileGlob /var/db/flows/test/flowscandata/ft-v*[0-9]

# ReportClasses (REQUIRED)
# a comma-seperated list of FlowScan report classes, e.g.:
# ReportClasses CampusIO
# ReportClasses SubNetIO
#ReportClasses CampusIO
ReportClasses CUFlow

# WaitSeconds (OPTIONAL)
# This should be <= the "-s" value passed on the command-line to cflowd, e.g.:
# WaitSeconds 300
WaitSeconds 300

# Verbose (OPTIONAL, non-zero = true)
Verbose 1

オプションの意味を以下に記載します。

FlowFileGlob 処理の対象となるファイルをFlowScanに伝えます。後述する方法で/var/db/flows/配下のコレクタログファイルのうち最新のログを/var/db/flows/test/flowscandata/に移します。
ReportClasses ユーザが使っているレポートモジュールを列挙する。
WaitSeconds ディレクトリでファイルをチェックする頻度をFlowScanに指定します。
Verbose 1にすると詳細ログを出力します。

ローテーションスクリプトとflow-captureの設定変更

/var/db/flows/配下のコレクタログファイル(ft-から始まるファイル)のうち最新のログを/var/db/flows/test/flowscandata/に移すため、flow-captureのログローテーションスクリプトを使用します。

flow-captureの-Rオプションは、フローファイルが閉じられて新しい一時ファイルが作成される時にスクリプトを実行します。

新しいコレクタログファイルが作成されるたびに/usr/local/bin/flow-rotate.shスクリプトが実行されるように、flow-capture.confの設定を以下のように修正します。

root@OBS-SBY:~# vi /etc/flow-tools/flow-capture.conf

-w /var/db/flows -R /usr/local/bin/flow-rotate.sh -n 287 -S 5 192.168.0.131/192.168.0.113/9995

flow-captureは、ローテーションプログラムに引数を一つ(閉じられたログファイルの名前)だけ渡します。今、以下のファイルが作成途中だとすると、19:45にft-v05.2011-08-21.194000+0900に変更されたタイミングで、

flow-rotate.sh ft-v05.2011-08-21.194000+0900

が実行されるので、flow-rotate.shを以下のように用意することで、このft-v05.2011-08-21.194000+0900が/var/db/flows/test/flowscandata/にコピーされるようになります。

root@OBS-SBY:~# vi /usr/local/bin/flow-rotate.sh

#!/bin/sh
cp $1 /var/db/flows/test/flowscandata/

root@OBS-SBY:~# chmod 755 /usr/local/bin/flow-rotate.sh

root@OBS-SBY:~# /etc/init.d/flow-capture restart
Stopping flow-capture: flow-capture.
Starting flow-capture: flow-capture.

しばらくして以下のようにコピーされれば成功です。

root@OBS-SBY:/var/www# ls /var/db/flows/test/flowscandata/
ft-v05.2011-08-21.195000+0900

ちなみに本ファイルはフローファイルを処理した後、すぐに削除されます。処理したファイルを削除させたくない場合は、FlowScanのデータディレクトリにsavedディレクトリを作成しておくと、FlowScanが処理済のファイルをこのディレクトリへ移動するようになりますが、膨大なファイル量になってしまうので本環境ではsavedを用意しません。

CUFlowの設定

CUFlow.cfファイルを設定します。このファイルには、どのようなデータを探し、それをどのように処理するのかをFlowScanに伝えるためのさまざまな文が含まれます。

root@OBS-SBY:~# vi /etc/flowscan/CUFlow.cf

# These are used only to determine whether a packet is inbound our
# outbound
Subnet 10.0.0.0/8
Subnet 172.16.0.0/12
Subnet 192.168.0.0/16

# These are networks we are particularly interested in, and want to
# get separate rrd's for their aggregate traffic
Network 192.168.0.0/24 lan
Network 192.168.0.1 router

# Where to put the rrd's
# Make sure this is the same as $rrddir in CUGrapher.pl
#OutputDir /cflow/reports/rrds
OutputDir /var/db/flows/test/flowscanrrd

# Track multicast traffic
Multicast

# Keep top N lists
# Show the top ten talkers, storing reports in /cflow/flows/reports
# and keeping the current report in /etc/httpd/data/reports/topten.html
#Scoreboard 10 /cflow/reports/scoreboard /var/www/html/topten.html
Scoreboard 10 /var/www/flowscan/topten /var/www/flowscan/topten/topten.html

# Same, but build an over-time average top N list
#AggregateScore 10 /cflow/reports/scoreboard/agg.dat /var/www/html/overall.html
AggregateScore 10 /var/db/flows/test/flowscanrrd/agg.dat /var/www/flowscan/overall.html

# Our two netflow exporters. Produce service and protocol reports for the
# total, and each of these.
#Router 10.0.1.1 router1
#Router 10.0.1.2 router2
#Router 192.168.0.113 cat29

# Services we are interested in
Service 20-21/tcp ftp
Service 22/tcp ssh
Service 23/tcp telnet
Service 25/tcp smtp
Service 53/udp,53/tcp dns
Service 80/tcp http
Service 110/tcp pop3
Service 123/tcp ntp
Service 143/tcp imap
Service 443/tcp https

# protocols we are interested in
Protocol 1 icmp
Protocol 4 ipinip
Protocol 6 tcp
Protocol 17 udp
Protocol 47 gre
Protocol 50 esp
Protocol 51 ah
Protocol 57 skip
Protocol 88 eigrp
Protocol 169
Protocol 255

# ToS bit percentages to graph
TOS 0 normal
TOS 1-255 other

# Interested in traffic to/from AS 1
# ASNumber 1 Genuity

上記設定の意味を解説していきます。

Subnet文 ローカルネットワーク上のアドレスをCUFlowに指定します。CUFlowはそれを使って、トラフィックが内と外のどちらに向かうのかを判断します。このネットワークが送信元である場合は外に向かい、送信先である場合は内に向かうと見なされます。本環境ではとりあえずプライベートアドレスを指定しました。
Network文 別個に追跡したいホストと範囲を指定します。スラッシュ(/)を使ってネットワークで指定しても、ホストで指定しても問題ありません。
OutputDir文 CUFlowのRRDデータファイルの保存場所を指定します。Webからアクセスできる場所やflow-captureのログディレクトリにレコードを保存しないようにします。
Scoreboard文 CUFlowは、フローファイル内で最もアクティブなサイトを計算し、最も多くのフロー、オクテット、パケットを送信したホストアドレスからなるスコアボードを表示します。そのリストに含めるアドレス数、古いデータを保存するディレクトリ、最新データのファイル名を引数として指定します。注意点としては、Apacheが古いデータを保存するディレクトリと最新データのファイルにアクセスできるように権限を指定することです。
AggregateScore文 AggregateScore文では最もアクティブなホストを追跡します(本環境ではScoreboard文で指定した結果と同じになってしまいました)。表示するホストの数、長期的な集計データを保存するファイル、結果を表示するWebページを指定します。集計データファイルは、RRDデータディレクトリなど、Apacheからアクセスできない場所を指定します。
Router文 複数のフローセンサーがデータを同じコレクタに送信する場合に識別するため設定です。本環境では1台しかないのでコメントアウトしています。
Service文 別々に追跡したいTCP/IPポートを定義します。あまり無駄なものがあるとGraphの可視性が低下するので有名どころのアプリケーションが使用するポートに絞りました。
Protocol文 Service文のProtocol版です。本環境で必要なのはicmp, tcp, udpぐらいですが、デフォルト設定を残しておきます。
TOS文 TOSを付与する予定はありませんが、デフォルト設定を残しておきます。
AS文 BGPを使用していないのでコメントアウトします。

Scoreboard文とAggregateScore文で指定したWeb公開用ディレクトリを作成しておきます。

root@OBS-SBY:~# mkdir -p /var/www/flowscan/topten

flowscanの実行

flowscanの直接起動

flowscanには起動シェルが無いため、バックグラウンドで起動するか、daemontools経由で起動するか、起動シェルを自分で作成する必要があります。本環境ではすでに導入済みのdaemontools経由で起動することにしましたが、その前に一度、/usr/bin/flowscanを直接実行して動作を確認します。

root@OBS-SBY:~# /usr/bin/flowscan
2011/08/21 20:21:56 working on file /var/db/flows/test/flowscandata/ft-v05.2011-08-21.195000+0900...
2011/08/21 20:21:57 flowscan-1.020 CUFlow: Cflow::find took  1 wallclock secs ( 0.02 usr +  0.00 sys =  0.02 CPU) for 331 flow file bytes, flow hit ratio: 1/17
2011/08/21 20:21:57 flowscan-1.020 CUFlow: report took  0 wallclock secs ( 0.01 usr  0.00 sys +  0.02 cusr  0.01 csys =  0.04 CPU)
2011/08/21 20:21:57 working on file /var/db/flows/test/flowscandata/ft-v05.2011-08-21.195101+0900...
2011/08/21 20:21:57 flowscan-1.020 CUFlow: Cflow::find took  0 wallclock secs ( 0.06 usr +  0.01 sys =  0.07 CPU) for 680 flow file bytes, flow hit ratio: 0/56
ERROR updating /var/db/flows/test/flowscanrrd/tos_other.rrd: /var/db/flows/test/flowscanrrd/tos_other.rrd: illegal attempt to update using time 1313923800 when last update time is 1313923                                                861 (minimum one second step)
ERROR updating /var/db/flows/test/flowscanrrd/protocol_tcp.rrd: '/var/db/flows/test/flowscanrrd/protocol_tcp.rrd' is not an RRD file
ERROR updating /var/db/flows/test/flowscanrrd/protocol_esp.rrd: '/var/db/flows/test/flowscanrrd/protocol_esp.rrd' is not an RRD file
2011/08/21 20:21:57 flowscan-1.020 CUFlow: report took  0 wallclock secs ( 0.00 usr  0.01 sys +  0.01 cusr  0.03 csys =  0.05 CPU)
2011/08/21 20:21:57 working on file /var/db/flows/test/flowscandata/ft-v05.2011-08-21.195500+0900...

上記ERRORはファイルが無いことから出たと思われます。2回目以降は出ませんでした。

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

...

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

上記はエラーでは無いようなので、望ましくはありませんが様子見します。

フォアグラウンドで起動したまま置いておくと、5分ごとに以下のログが出力されます。

2011/08/21 20:29:43 working on file /var/db/flows/test/flowscandata/ft-v05.2011-08-21.202000+0900...
2011/08/21 20:29:44 flowscan-1.020 CUFlow: Cflow::find took  1 wallclock secs ( 0.58 usr +  0.10 sys =  0.68 CPU) for 3378 flow file bytes, flow hit ratio: 235/299
2011/08/21 20:29:44 flowscan-1.020 CUFlow: report took  0 wallclock secs ( 0.01 usr  0.01 sys +  0.02 cusr  0.02 csys =  0.06 CPU)
sleep 300...
Use of uninitialized value in numeric gt (>) at /usr/share/perl5/HTML/Table.pm line 2685.
Use of uninitialized value in numeric gt (>) at /usr/share/perl5/HTML/Table.pm line 2685.

...

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

daemontools経由でflowscanを起動

flowscanが落ちても自動で立ち上がるよう、daemontools経由で起動するように設定します。

以下に手順をまとめておきますが、各コマンドの意味については「daemontoolsでkeepalivedデーモンの稼動管理」にまとめていますので参照して下さい。

root@OBS-SBY:/var/db/flows/test# aptitude install daemontools
root@OBS-SBY:/var/db/flows/test# aptitude install daemontools-run
root@OBS-SBY:/var/db/flows/test# mkdir -p /etc/daemon/flowscan
root@OBS-SBY:/var/db/flows/test# cd /etc/daemon/flowscan/
root@OBS-SBY:/etc/daemon/flowscan# vi run

#!/bin/sh
exec 2>&1
exec /usr/bin/flowscan

root@OBS-SBY:/etc/daemon/flowscan# chmod 755 run
root@OBS-SBY:/etc/daemon/flowscan# ln -s /etc/daemon/flowscan /etc/service/
root@OBS-SBY:/etc/daemon/flowscan#  cd /etc/service
root@OBS-SBY:/etc/service# ls -al
合計 8
drwxr-xr-x 1 root root 4096 2011-08-21 20:40 .
drwxr-xr-x 1 root root 4096 2011-08-21 20:38 ..
lrwxrwxrwx 1 root root   20 2011-08-21 20:40 flowscan -> /etc/daemon/flowscan

root@OBS-SBY:/etc/service# ps aux | grep flowscan
root      8050  0.0  0.0   1804   416 ?        S    20:40   0:00 supervise flowscan
root      8051  6.4  0.7  18932  7876 ?        S    20:40   0:04 /usr/bin/perl /usr/bin/flowscan
root      8062  0.0  0.0   3456   932 pts/1    SN+  20:41   0:00 grep flowscan

CUGrapherによるRRDデータのグラフ化

CUFlowには、CUGrapher.plというCGIスクリプトが含まれます。このスクリプトはRRDデータをグラフに変換します。

修正箇所は以下の通りです。

root@OBS-SBY:~# vi /usr/lib/cgi-bin/CUGrapher.pl

...

# directory with rrd files
my $rrddir = "/var/db/flows/test/flowscanrrd";

...

# organization name
my $organization = "my network";

...

    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',
                  168 => '1 week',
                  720 => '1 month' );
    $hours{defParam('hours', $hours)} = defParam('hours', $hours) . " hours"
      if (!$hours{defParam('hours', $hours)});

私の環境ではインストール時にWebサーバのCGIディレクトリに置いてありましたので、スクリプトの最初の方にある$rrddirに/usr/lib/cgi-bin/を指定しました。

root@OBS-SBY:~# ls /usr/lib/cgi-bin/
CUGrapher.cgi  CUGrapher.pl

$organizationは任意の文字列を指定します。

また、デフォルトでは12時間単位でのグラフ化になりますが、自宅では一日のうち限られた時間しか使用しないことから拡大表示できるように、1,2,4,6時間単位でもグラフ化できるようにしています。

CUGrapher.pl修正後、以下のURLにアクセスします。(導入する環境に合わせて読み直してください)。

http://[コレクタのURL or アドレス]/cgi-bin/CUGrapher.pl

すると次のような画面が表示されますので、試しにAll Svcs(全てのServiceを選択したのと同じ)、Totalにチェックを入れて、Time periodを1 hoursにして「Generate graph」を押下します。

menu

すると、以下のようにグラフが生成されます。

netflow-sample

以上でFlowScanとCUFlowによるグラフ化が完了しました。

次はより細かなカスタマイズが可能なFlowViewerを導入したいと思います。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です