docker + fluentd + Elasticsearch + kibana4 で構築するお手軽NetFlowアナライザ

  • 17
    いいね
  • 0
    コメント

この記事は慶應義塾大学SFC村井&徳田研 Advent Calendar 2015 の13日目の記事です。


はじめに

慶應義塾大学湘南藤沢キャンパス(SFC)では毎年11月にOpen Research Forumというイベントを開催しています。

すごくざっくり説明すると、日頃学生が取り組んでいる研究についての発表会みたいなものです。

私が専攻している情報工学分野の他にも国際政治や環境問題、脳科学、建築、言語コミュニケーションなどといった分野について、日ごろ学生が取り組んでいる内容についてのポスターセッションを行ったり、制作物を展示したりしています。

次年度以降も開催されると思うので、興味がありましたらぜひお立ち寄りくださいませ。


閑話休題、今回私はNOCの一員としてORFに携わらせていただいたのですが、その中で展示物として会場内のトラフィックをNetflowで収集して、それを可視化させたものを展示いたしました。

構成は以下のようになっております。 (2016/4/21 久しぶりに動かそうと思ったら動かなかったので、構成をちょっと変えました)

system.png

非常に粗雑な図でわかりづらいので解説をすると、会場のトラフィックをNetflowで取得し、それをfluentdで中継してElasticserachに蓄積し、Kibanaで可視化をする、といったものになっています。

受信側のFluentd, Elasticserach, Kibana は Dockerのコンテナとして管理しています。

なお、fluentdでNetflowを中継する際にはfluent-plugin-netflowを利用させていただきました。

使い方

ソースコードをこちらに置いておきました。

(追記) 当該リポジトリを削除したのでこちらに設定ファイルを置きます。2年前に使って以来動作を確認していないので動作は保証しません。

aggregator.yml
es:
  image: itzg/elasticsearch
  volumes:
    - /mnt/elasticsearch-data:/usr/share/elasticsearch/data
  ports:
    - 9200:9200
    - 9300:9300

kibana:
  image: kibana
  ports:
    - 5601:5601
  links:
    - es:elasticsearch

# fluentd:
#   build: ./fluentd
#   ports:
#     - 24224:24224
#     - 24224:24224/udp
#   links:
#     - es:es

docker-engineとdocker-composeがインストールされていることを前提としています。
Ubuntu14.04.3 LTS と Debian 8 (jessie) で動作を確認しています。

NetFlow送信側の設定

上図でいう、ホスト側にfluentdが置いてある部分です。

$ gem install fluentd
$ fluent-gem install fluent-plugin-netflow fluent-plugin-elasicsearch
$ ./fluentd -c ./fluent.conf

fluentdをgemで入れた後、fluentd-plugin-netflowを入れて、fluentdを起動しています。
fluent.confの設定例は下記の通り。

# input
# source configuration is cited from github.com/repeatedly/fluent-plugin-netflow
<source>
  type netflow
  tag netflow.event

  # optional parameters
  bind 127.0.0.1
  port 5140

  # optional parser parameters
  cache_ttl 6000
  versions [5, 9]
</source>

# output
<match netflow.event>
    @type elasticsearch
    logstash_format true

    # setting your host ip address
    host YOUR_HOST_IP_ADDRESS
    port 9200

    # index name is arbitrary
    index_name fluentd
    type_name netflow

    flush_interval 60
</match>

YOUR_HOST_IP_ADDRESSの箇所にはelasticsearchが稼働しているホストのIPアドレスを指定してください。

NetFlow受信側の設定

dockerでホストされている部分です。
docker-composeで一気に立ち上げちゃいます。docker-compose、便利ですね。

$ docker-compose up -d

完成図的なもの

こんな具合に可視化とインタラクティブな分析ができます。可視化部はkibanaでいろいろいじれます。
20151120_netflow_edited.png

おわりに

Elasticsearchにレコードが蓄積すると表示や検索が重くなってしまうのが難点ですが、お手軽にモダンな監視環境が簡単に作れます。
各ディレクトリのfluent.confを書き換えればNetFlow以外もお手軽に流し込めるかなと思います。
何かの参考になれば幸いです。