Help us understand the problem. What is going on with this article?

GrafanaによるNetFlow v9トラフィック分析

More than 3 years have passed since last update.

ルーターからエクスポートされるNetFlow version 9レコードを収集してトラフィック状況を視覚化、分析するシステムを構築してみました。

完成品イメージ

GrafanaによるNetFlowトラフィック可視化ダッシュボード

grafana_dashboard2.png

目的

NetFlow v9に対応したフリーの可視化ソフトウェアが少なく、商用ソフトウエアは高価なため、気軽に可視化できるしくみを作れないかと思っていたところ、NetOpsCoding #3勉強会で、日本マイクロソフトの北島さんの「Monitoring Intelligence」というプログラム紹介されていたツールを応用すれば作れそうかなと思いトライしてみました。

構築

NetFlowエクスポーター(ルーター)の準備、構築

Cisco ASR1001を使ってみました。

  • Cisco ASR 1001
    • IOS XE Software, Version 03.16.03.S

Cisco AVC(Application Visibility and Control)という機能で、トラフィックをアプリケーション識別させるフィールドをNetFlow v9テンプレートに載せてみました。

設定はこんな感じです。
cisco_netflow_config.png

フローレコード情報とテンプレート出力を確認。

#show flow monitor monitor-avc-monitoring cache format table 

IPV4 SRC ADDR    IPV4 DST ADDR    APP NAME                          trns src port  trns dst port  intf input            intf output                bytes        pkts    time first     time last  ip prot
===============  ===============  ================================  =============  =============  ====================  ====================  ==========  ==========  ============  ============  =======
X.X.X.X          X.X.X.X          layer7 twitter                            52441            443  Gi0/0/1               Gi0/0/0                     4898          37  11:43:44.132  11:43:51.553        6
X.X.X.X          X.X.X.X          layer7 facebook                             443          52321  Gi0/0/0               Gi0/0/1                   112313         130  11:43:27.969  11:43:52.749        6
X.X.X.X          X.X.X.X          layer7 skype                              51200            443  Gi0/0/1               Gi0/0/0                      793           3  11:43:27.383  11:43:31.048        6
X.X.X.X          X.X.X.X          layer7 ssl                                  443          51467  Gi0/0/0               Gi0/0/1                    15644          12  11:43:33.639  11:43:33.789        6
X.X.X.X          X.X.X.X          port telnet                                  23          52400  Gi0/0/0               Gi0/0/1                     8269          11  11:43:36.925  11:43:55.947        6
X.X.X.X          X.X.X.X          layer7 google-services                      443          52469  Gi0/0/0               Gi0/0/1                      712           9  11:43:49.134  11:43:49.351        6
#show flow exporter exporter-avc-monitoring templates
Flow Exporter exporter-avc-monitoring:
Client: Flow Monitor monitor-avc-monitoring
Exporter Format: NetFlow Version 9
Template ID    : 274
Source ID      : 256
Record Size    : 41
Template layout
_____________________________________________________________________
|                 Field                   |  Type | Offset |  Size  |
---------------------------------------------------------------------
| ipv4 source address                     |     8 |     0  |     4  |
| ipv4 destination address                |    12 |     4  |     4  |
| ip protocol                             |     4 |     8  |     1  |
| transport source-port                   |     7 |     9  |     2  |
| transport destination-port              |    11 |    11  |     2  |
| interface input snmp                    |    10 |    13  |     4  |
| application id                          |    95 |    17  |     4  |
| interface output snmp                   |    14 |    21  |     4  |
| counter bytes                           |     1 |    25  |     4  |
| counter packets                         |     2 |    29  |     4  |
| timestamp sys-uptime first              |    22 |    33  |     4  |
| timestamp sys-uptime last               |    21 |    37  |     4  |
---------------------------------------------------------------------

NetFlowコレクター(可視化ツール)の準備、構築

DockerHub上のイメージを使ってFluentdとInfluxDB、Grafanaを準備します。

使用したOS, ツールは以下です。

  • Ubuntu 16.04.1 LTS
  • Docker 1.10.3
  • Docker Image
    • fluent/fluentd 0.12.28 (latest)
    • influxdb 0.13.0 (latest)
    • grafana/grafana 3.1.1 (latest)
  • Fluentd Plugin
    • fluent-plugin-influxdb (0.2.8)
    • fluent-plugin-netflow (0.2.4)

