ご無沙汰しております
人生初のQiita投稿からちょうど2週間が経過しました。やはいですね。。。ゆえに、そろそろ次のネタを書こうと思います。今回のテーマは、前回のTelegrafを使ったPing監視のデータの取り込みに続き、ネットワーク関連です。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のこちらのページを参照して下さい。
NetFlow on Dynatrace
準備するもの
では、実際にNetFlowデータをDynatraceへ取り込んで行きましょう。準備するものは、下記3点です。
-
DynatraceのPlatform
Dynatraceのテナントをお持ちでない方は、フリートライアルのリンクからテナントを作成しましょう。--> https://www.dynatrace.com/ja/trial/ -
DynatraceでNetFlowデータを取り込むためのLogstash
Elastic社のLogshtashのInputとしてNetFlowデータを受け付け、OutputとしてDynatraceのPluginを指定して、DynatraceのLog Ingest APIへデータを転送
Logstash
Dyntrace ouput plugin -
NetFlowデータを生成するGenerator
Generatorは世の中沢山あると思いますが、今回のブログではこちらで紹介されているツールを使用しました。
nflow-generator
なお、netflow module for logstash は、logstash version 7.4.0 から depreciated になっていますので、正しくは filebeat >> logstash という順番で NetFlow data を取り込む必要があります。ゴメンナサイ、ここではそのやりかたを割愛します。
Logstashの設定
まずは、logstash をインストールします。今回は、自分のLaptop上でWSL2(Ubuntu 22.04/jammy)を起動させ、それにインストールしています。私の環境は、Ubuntu
ので、Elastic社のページのapt
のSectionに記載されている手順に従い最新版をインストールしています。
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)
で稼働しているか確認しておきましょう。
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 のみです。
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ですね。
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 していきます。
git clone https://github.com/nerdalert/nflow-generator.git
cd nflow-generator
go build
Buildが終わったら、実際に起動させます。あて先のIPアドレスは、自分のWSL2が持っているIPアドレスを指定しましょう。Port番号は、logstash の udp port で指定した番号と一致させます。今回は、9995
を使用します。
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されていますね。
Advanced mode
に変更して、DQL(Dynatrace Query Language)でもデータが取れるか、念のため確認します。
Grailでデータ集計できているので、あとは見やすくDashboardでVisualizeしていきます。ドドン!こんな感じに仕上げてみました。パチパチパチ👏👏👏
- プロトコル単位(TCP、UDP、ICMP)でのトラフィック量の可視化
- TCPのポート番号単位でのトラフィック量の可視化
- 送信元IPアドレス、あて先IPアドレスごとのセッション数、パケット数、データ量のトップ10位
- それらを円グラフで可視化
まとめ
如何だったでしょうか? Dynatrace の新しいデータレイクハウスの Grail
に、外部から logstash を使って、NetFlowデータをJSON形式で取り込んでみました。欲を言うと、ダッシュボードで Worldmap と Bubble chart を組み合わせ、カッコよく表示させたいところですが、これは今年後半のお楽しみということで!(多分)😄
まだ、Dynatraceを触ったことがない方、このブログを見てやってみたいと思われた方は、下記フリートライアルにてお試し下さい。↓↓↓
Dynatraceフリートライアル → https://www.dynatrace.com/ja/trial/
参考資料
1.(英語)Logshtash の NetFlow module
2.(英語)NetFlow Generator
3.(英語)Cisco IOSのNetFlowの説明
4.(英語)Dynatrace の Generic log ingestion API
5.(英語)Dynatrace の Logstash の Output plugin(OSSツール)
警告
このブログで紹介した Dynatrace Logshtash output plugin は、OSS(Open source software)として提供されているため、弊社のサポートセンタへのお問い合わせ対象外です。ご注意下さい。