Reading Time: 2 minutes
この記事の所要時間: 約 10分

はじめまして、ゾーホージャパンが提供するManageEngineのエンジニアをしております園部です。

突然ですが「連携してみたシリーズ」はじめました。よろしくお願いいたします!

記念すべき1本目は、「ZabbixにSNMPだけでなくNetFlow監視で得たトラフィックの内訳情報も表示するには?」と題しまして、「Zabbix」と永年無料版※も提供している弊社のフローコレクター「NetFlow Analyzer」を連携する方法を紹介していきたいと思います。

「Zabbixでトラフィックの内訳まで見たいよー」というというニーズは結構多いのではないかなと思います!

現在、会社内のルーターの一つを、Zabbixで監視しています。
Zabbixダッシュボードに表示しているウィジェットは、以下の通りです。

  1.  障害情報
  2.  ルーターのCPU使用率、メモリー使用率
  3.  ルーターの温度
  4.  ルーターの応答時間(Zabbixサーバー⇒ルーターへのPing応答時間)
  5.  インターフェースのトラフィック量(IN)
  6.  インターフェースのトラフィック量(OUT)

これらの監視はすべてSNMPを使用した監視をベース(計算も一部含む)に実現しています。
使用しているZabbixはバージョン3.4です。

ここに、フローコレクターからのデータを連携して表示することで、ZabbixでSNMP+NetFlow/sFlow監視を実現していきたいと思います!

私が試した連携方法を3種類ご紹介いたします。

目次

そもそもNetFlowやsFlowとは……

そもそも、NetFlowやsFlowとは何たるかというと、

トラフィックの詳細情報を収集するための技術です。アプリケーション/IPアドレス/ポート/プロトコルなどの情報を収集できます。

ということだそうで、これらの技術をまとめてxFlowと言ったりもします。

SNMPではわからない部分を調査したい。しかし常時パケットキャプチャしているわけにもいかない。

そこで、機器から取得可能なNetFlowやsFlowなどのフローデータを駆使して、解析や可視化を行い、より詳細な調査をしやすくしようというのが「フローコレクター」と呼ばれるツールです。

それでは実際に、Zabbixでトラフィックの内訳情報を表示する方法を模索していきたいと思います。

連携レベル0:ZabbixとNetFlow Analyzerダッシュボードを両方見る

ちなみに、NetFlow Analyzerのダッシュボードは下のような見た目です。

Zabbixとの連携を考えない状態の場合、NetFlow Analyzerの画面と、Zabbixの画面を同時に見ていくことになります。

※イメージ

…同時に開いて見ているのは若干手間です。

そして、ZabbixのSNMPでのトラフィック監視で異常を検知していた時間帯を確認し、NetFlow Analyzerで同時間帯に遡って見るのも、少々面倒です。

もう少しスマートな連携方法がないかを模索していきます。

連携レベル1:NetFlow AnalyzerウィジェットをZabbixに埋め込み

NetFlow Analyzerの「埋め込みウィジェット」機能を使用して連携を考えてみます。

まずNetFlow Analyzerのダッシュボードを開き、Zabbixのダッシュボードに表示させたいウィジェットを作成します。

作成したウィジェットの右上から[埋め込みウィジェット]アイコンをクリックします。
下記のようなiframe用のHTMLタグが表示されます。

<iframe src='https://netflow-analyzer:8080/embedView.do?type=widget&widgetID=5406&authKey=aaaaaaa-bb11-1234-5678-a1b2c3d4e5f6g7h8' frameborder='0' scrolling='no' width='687px' height='560px'/>

このHTMLの中から、「src=’http://~~~~~’」という部分を探し、中に記載されているURLをコピーします。

Zabbixに戻りまして、[ダッシュボードの変更] -> [ウィジェットの追加]からウィジェットタイプ[URL]を選択後、URLに、上記手順でコピーしたURLを入力。

ウィジェットを保存してみてみますと……Zabbixダッシュボードに、そのままNetFlow Analyzerのウィジェットを表示させることができます!

また、『ここからここへのどんな通信がどれくらい』ということも特定できたらと思うので、それを実現する「通信」ウィジェットもZabbixに表示させます。

いい感じ!

……しかし、「〇日の△時のトラフィックを調査したい」というような場合を考えてみますと、結局は「連携レベル0」と同じように、ZabbixとNetFlow Analyzerを両方開く必要が出てきます。

フローの詳細調査の場合はNetFlow Analyzerを直接参照したほうが良いですが、普段の簡単な状況確認と傾向把握くらいは、一画面でやりたいなー……

ということでもう一声!

連携レベル2:Zabbixの外部チェックでNetFlow Analyzer APIからフロー解析データを取得する

見出しの通りですが、NetFlow Analyzer APIでデータを取得するスクリプトを作成し、Zabbixの外部チェック機能を使用して定期的にスクリプト実行していけば、データをZabbixに統合できるのでは、と考えました。

そこで、以下のようなPHPのスクリプトを作成しました。

getAppData.php

#!/usr/bin/php
<?php
error_reporting(E_ALL & ~E_NOTICE);

// 引数1は装置ID,引数2は表示したいプロトコル、
// 引数3はとりたいトラフィックを取得する範囲(IF、IFグループ、IPグループ)、引数4でIN、OUTを指定

// 引数が空の場合
if (!$argv[4]) {
    echo 'Kindly specify arg.'.PHP_EOL;
}else if(($argv[4]!='IN') && ($argv[4]!='OUT')){
    echo 'Kindly specify a valid arg.'.PHP_EOL;
}else{
// 第1引数でNFAでの装置IDを指定
    $devID = $argv[1];
// 第2引数でプロトコルを指定
    $prot = $argv[2];
// 第3引数でトラフィックを取得する範囲を指定
    $type = $argv[3];
// 第4引数でIN、OUTの指定
    $inout = $argv[4];

/* ******************************************************** */
    // 連携先のNetFlow Analyzerの情報を入力してください!
    $nfaHost='hostname:8080';
    $apiKey='abcdefghijklmn123456opqrstu7890';
/* ******************************************************** */

if($type=='IFGroup'){
    // NetFlow Analyzer API
    $apiUrl = 'http://' . $nfaHost . '/api/json/nfadevice/getAppData?apiKey=' . $apiKey . '&DeviceID=' . $devID . '&rows=10&chartType=line&Type=Application&TimeFrame=hourly&BussView=true&pageCount=1&tablegridviewtype=Chart&Data=' . $inout;
}else if($type=='IPGroup'){
    $apiUrl = 'http://' . $nfaHost . '/api/json/nfadevice/getAppData?apiKey=' . $apiKey . '&DeviceID=' . $devID . '&Type=Application&chartType=line&TimeFrame=hourly&IPGroup=true&rows=10&pageCount=1&tablegridviewtype=Chart&Data=' . $inout;
}else if($type=='IP'){
    $apiUrl = 'http://' . $nfaHost . '/api/json/nfadevice/getAppData?apiKey=' . $apiKey . '&DeviceID=' . $devID . '&rows=10&chartType=line&TimeFrame=hourly&Type=Application&pageCount=1&tablegridviewtype=Chart&Data=' . $inout;
}

    // Device Listデータの取得
    $deviceList_json = @file_get_contents($apiUrl);

    // Json形式のデータを配列変数に変換
    $dataList = json_decode($deviceList_json, true);

    if (empty($dataList["result"])){
      echo 'Error occurred or No data available..';
    }else{
      //最新の値を取得
      if(empty($dataList["GraphData"][$prot][4]["y"])){
        $datanum = 0;
      }else{
        $datanum = floatval($dataList["GraphData"][$prot][4]["y"]);
      }

      echo $datanum.PHP_EOL;
    }
}

ZabbixのフロントはPHPでできているので、Zabbixが動いているサーバーであれば、特に追加の環境構築等をしなくても、配置してそのまま動くはずです。

…ちなみに、弊社のManageEngine製品はJavaでできているので、「Javaを勉強しろ!」「Javaで作れ!」という声が社内から聞こえてきそうな気がしますが、気にしません。笑

このスクリプトをターミナルから普通に実行してみると、このようになります。

# php getAppData.php 5000036 https IF IN
442.220032

NetFlow AnalyzerのインターフェースIDを指定し、IFのトラフィックのうち、受信したHTTPsのトラフィック量(MB)を取得しています。

# php getAppData.php 2500012 https IPGroup IN
426.299198

こちらは、NetFlow Analyzerで、複数のIPアドレスを管理概念上1つにまとめた、IPグループのトラフィックのうち、受信したHTTPsトラフィックです。

