Fluent-plugin-sflow でっちあげた

fluent-plugin-sflow

JuniperやAlaxala, NEC製品などでサポートされているsFlowプロトコルのサンプルを受信するFluentdプラグインを書きました。

netflowプロトコルについては repeatedly さんが既にfluent-plugin-netflowを公開されています。 今回NECのIXシリーズからフローデータを送りつけたいという要望が某所であったため、実装してみました。 とはいえsflowのプロトコルを捌く部分は別の方のパーサに頼っています。

使い方

fluent-gemやtd-agent-gemでインストールするだけです。

1
% fluent-gem install fluent-plugin-sflow

設定項目は以下の通りです。 待ち受けアドレス(bind)、待ち受けポート(port)そしてタグ名ぐらいしかありません。

1
2
3
4
5
6
7
8
9
10
11
<source>
  @type sflow
  tag sflow.example

  bind 0.0.0.0
  port 6343
</source>

<match sflow.example>
  @type stdout
</match>

host-sflow と組み合わせたテスト

実際のテストにはスイッチやルータが必要ですが、手元で簡単に試すために host-sflow を導入します。 ここではMac OS X (MacBookPro)上に導入しWi-Fiのインタフェース(en0)のデータをサンプリング、先に挙げた設定で同一ホスト上で動作するfluentdに投げ込んでみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
% git clone https://github.com/sflow/host-sflow.git
% cd host-sflow

% make

# pcap のターゲットデバイスとして en0 を指定する
% cat > /tmp/test.conf
sflow {
  polling=10
  collector { ip = 127.0.0.1 udpport=6343 }
  pcap { dev=en0 }
}
^D

# host-sflowの起動(デバッグ目的で -dddd としている)
% sudo ./src/Darwin/hsflowd -dddd -f /tmp/test.conf

fluentdの標準出力をしばらく眺めていると、以下の様にフローサンプルが出力されます。この時は *.twttr.com (twitter) への通信がキャッチされたようです。

1
2
3
4
5
6
7
% fluentd -vv -c example/fluentd.conf
(中略)
2017-03-24 18:52:50.054347000 +0900 example.sflow: {"agent_address":null,"i_octets":0,"o_octets":0,"interface":6,"input_packets_error":0,"output_packets_error":0}
2017-03-24 18:52:52.519715000 +0900 example.sflow: {"agent_address":null,"sampling_rate":"400","i_iface_value":0,"o_iface_value":0,"ipv4_src":"199.59.148.241","ipv4_dst":"192.168.10.17","udp_src_port":1900,"udp_dst_port":57347,"frame_length":1486,"frame_length_multiplied":594400,"tcp_src_port":443,"tcp_dst_port":58076}
2017-03-24 18:53:01.984184000 +0900 example.sflow: {"agent_address":null}
2017-03-24 18:53:09.934539000 +0900 example.sflow: {"agent_address":null,"i_octets":0,"o_octets":0,"interface":6,"input_packets_error":0,"output_packets_error":0}
(中略)

ネットワーク機器にてよく見られるカウンタサンプルとフローサンプル以外にも、host-sflowはOSやアプリケーションの各種メトリックを集めsFlowプロトコルに載せて送信します。 現状の fluent-plugin-sflow ではカウンタ/フローサンプルのパースしかサポートしていないため、それらのメトリックは空扱いになります(上記5行目)。

ToDo

  • bindata 1.8.1以上への対応
    • 現状 Sflow5rawpacketdataVLAN の type メンバが BinData::Record あたりで定義されてる名前と被ってるらしく怒られるので、1.8.1にしている
    • fluent-plugin-netflowは2.5.3ベースであり、こちらと揃えたい
    • 名前の変更にはおそらく次の項目をクリアする必要がある
  • パーサーの取り込み
    • 現状、NETWAYS/sflowのパーサをリポジトリごと丸っと使っている
    • ライセンスとオリジナルを明記した上でパーサとモデルの部分だけコピーしてくる
    • または全部1から書き直す
  • IPv6対応

Comments