[Dynatrace] NetFlow の情報をDynatraceに取り込み可視化する

# ご無沙汰しております 
人生初のQiita投稿からちょうど2週間が経過しました。やはいですね。。。ゆえに、そろそろ次のネタを書こうと思います。今回のテーマは、[前回のTelegrafを使ったPing監視のデータの取り込み](https://qiita.com/yasusuzu/items/6fea942fc75eb7d0b28e)に続き、ネットワーク関連です。Dynatraceは、ObservabilityのPlatformとしては有名ですが（多分）、一方でネットワーク監視に関してはでは少し出遅れている、もしくはいろいろ制約があり、使えないのでは？という印象をお持ちの方が多いのではないかと思います。確かに、Dynatraceが提供する純正のソフトウェア（OneAgentやActiveGate）を介して、ネットワーク関連の監視をしようとすると少しハードルが高いですが、その代わり、Metrics Ingest APIやLog Ingest APIが提供されているため、そこから自由にデータを取り込めるので、Open source tools と組み合わせると、以外と何でもできちゃいます。今日は、ネットワーク監視でひろく使用されている「NetFlow」のデータをDynatraceに取り込み、Dashboardで可視化したいと思います。

# NetFlowとは？
Netflowとは、SNMPとは異なりネットワークトラフィックをIPのパケット単位で、データの送信元、送信先などの細かい情報を集計する仕組みのこを言います。SNMPは各ルータやインターフェイス単位で、データの総量を計測することしかできませんが、NetFlowはその中身を細かく分析できるのが大きな特徴です。イメージは下図のように、Hop-by-hopでパケットが転送された際、NetFlowを有効にしたあるルータが当該ルータを経由するパケットの各種詳細データ（IPアドレス、プロトコル、ポート番号、データ量、パケット数など）を集計して、NetFlowサーバにデータを転送してくれる仕組みです。なお、NetFlowの説明は、Ciscoの[こちら](https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/fnetflow/configuration/15-mt/fnf-15-mt-book/fnf-fnetflow.html)のページを参照して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/05758e64-8e08-c4e3-a4d6-f27f95d2a5bb.png)

# NetFlow on Dynatrace

### 準備するもの
では、実際にNetFlowデータをDynatraceへ取り込んで行きましょう。準備するものは、下記3点です。
1. DynatraceのPlatform
Dynatraceのテナントをお持ちでない方は、フリートライアルのリンクからテナントを作成しましょう。--> https://www.dynatrace.com/ja/trial/
2. DynatraceでNetFlowデータを取り込むためのLogstash
Elastic社のLogshtashのInputとしてNetFlowデータを受け付け、OutputとしてDynatraceのPluginを指定して、DynatraceのLog Ingest APIへデータを転送
[Logstash](https://www.elastic.co/guide/en/logstash/current/getting-started-with-logstash.html)
[Dyntrace ouput plugin](https://github.com/dynatrace-oss/logstash-output-dynatrace)

3. NetFlowデータを生成するGenerator
Generatorは世の中沢山あると思いますが、今回のブログではこちらで紹介されているツールを使用しました。
[nflow-generator](https://openobserve.ai/blog/analyzing-network-traffic-using-netflow)
:::note info
なお、[netflow module for logstash](https://www.elastic.co/guide/en/logstash/8.13/netflow-module.html#netflow-module) は、logstash version 7.4.0 から depreciated になっていますので、正しくは filebeat >> logstash という順番で NetFlow data を取り込む必要があります。ゴメンナサイ、ここではそのやりかたを割愛します。
:::
### Logstashの設定
まずは、logstash をインストールします。今回は、自分のLaptop上でWSL2（Ubuntu 22.04/jammy）を起動させ、それにインストールしています。私の環境は、`Ubuntu`ので、Elastic社のページの`apt`の[Section](https://www.elastic.co/guide/en/logstash/current/installing-logstash.html#_apt)に記載されている手順に従い最新版をインストールしています。
```ruby:WSL2
yasusuzu@test:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy
```
無事にインストール出来たら、logstashが `active(running)` で稼働しているか確認しておきましょう。
```ruby:systemctl
yasusuzu@test:~$ systemctl status logstash
● logstash.service - logstash
     Loaded: loaded (/lib/systemd/system/logstash.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2024-05-20 09:00:14 JST; 2h 24min ago
   Main PID: 205 (java)
      Tasks: 115 (limit: 38256)
     Memory: 1.5G
     CGroup: /system.slice/logstash.service
             └─205 /usr/share/logstash/jdk/bin/java -Xms1g -Xmx1g -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djruby.compile.invokedynamic=true -XX:+HeapDumpOnOutOfMemoryError -D>
```
で、ここからが具体的な設定です。まずは、`/etc/logstash/conf.d` に netflow.conf というファイルを作成し、ここで input と output の設定を行います。以下、私の netflow.conf ファイルです。Dynatrace 側で、LogstashからのデータをLogとして取り込む際に必要なTokenのPermissionは __Ingest logs__ のみです。

```ruby:netflow.conf
input {
  udp {
    port  => 9995 ### これはこの後の netflow generator が送信するUDPポート番号を合わせましょう
    codec => netflow ### udp port 9995 に入ってきたデータをNetFlowデータとして認識、parseできるよう、codec を netflow に指定
  }
}

output {
  dynatrace {
    id => "dynatrace_output"  ### 任意の名称
    ingest_endpoint_url => "https://i<tenant id>.live.dynatrace.com/api/v2/logs/ingest" ### 自身のDynatraceのテナントURL
    api_key => "dt0c01.<your own token>" ### Log としてNetfFlowデータを取り込むためのトークン
  }
}
```
netflow.conf の設定が終わったら、systemctl restart logstash で logstash プロセスを再起動させます。その後、logstash が UPD port 9995 を listen しているか、ss コマンド確認します。OKですね。
```ruby:ssコマンド
yasusuzu@test:~$ ss -apun src :9995
State                Recv-Q                Send-Q                               Local Address:Port                               Peer Address:Port               Process
UNCONN               0                     0                                          0.0.0.0:9995                                    0.0.0.0:*
```
### netflow generator を起動
Logshtashの準備が整ったので、さっそく __netflow generator__ を動かしていきます。Github から clone して、build していきます。
```ruby:netflow generator
git clone https://github.com/nerdalert/nflow-generator.git 
cd nflow-generator
go build
```
Buildが終わったら、実際に起動させます。あて先のIPアドレスは、自分のWSL2が持っているIPアドレスを指定しましょう。Port番号は、logstash の udp port で指定した番号と一致させます。今回は、`9995`を使用します。
```ruby:nflow-generator
yasusuzu@test:/mnt/c/Users/yasuyuki.suzuki/src/blogs/netflow/nflow-generator$ ./nflow-generator -t 192.168.1.18 -p 9995
INFO[0000] sending netflow data to a collector ip: 192.168.1.18 and port: 9995. 
Use ctrl^c to terminate the app.
```

### Dynatrace側での確認
さっそく、logstash 経由でDynatraceの自分のテナントに log として ingest されているか確認したいと思います。Dynatraceの新しいプラットフォームの「Logs and Events」メニューで、ログとして NetFlow が取り込まれているか見てみます。おっ、いいですね。JSON形式でちゃんとNetFlowのRaw DataがParseされていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/de3869e1-b242-d77b-32ea-2b920757c250.png)
`Advanced mode` に変更して、DQL（Dynatrace Query Language）でもデータが取れるか、念のため確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/c7e1a5cb-821d-abe5-ae07-1b2541ceaa24.png)

Grailでデータ集計できているので、あとは見やすくDashboardでVisualizeしていきます。ドドン！こんな感じに仕上げてみました。パチパチパチ👏👏👏
- プロトコル単位（TCP、UDP、ICMP）でのトラフィック量の可視化
- TCPのポート番号単位でのトラフィック量の可視化
- 送信元IPアドレス、あて先IPアドレスごとのセッション数、パケット数、データ量のトップ10位
- それらを円グラフで可視化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/937bbd08-cd8c-0a4c-c4e4-b7a06344ec5b.png)


# まとめ
如何だったでしょうか？ Dynatrace の新しいデータレイクハウスの `Grail` に、外部から logstash を使って、NetFlowデータをJSON形式で取り込んでみました。欲を言うと、ダッシュボードで Worldmap と Bubble chart を組み合わせ、カッコよく表示させたいところですが、これは今年後半のお楽しみということで！（多分）😄

まだ、Dynatraceを触ったことがない方、このブログを見てやってみたいと思われた方は、下記フリートライアルにてお試し下さい。↓↓↓

Dynatraceフリートライアル → https://www.dynatrace.com/ja/trial/

# 参考資料
1.[（英語）Logshtash の NetFlow module](https://www.elastic.co/guide/en/logstash/8.13/netflow-module.html#netflow-module)
2.[（英語）NetFlow Generator](https://openobserve.ai/blog/analyzing-network-traffic-using-netflow)
3.[（英語）Cisco IOSのNetFlowの説明](https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/fnetflow/configuration/15-mt/fnf-15-mt-book/fnf-fnetflow.html)
4.[（英語）Dynatrace の Generic log ingestion API](https://www.dynatrace.com/hub/detail/generic-log-ingestion-api/)
5.[（英語）Dynatrace の Logstash の Output plugin（OSSツール）](https://github.com/dynatrace-oss/logstash-output-dynatrace)

:::note warn
警告
このブログで紹介した Dynatrace Logshtash output plugin は、OSS（Open source software）として提供されているため、弊社のサポートセンタへのお問い合わせ対象外です。ご注意下さい。
:::