# php getAppData.php 2500012 https IPGroup OUT
81.165802275

送信されたトラフィックを取得するには第4引数を「OUT」にします。

# php getAppData.php 2500054 ssh IFGroup IN
82.045952

こちらは、複数のインターフェースを1つにまとめて管理したインターフェースグループでの、SSHの受信トラフィックです。

このスクリプトでデータを取得できることを確認できましたので、こちらを、Zabbixの外部チェックで定期的に実行し、データをZabbix内で取得できるようにしていきます。

やったこと

  1. スクリプトをZabbixサーバーの所定のディレクトリに配置します。
    Zabbix3.4の場合は、デフォルトでは「/usr/lib/zabbix/externalscripts」のようです。
  2. スクリプトに実行権限を付与します。Zabbixを実行しているユーザーが、getAppData.phpを実行できるように設定してください。
    #chmod 755 getAppData.php ※今回は適当ですが、ファイルのパーミッションは適切で最小限のものを付与することをお勧めします…!
  3. ZabbixのUIを操作します。
    [ホスト] -> 該当のルーターの[アイテム] -> [アイテムの作成]から、外部チェックでスクリプトを作成した通りに実行できるようにします。
    キーには、
    getAppData.php[5000036,https,IF,IN]
    を入力しています。[arg1,arg2,…]の指定で、外部チェックからのスクリプト実行時に引数を指定しています。
  4. [追加]して、値が取得されるのを待ちます。

……来ました!

同じ要領で、他にも確認したいアプリケーションのトラフィック内訳を取得するようにアイテムを作成していきます。

getAppData.php[xxxxxxx,syslog,IF,IN]:指定したIDのインターフェースまたはIPグループまたはインターフェースグループで受信したSyslogトラフィック
getAppData.php[xxxxxxx,ssh,IF,IN]:受信したssh
getAppData.php[xxxxxxx,Unknown_App,IF,IN]:受信したその他トラフィック

その後、必要に応じてグラフを作成。
([ホスト] -> 該当のルーターの[グラフ] -> [グラフの作成])

こちらを、ダッシュボードに配置してみます。

これで無事、トラフィックの内訳データをZabbixと連携することに成功しました!
スクリプトで取得したデータについては、Zabbixのデータと同じデータベース上に保存されますので、のちにデータをさかのぼって調査する必要が出てきたときにも、画面を行ったり来たりする面倒くささは解消されるかと思います。

まとめ

  • SNMPでの監視に合わせて、フローコレクターのデータを合わせることで、より詳細なトラフィックの監視、調査が可能となる
  • Zabbix自体にはフローコレクターの機能はないため、フローコレクターとの連携が必要

SNMPを使用したネットワーク機器監視だけでも多くのことができますが、より詳細な原因把握まで行うのは困難です。

そこで、NetFlow AnalyzerをはじめとしたフローコレクターをZabbixと連携することにより、

「この送信元からこの宛先の通信量が多いので、ネットワークのボトルネックになっている!」

であったり、

「SNMPで出てきたトラフィック総量のうち、何%がSSHの通信だった」
「この時間にこんな量のSSHトラフィックがあるのはおかしい!」

というセキュリティ的な問題を発見できる助けにもなります。

是非既にあるネットワーク監視にプラスしてフローコレクターの監視を実施いただき、快適なネットワーク監視ライフを体感してみてください!

▼▼ 関連記事 ▼▼

YAMAHAのルーター「RTX」を流れるトラフィックの内訳を可視化する方法とは?

▼▼ 【連携してみた】シリーズ ▼▼
Zabbixでネットワーク装置のコンフィグも管理する方法とは?【連携してみた02】

関連リンク

Zabbix公式ホームページ
Zabbixのダウンロードはこちら
NetFlow Analyzer公式ホームページ
NetFlow Analyzerのダウンロードはこちら
NetFlow Analyzer APIはこちら
NetFlow Analyzer製品概要資料のダウンロードはこちら

※永年無料版の利用をご希望の方は、30日間フル機能ご利用いただける「評価版」をダウンロードしてください。30日が過ぎると自動的に2インターフェースまで監視可能の永年無料版となります。


フィードバックフォーム

当サイトで検証してほしいこと、記事にしてほしい題材などありましたら、以下のフィードバックフォームよりお気軽にお知らせください。