Ubuntu/Dockerの準備

Dockerをインストールします。Ubuntu atp docker.ioパッケージをインストールします。

$ sudo apt install docker.io

Fluentdの準備

ルーターからのNetFlowデータを受信してInfluxDBに保存するFluentdをインストールします。
fluent-plugin-influxdb, fluent-plugin-netflow両方のプラグインに対応したDocker Imageがなかったため、fluent projectのFluentd Docker Image (fluent/fluentd)をcloneしてカスタマイズしてbuildしました。

$ git clone https://github.com/fluent/fluentd-docker-image.git
$ cd fluentd-docker-image/
Dockerfile.
$ diff -uw Dockerfile.orig Dockerfile
--- Dockerfile.orig     2016-08-25 11:03:39.264019589 +0900
+++ Dockerfile  2016-08-25 11:02:59.523127344 +0900
@@ -14,6 +14,8 @@
     echo 'gem: --no-document' >> /etc/gemrc && \
     gem install oj && \
     gem install fluentd -v 0.12.28 && \
+    gem install fluent-plugin-influxdb && \
+    gem install fluent-plugin-netflow && \
     apk del build-base ruby-dev && \
     rm -rf /tmp/* /var/tmp/* /var/cache/apk/* /usr/lib/ruby/gems/*/cache/*.gem
fluent.conf
<source>
  type netflow
  tag netflow
  bind 172.17.0.3
  port 9996
</source>
<match netflow>
  type influxdb
  host influxdb
  port 8086
  dbname netflow9
  time_precision s
  tag_keys ["app_id", "first_switched", "last_switched", "flowset_id", "host", "input_snmp", "output_snmp", "ipv4_src_addr", "ipv4_dst_addr", "l4_src_port", "l4_dst_port", "protocol", "version", "ip_dscp", "ip_frag_offset", "ip_frag_flags", "icmp_ipv4_type", "icmp_ipv4_code", "tcp_ack_num", "tcp_header_len", "tcp_flags" ]
</match>
<match **>
 type stdout
</match>
$ cd ..
$ sudo docker build -t fluentd-netflow:fluentd fluentd-docker-image

InfluxDBの準備

$ sudo docker pull influxdb

Grafanaの準備

$ sudo docker pull grafana/grafana

Dockerイメージの起動

InfluxDBの起動、InfluxDBのセットアップ、Fluentd, Grafana起動の順におこないます。

$ sudo docker run -d --name=influxdb -p 8083:8083 -p 8086:8086 -v $HOME/influxdb:/var/lib/influxdb influxdb

$ influx
> create database netflow9
> create retention policy netflow on netflow9 duration 8w replication 1 default

$ sudo docker run -d --name=fluentd --link influxdb:influxdb -p 24224:24224 -p 9996:9996/udp -v $HOME/fluentd/:/var/lib/fluentd fluentd-netflow:fluentd

$ sudo docker run -d --name=grafana --link influxdb:influxdb -p 3000:3000 -v $HOME/grafana/:/var/lib/grafana grafana/grafana

データの確認

以下の様なコマンドでレコードが出力されたらNetFlowレコードのDB書き込みが成功しています。

$ influx
> use netflow9
> select * from netflow where time > now() - 3m

Grafanaのセットアップ

Grafanaのセットアップは「GrafanaとInfluxDBでネットワークリソースの視覚化」の記事が参考になります。
GrafanaのGraph設定のMetrics項目に設定する内容は以下を参考にしてください。

インターフェースから入ってくるトラフィック
SELECT sum("in_bytes") *8/30.0 FROM "netflow" WHERE "input_snmp" = '1' AND  $timeFilter GROUP BY time(30s) fill(0)

インターフェースから入ってくるTCPトラフィック
SELECT sum("in_bytes") *8/30.0 FROM "netflow" WHERE "input_snmp" = '1' AND "protocol" = '6' AND  $timeFilter GROUP BY time(30s) fill(0)

インターフェースから入ってくるトラフィックのうちCisco AVCでTwitterと識別されるトラフィック
SELECT sum("in_bytes") *8/30.0 FROM "netflow" WHERE "input_snmp" = '1' AND "app_id" = '218104325' AND $timeFilter GROUP BY time(30s) fill(0)

完成

色々と試してみてください。
コメントなど歓迎します。

参考資料

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした