
はじめまして、プラットフォームサービスの恩田です。
今回はNetFlowを利用してネットワーク機器を通過するパケットを
コレクタサーバに収集し、elasticsearch+kibanaで可視化してみようと思います。
NetFlowとは?
NetFlowとはネットワーク上を流れるトラフィックフローを受動的にモニタできる機能です。
これまでもSNMP等でネットワーク機器を通過するパケットのトラフィック量や
CPU、メモリ使用率などについては情報を取得できました。
NetFlowでは、SNMPでは取得できなかったクライアントPCのIPアドレスや宛先IPアドレス、
ポート番号(TCP/80番ポート)などネットワーク機器を通過するパケットの
詳細な情報を取得することが可能です。
検証環境
今回はVM環境に以下のような検証環境を構築してみます。
- VyOS : OSSのソフトウェアルータ。今回NetFlowの設定を行う機器です。
- コレクタサーバ : CentOS7上で以下のミドルウェアを利用します。
- fluentd(td-agent)
- elasticsearch
- kibana
ざっくりとした構成図。
VyOSにNetFlowの設定
今回はVyOSの初期セットアップについては省略します。
VyOSでのNetFlowの設定は以下の通りです。
# 設定モードに移行
configure
# NetFlowで監視するインタフェースの指定(今回は検証環境のため両方のインタフェースを指定)
set system flow-accounting interface eth0
set system flow-accounting interface eth1
# サンプリングレートの指定(10個ごとに1個のパケット)
set system flow-accounting netflow sampling-rate 10
# Flowを集めるサーバ(コレクタサーバ)とポート番号の指定
set system flow-accounting netflow server 169.254.0.200 port 5141
# 60秒で動作しなければタイムアウトとみなす
set system flow-accounting netflow timeout expiry-interval 60
# NetFlowバージョンの指定
set system flow-accounting netflow version 5
# 変更のコミットと設定の保存
commit
save
fluentd(td-agent)のインストールとセットアップ
CentOS7にfluentdをインストールし、NetFlowの情報を受信できるようにセットアップを行います。
今回はfluentdのラッパープログラムのtd-agentをインストールします。
fluentdの公式ダウンロードページ(https://docs.fluentd.org/v1.0/articles/install-by-rpm)を参考に
インストールのシェルスクリプトを実行。
※事前の準備については、省略します。
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.5.sh | sh
これでtd-agentのインストールまで完了します。
続けて、NetFlowから送られるデータ処理に必要なプラグインをインストールします。
yum -y install gcc libcurl-devel
td-agent-gem install fluent-plugin-elasticsearch
td-agent-gem install fluent-plugin-netflow
次に、td-agentのconfファイルに、NetFlow用の設定を追加します。
ファイルの最下行に以下を追記します。
vi /etc/td-agent/td-agent.conf
##
# NetFlow
#
<match netflow.**>
type elasticsearch
host localhost
port 9200
type_name netflow
logstash_format true
logstash_prefix flow
logstash_dateformat %Y%m%d
</match>
<source>
type netflow
tag netflow.event
port 5141
versions [5, 9]
</source>
追記が完了したら、一度td-agentを再起動しておきます。
systemctl restart td-agent
elasticsearchとkibanaのインストール
elasticsearchとkibanaのインストールを行います。
elasticsearchはJavaで動作するミドルウェアなので、JDKを事前にインストールしておきます。
今回は"java-1.8.0-openjdk"を利用します。
yum -y install java-1.8.0-openjdk
続いて、elasticsearchをインストールしていきます。
RPMパッケージをwgetで取得し、インストールを行います。
現時点で最新の6.4.2をインストールしておきます。
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.2.rpm
rpm -ivh elasticsearch-6.4.2.rpm
次に、kibanaのインストールです。
こちらもelasticsearchと同様の手順でインストールを行います。
バージョンもelasticsearchと同じ6.4.2をインストールしておきます。
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.2-x86_64.rpm
rpm -ivh kibana-6.4.2-x86_64.rpm
elasticsearchおよび、kibanaの設定ファイル修正
elasticsearchとkibanaをインストールするとデフォルトでlocalhostからしかアクセスできないため
設定ファイルを修正し、起動させておきます。
elasticsearchの設定ファイルの修正
vi /etc/elasticsearch/elasticsearch.yml
network.host: "0.0.0.0"
kibanaの設定ファイルの修正
vi /etc/kibana/kibana.yml
server.host: "0.0.0.0"
設定ファイルの修正が完了したら、elasticsearchとkibanaを起動させます。
systemctl start elasticsearch
systemctl start kibana
kibanaにアクセスしてみる
今回の環境では、Webブラウザでコレクタサーバの5601番ポートにアクセスすると
kibanaのWebUIにアクセスできます。
NetFlowの情報収集の設定を行う
まずは、NetFlowのindexを登録します。
kibanaのメニューから[Management]を選択し、以下の設定を行います。
- [Index Patterns]から[+Create Index Pattern]を押下
- [Index pattern]に「flow-*」と入力
- [Time Filter field name]は「@timestamp」を選択
上記の設定でindexを作成します。
Indexが作成できたらkibanaのメニューから[Discover]を選択します。
先ほど作成した[flow-*]というインデックスを選択すると、NetFlowで送られた情報が確認できます。
この画面でも簡単なフィルタ操作で情報を抽出することが可能です。
※下の画像では、送信元/宛先のIPアドレスとポート番号/プロトコル番号を抽出しています。
ダッシュボードの作成
今回はNetFlowで受信したデータをkibanaでグラフ化してみます。
あらかじめ、抽出したい情報のグラフをテンプレート化しておき、
ダッシュボードに登録しておくことで、NetFlowで受信したデータから必要な情報をグラフ化できます。
検証環境では、あまり多くのトラフィックが流れていないですが、
送信元/宛先ポート番号ごとの棒グラフと送信元/宛先IPごとの円グラフを作成してみました。
最後に
検証環境のため、実際のトラフィックとは違いましたが、
NetFlowにてネットワーク機器を通過するパケットを取得し、
fluentd、elasticsearch、kibanaを用いてグラフ化できました。
NetFlowでは、これまでSNMPで取得していた情報よりも細かく情報を取得できるため
ルータなどで不意に大量のトラフィックが発生した際など、
切り分けのツールとして利用できれば、原因発見が早くなりそうです。