目次
- はじめに
- 設定前の事前準備
- ローテーションスクリプトとflow-captureの設定変更
- CUFlowの設定
- flowscanの直接起動
- daemontools経由でflowscanを起動
- 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」を押下します。
すると、以下のようにグラフが生成されます。
以上でFlowScanとCUFlowによるグラフ化が完了しました。
次はより細かなカスタマイズが可能なFlowViewerを導入したいと思います。