netflowでネットワークフロー解析(softflowdでサーバをセンサにする)
目次
- はじめに
- cat2940のmonitor session設定
- softflowdのインストール
- softflowdの起動
- softflowdのフロー送信確認
- softflowdの起動シェルの設定
- softflowdでフロー統計データを表示させる
サーバ環境
| 製品名 | OpenBlockS 600/R |
| CPU | 600MHz(AMCC PowerPC 405EX) |
| メモリ | 1GB(DDR2 SDRAM) |
| ストレージ | 8GB(Compact Flash) |
はじめに
サーバやPCなど、フローの送信元や送信先となる機器とは異なり、様々なトラフィックが集約されて流れるネットワーク機器ではアプリごとにどのぐらいトラフィックが流れているかの割合を調べたり、どのようなフローがネットワークを占有しているかなどを簡単に確認することができません(フィルタを細かく書いたりキャプチャ装置をはさんだりすれば可能ですがコストが高くつきます)
オープンソースで上記のようなネットワークの可視化を実現する方法としてnetflowが知られていますが、センサー機能の付いたハイエンドな機器(CiscoやJuniperルータ等)が我が家には無いので、Catalyst2940とサーバ(Openblocks600)を組み合わせてセンサーにできるか試してみます。
次の記事「netflowでネットワークフロー解析(flow-toolsでフローデータ受信)」でまとめているコレクタ(flow-tools)および、その次の記事「netflowでネットワークフロー解析(FlowScanとCUFlowでグラフ化)」でまとめているFlowScanとCUFlowとを組み合わせると、最終的に以下のようなアプリごとにどのぐらいトラフィックが流れているかが分かるようなグラフが作成できます。
以下は私の自宅で試した結果です(自宅で流れるアプリケーションなのでHTTPがほとんどであまり面白みはありませんが。)
参考書はネットワークフロー解析入門 flow-toolsによるトラブルシューティングです。
この本のp.50にsoftflowdのアイディアが載っていました。
具体的には以下の簡易図のような構成を用意して、cat2940でfa0/1を流れるパケットをモニタセッションしてfa0/3(モニタポート)からsoftflowd(OBS-ACT)にモニタパケットを渡すことで、softflowdがセンサとして動作します。
softflowdはパケットを受け取った後、eth0からコレクタ宛(OBS-SBY)にフローパケットをexportします。
OBS-ACTをコレクタ兼用にすることも可能とは思いますが、理解しやすいよう、役割ごとにサーバを分けました。
ネットワーク構成
internet
|
|
|
| fa0/1
+-----------+ +-------------+
| |----------------| |
| |fa0/5 eth0 | OBS-ACT |
| |----------------| (センサ) |
| |fa0/3 eth1 +-------------+
| cat2940 |
| | +-------------+
| |----------------| |
| |fa0/8 eth0 | OBS-SBY |
| | | (コレクタ) |
+-----------+ +-------------+
|fa0/6
|
|
|
LAN
cat2940のmonitor session設定
以下のように設定すると、fa0/1を通過するパケットのヘッダ情報がfa0/3にコピーされますので、そのパケットをOBS-ACTのeth1で受け取ります。
monitor session 1 source interface Fa0/1 monitor session 1 destination interface Fa0/3
サーバ側の設定(OBS-ACT)
softflowdのインストール
まずはsoftflowdをインストールします。softflowdが使うパケットキャプチャソフトウェアであるlibpcapもインストールされます。
root@OBS-ACT:~# aptitude install softflowd
以下の新規パッケージがインストールされます:
libpcap0.8{a} softflowd
更新: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
174 kB のアーカイブを取得する必要があります。展開後に 504 kB のディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] Y
...
次にネットワークを設定します。eth1でcat2940からのパケットを受信し、OBS-SBY宛のフローパケットをeth0から送信するように設定していきます。eth1は受信するだけなのでアドレスは要りませんが、アクティブ化とARPの無効化を行います。
root@OBS-ACT:~# vi /etc/network/interfaces
auto lo
iface lo inet loopback
#auto eth0
#iface eth0 inet dhcp
auto eth0
iface eth0 inet static
address 192.168.0.113
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1
auto eth1
iface eth1 inet manual
up ifconfig eth1 up -arp
down ifconfig eth1 down arp
root@OBS-ACT:~# /etc/init.d/networking restart
root@OBS-ACT:~# ip link show
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0a:85:04:02:ff brd ff:ff:ff:ff:ff:ff
3: eth1: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0a:85:04:82:ff brd ff:ff:ff:ff:ff:ff
eth0とeth1がUPしていること、eth1はNOARPであることを確認します。
softflowdの起動
起動シェル(/etc/init.d/*)で起動させる前にコマンドで動作を確認してみます。
ちなみに/var/run/softflowd/chrootを作成しておかないと以下のようなエラーがログに吐かれて起動しませんでしたので、先にディレクトリを作成してからsoftflowdを起動します。
【エラー内容】
softflowd[1686]: Unable to chdir to chroot directory "/var/run/softflowd/chroot": No such file or directory
【ディレクトリ作成とsoftflowdの起動】
root@OBS-ACT:~# mkdir -p /var/run/softflowd/chroot root@OBS-ACT:/var/run# softflowd -v 5 -i eth1 -n192.168.0.131:9995 root@OBS-ACT:/var/run# ps aux | grep softflow nobody 1757 0.2 0.2 4844 2936 ? SNs 15:32 0:00 softflowd -v 5 -i eth1 -n192.168.0.131:9995 root 1759 0.0 0.0 3452 920 pts/0 SN+ 15:32 0:00 grep softflow root@OBS-ACT:/var/run# tail /var/log/syslog Aug 9 15:32:14 OBS-ACT kernel: device eth1 entered promiscuous mode Aug 9 15:32:14 OBS-ACT softflowd[1757]: softflowd v0.9.8 starting data collection Aug 9 15:32:14 OBS-ACT softflowd[1757]: Exporting flows to [192.168.0.131]:9995
プロセスが正常に起動しており、エラーが出ていないことを確認します。
softflowdのオプション(-v 5 -i eth1 -n192.168.0.131:9995)は、NetFlow v.5を使用し、eth1でlistenしてパケットを受信したら192.168.0.131:9995(コレクタ)宛にエクスポートする設定です。
softflowdのフロー送信確認
コレクタ側(OBS-SBY側)はまだ未設定のため、現時点ではOBS-SBYでtcpdumpを動かしてみて、OBS-ACTからパケットがエクスポートされているか確認してみます。
root@OBS-SBY:~# tcpdump -n -i eth0 port 9995 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
モニタ中のfa0/1に通信を流してみましたが、softflowd(OBS-ACT)はOBS-SBYにフローパケットを送信していないようです。現在追跡中のフローを全てコレクタにエクスポートしてから終了するshutdownコマンドを実施してみます。
root@OBS-ACT:/var/run# softflowctl shutdown softflowd[1757]: Shutting down gracefully...
以下の通り、コレクタ側でフローパケットが来ていることが確認できました。
root@OBS-SBY:~# tcpdump -n -i eth0 port 9995 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 15:36:07.805228 IP 192.168.0.113.33071 > 192.168.0.131.9995: UDP, length 1416 15:36:07.805433 IP 192.168.0.113.33071 > 192.168.0.131.9995: UDP, length 1464 15:36:07.805565 IP 192.168.0.113.33071 > 192.168.0.131.9995: UDP, length 984
softflowdの起動シェルの設定
softflowdが自動的に上記オプション(-v 5 -i eth1 -n192.168.0.131:9995)で起動するように設定ファイルを修正します。
softflowdがlistenするのはeth1、コレクタは192.168.0.131:9995とします。
root@OBS-ACT:/var/run# vi /etc/default/softflowd # # configuration for softflowd # # note: softflowd will not start without an interface configured. # The interface softflowd listens on.INTERFACE=""INTERFACE="eth1" # Further options for softflowd, see "man softflowd" for details. # You should at least define a host and a port where the accounting # datagrams should be sent to, e.g. # OPTIONS="-n 127.0.0.1:9995"OPTIONS=""OPTIONS="-v 5 -n 192.168.0.131:9995"
上記設定を保存後、起動シェルを実行します。
root@OBS-ACT:/var/run# /etc/init.d/softflowd start Starting softflowd: softflowd. root@OBS-ACT:/var/run# ps aux | grep softflow nobody 1789 0.0 0.2 4844 2944 ? SNs 15:43 0:00 /usr/sbin/softflowd -i eth1 -v 5 -n 192.168.0.131:9995 root 1791 0.0 0.0 3452 920 pts/0 SN+ 15:43 0:00 grep softflow
設定ファイルに設定したとおりに動作していることが確認できました。
softflowdでフロー統計データを表示させる
参考書のp.53~54で紹介されているいくつかの確認コマンドを実施してみます。
①追跡中のフローを表示する。
softflowdが追跡しているフローを表示したい場合は、softflowctlのdump-flowsコマンドを使います。フローは1行に1つずつ表示されます。フローが表示されれば、softflowdは正常に動作していることになります。
root@OBS-ACT:/var/run# softflowctl dump-flows softflowd[1789]: Dumping flow data: ACTIVE seq:2 [192.168.0.7]:50925 <> [202.86.58.44]:80 proto:6 octets>:322 packets>:7 octets<:0 packets<:0 start:2011-08-09T06:43:46.134 finish:2011-08-09T06:44:05.030 tcp>:15 tcp<:00 flowlabel>:00000000 flowlabel<:00000000 EXPIRY EVENT for flow 2 in 78 seconds ...
大量に表示されたので一行目に着目すると、以下のフローであることが読み取れます。
| 送信元 | 192.168.0.7:50925 |
| 宛先 | 202.86.58.44:80 |
| プロトコル | 6(TCP) |
②フロー統計データを表示する。
softflowdは起動した直後からフローの追跡を開始します。softflowctlのstatisticsコマンドを使うと、現在追跡中のフローの特性をsoftflowdに出力させることができます。
root@OBS-ACT:/var/run# softflowctl statistics
①softflowd[1789]: Accumulated statistics:
②Number of active flows: 83
③Packets processed: 1980
④Fragments: 0
⑤Ignored packets: 475 (475 non-IP, 0 too short)
⑥Flows expired: 87 (0 forced)
⑦Flows exported: 171 in 8 packets (0 failures)
⑧Packets received by libpcap: 2455
⑨Packets dropped by libpcap: 0
⑩Packets dropped by interface: 0
Expired flow statistics: minimum average maximum
Flow bytes: ⑪ 63 ⑭ 2946 55630
Flow packets: ⑫ 1 8 72
Duration: ⑬ 0.00s ⑮ 2.27s 133.92s
Expired flow reasons:
tcp = 0 tcp.rst = 6 tcp.fin = 39
udp = 42 icmp = 0 general = 0
maxlife = 0
over 2Gb = 0
maxflows = 0
flushed = 0
Per-protocol statistics: Octets Packets Avg Life Max Life
tcp (6): 241976 657 4.39s 133.92s
Unknown (17): 14347 82 0.01s 0.01s
上記で番号をつけた箇所の説明を以下にまとめます。
| ① | softflowdのPID |
| ② | softflowdが進行中であるとみなしているフロー数。UDP等はタイムアウトするまでこの数に含まれる。 |
| ③ | 処理されたパケットの数 |
| ④ | フラグメントの数 |
| ⑤ | ドロップしたパケット |
| ⑥ | 失効させたフローの数(softflowdの内部統計データ) |
| ⑦ | エクスポートされたフローの数(コレクタで受信した数とほぼ同じになるはず) |
| ⑧ | libpcapが受け取ったパケットの数(③とほぼ一致するはず) |
| ⑨ | libpcapがドロップしたパケットの数(これが増えてきたら負荷を疑う) |
| ⑩ | インタフェースがドロップしたパケットの数(通常は0のはず) |
| ⑪ | 最も小さいフローは63バイト |
| ⑫ | 1つのフローに含まれているパケットの最小値は1 |
| ⑬ | 最も時間が短いフローは100分の1未満 |
| ⑭ | フローの平均バイト数は2,946バイト |
| ⑮ | 平均実行時間は2.27秒 |
softflowdについては以上で終了です。
次の記事「netflowでネットワークフロー解析(flow-toolsでフローデータ受信)」では、コレクタとなるflow-toolsについてまとめます。