Logの可視化として、FuluentdとElasticsearch/Kibanaの組み合わせが使われています。今回のこの組み合わせで、OpenStackのOVS上に流れるトラフィックを可視化します。NWトラフィックを可視化する場合にOpenStack環境の物理スイッチ側でトラフィックを取ることも出来ますが、仮想マシン間の通信がホスト内で完結されてしまうと、その部分のトラフィックの様子を見る事が出来ません。OpenStackの構造上、各ホスト上のbr-int上を流れるトラフィックを可視化出来れば仮想マシン間も含めたすべての通信を見ることが出来ると考えられます。
Netflow / sFlowについて
NetflowはCisco機器が備えているNW可視化の仕組みです。ポートミラーリングはトラフィクをコピーする仕組みですが、NetflowはIPアドレスやポート番号等の情報を抜き出して、指定のホストに対して情報を送信する仕組みです。sFlowはNetflowを一般化したものになります。Fluentd用にNetflowプラグインが開発されていますので、Netflowで出力すれば簡単にElasticsearch側にデーターを出力出来ます。しかしながらOVSはNetflowでの出力も備えていますが、サンプリングレートや出力先のインターフェースの指定を備えていないようです。今回br-intのトラフィックを取るためにインターフェース自体にIPは振られていないため、出力先インターフェースの指定が必要です。そのため今回はOVSからはsFlowで出力して、それをNetFlowに再変換してElasticsearchに入力します。
OVSの設定を行う
OVS上でのsFlowの設定方法は以下に詳しく述べられています。
http://openvswitch.org/support/config-cookbooks/sflow/
OpenStackのコンピュートノードや、コントローラーノード上で以下の設定を行いbr-int上に流れるトラフィックのsFlowのデーターを送付します。送信先はsFlow Toolが動作するホストになります。sFlow Toolが動作するホストは10.0.0.1の想定で設定しています。
ovs-vsctl — –id=@sflow create sflow agent=eth1 target=”10.0.0.1:6343″ header=128 sampling=64 polling=60 — set bridge br-int sflow=@sflow
sFlow Toolを使う
sFlow ToolはsFlowを可視化してくれたり、NetFlowへの変換行ってくれるツールです。基本的に以下のレポジトリからCloneして、makeすればバイナリを生成して利用出来ます。
https://github.com/sflow/sflowtool
以下のコマンドで起動しておけばsFlow ToolがsFlowのデーター受け取った後に、Netflowに変換して送信してくれます。以下はLocalのFluentdに送信する想定です。
sflowtool -p 6343 -c 127.0.0.1 -d 5140
FluentdのNetflow Pluginを使う
Fluentd用のNetflow Pluginは以下で開発されています。
https://github.com/repeatedly/fluent-plugin-netflow
FluentdのコマンドでこのNetflow Pluginをインストールします。
td-agent-gem install fluent-plugin-netflow
インストール後にFluentdのtd-agent.confで以下の設定を行えば変換されたNetflowのトラフィックを受け取る事が出来ます。受け取ったNetflowのトラフィックにはgeo.netflowのタグ付けをして次の処理を行います。
<source> type netflow tag geo.netflow port 5140 versions [5] </source>
IPアドレス情報からGeoLocationを生成する
sFlowで収集した情報にSourceやDestのIPアドレスを元に、GeoLocatoinのタグを付与してあげれば、Kibana上で通信の場所をプロット出来ます。今回はFluentdのIPアドレスからGeoLocationタグを生成出来る以下のプラグインを利用します。
https://github.com/y-ken/fluent-plugin-geoip
以下のコマンドでインストールします。Developer Tool等のインストールも必要になります。
# sudo yum group install "Development Tools"
# sudo yum install geoip-devel --enablerepo=epel
# td-agent-gem install fluent-plugin-geoip
以下の設定をtd-agent.confに追加するとGeo Locationへの変換を行ってくれます。今回の設定ではDestination IPを元にGeoタグを付与しています。
<match geo.netflow> type geoip geoip_lookup_key ipv4_dst_addr <record> geoip_pin ${latitude["ipv4_dst_addr"]},${longitude["ipv4_dst_addr"]} </record> remove_tag_prefix geo. tag es.${tag} skip_adding_null_record </match>
Elasticsearchにデーターを送る
データーを送信し始める前にElasticsearch側が必要なデーターをGeo Tagとして認識出来るようにテンプレートを定義しておきます。
curl -XPUT localhost:9200/_template/flow -d ' { "template" : "flow-*", "mappings" : { "netflow" : { "properties" : { "@timestamp" : { "type" : "date", "format" : "dateOptionalTime" }, "ipv4_src_addr" : { "type" : "string" }, "geoip_pin" : { "type" : "geo_point" } } } } }'
FluentdのElasticsearchプラグインをインストールします。
# td-agent-gem install fluent-plugin-elasticsearch
FluentdのElasticsearchプラグインでデーターを送付します。td-agnt.confの設定は以下の通りです。以下の例ではLocalのElasticsearchにデーターを送信しています。
<match es.netflow> type elasticsearch host 127.0.0.1 port 9200 type_name netflow logstash_format true logstash_prefix flow </match>
Kibanaで可視化する
Elasticsearchで集めたデーターはKibanaを使って、以下のように可視化出来ます。
まとめ
実運用で使うなら、sFlow toolを挟まずにFluentdかLog StashのsFlowプラグインを開発した方が良い気がします。
sFlowなどは門外漢ですが、これとか使えたりしますでしょうか?
https://github.com/FStelzer/flowbeat
いいねいいね
ありがとうございます。ちょっと試してみます。
いいねいいね