sflowもFluentd+Elastic Searchに入れて可視化してみた

以前にNetflowについて書いたのですが、sflowもelastcsearchに入れたいなと思って色々調べてみました。ちなみに前回からkibanaのバージョンをあげましてkibana 4はこんな画面になってます。検証用のデータですが気持ち的にIPアドレスは隠しました。

f:id:komeiy:20150902212446j:plain

ホワイトを基調のデザインに一新されており個人的には好感が持てるデザインになっています。機能的にはグラフオプションが強化されて実現できることが多くなっています。

komeiy.hatenablog.com

  • kibana 4になり、対応するElastic Searchのバージョンも1.4以降に変更になっているため注意が必要です

調査フェーズ

logstashを使ってElastic Searchへ入れるパターン

まず、調べてたところlogstashで以下のような方法があるようなので少し調査。

https://github.com/NETWAYS/sflow

Tiny sflow collector and parser script based on eventmachine. It listens for sflow v5 samples, parses them and sends it to logstash.

インストール自体は楽そうですが、issuesのやりとりやflow sourceを都度設定ファイルやhostsに書かなければいけない(っぽい)点とsnmpがなぜか絡んでくるのがどうしてもすっきりせずパスしました。

(できれば設定はtd-agent.confで統一したいという思いもありすいません)

sflowをnetflowに変換してあれこれするパターン

世の中には便利なものがあるもので、今回sflowtoolを使うことにしました。結局、NETWAYS/sflowのissueでもsflowtoolをwrapperとして使用する方法について記載がありました。

sflowtoolは名前の通りsflowを扱うためのツールなのですが、任意のポートで受信し他のコレクタに渡したりcsvで吐き出したり、pcap形式に落としたり、あと今回重要なnetflowに対応したコレクタにフローを飛ばすことも可能です。

ということで、sflowtool -> fluentd -> elastic searchの流れでデータを注入することにしました。

sflowtoolインストール

最新版はgithubにあります。Versionは3.28でした。

git clone https://github.com/kplimack/sflowtool.git
cd sflowtool/

cloneしたら、configure / make / make installしてください。

パスが通っていれば$ sflowtoolで起動します。

参考)以下のログが出た人へ

v6 socket() creation failed, Address family not supported by protocol

デフォルトでlisten on both IPv4 and IPv6 socketsなので、ipv6をdisableにしている人は-4オプションを使ってください。

sflowを受信してみる

起動して受信すると以下の項目が値と共に出力されます。

startDatagram 
datagramSourceIP
datagramSize
unixSecondsUTC 
datagramVersion 
agentSubId 
agent
packetSequenceNo
sysUpTime 
samplesInPacket 
startSample ----------------------
sampleType_tag
sampleType
sampleSequenceNo 
sourceId 
meanSkipCount 
samplePool 
dropEvents 
inputPort 
outputPort 
flowBlock_tag
flowSampleType 
headerProtocol 
sampledPacketSize 
strippedBytes 
headerLen 
dstMAC 
srcMAC 
decodedVLAN 
decodedPriority 
IPSize
ip.tot_len 
srcIP 
dstIP 
IPProtocol 
IPTOS 
IPTTL 
TCPSrcPort 
TCPDstPort 
TCPFlags 
endSample   ----------------------
endDatagram   =================================

NetFlowに飛ばしたいのであれば以下のオプションを使います。

To forward Cisco NetFlow v5 records to UDP port 9991 on host collector.mysite.com, the
options would be:

% ./sflowtool -p 6343 -c collector.mysite.com -d 9991

Fluentd(td-agent)で受けてstdoutに出るようtagをdebugにしてみました。一回sflowtoolが受信するのでhostが127.0.0.1になってしまうのが残念です。ただ、本来のNetflowへ変換という意味ではVersion 5へしっかりと変換してくれました。

2015-09-02 23:23:10 +0900 debug.netflow: {"version":"5","flow_seq_num":"19","engine_type":"0","engine_id":"0","sampling_algorithm":"0","sampling_interval":"0","flow_records":"1","ipv4_src_addr":"1.1.4.1","ipv4_dst_addr":"1.1.7.1","ipv4_next_hop":"0.0.0.0","input_snmp":"1026","output_snmp":"1026","in_pkts":"32768","in_bytes":"1507328","first_switched":"2015-09-02T23:23:10.000Z","last_switched":"2015-09-02T23:23:10.000Z","l4_src_port":"52193","l4_dst_port":"80","tcp_flags":"16","protocol":"6","src_tos":"0","src_as":"0","dst_as":"0","src_mask":"0","dst_mask":"0","host":"127.0.0.1"}

ここからのElastic Searchへの挿入は前回と同様です。

その他

  • Elastic Search pluginで@timestamp_sourceは挿入されるのでkibanaから見ると前回と同じ仕様です
  • sflowtoolが増えましたが、既存のFluentdの設計を踏襲できるのでシンプルで分かりやすいと思っています

シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。

このエントリーをはてなブックマークに追加

高速スケーラブル検索エンジン ElasticSearch Server (アスキー書籍)

高速スケーラブル検索エンジン ElasticSearch Server (アスキー書籍)

広告を非表示にする