netflowでネットワークフロー解析(softflowdでサーバをセンサにする)

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

目次

  1. はじめに
  2. cat2940のmonitor session設定
  3. softflowdのインストール
  4. softflowdの起動
  5. softflowdのフロー送信確認
  6. softflowdの起動シェルの設定
  7. 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がほとんどであまり面白みはありませんが。)

netflow-sample

参考書はネットワークフロー解析入門 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についてまとめます。

Pocket

コメントを残す

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