SolitonNK: NetFlowインジェスターの導入

SolitonNKがいよいよ[SolitonNK version 4.0.2](https://hub.docker.com/r/soliton/solitonnk)にバージョンアップされ、アプライアンス版に加えてコンテナ版の提供がはじまりました。SolitonNKコンテナ版では、アプライアンス版のような管理画面はなく、NetFlowインジェスターはユーザ自身でデプロイ・設定しなければなりません。

本記事では、SolitonNKコンテナ版でNetFlowインジェスター導入してみた内容を紹介します。なお、NetFlowやIPFIXのデータ解析については、[SolitonNK 「IPFIXキット」とはどんなものか？](https://qiita.com/kakawai/items/c05a9c98348af6e58ec6)を参照してください。

# NetFlow, IPFIXのインジェスト設定

SolitonNKでNetFlowやIPFIXのデータを解析するためには、これらデータが蓄積されるようにしておかねばなりません。そのためには、SolitonNKに、NetFlowインジェスターを導入、設定する必要があります。NetFlowインジェスターは、SolitonNKが動作しているサーバにdocker版NetFlowインジェスターをインストールすることもできますし、SolitonNKとは別の外部サーバーにリモートインジェスターとしてインストールすることもできます。外部サーバーがdocker環境の場合と、非docker環境(Linux）では導入の仕方が異なりますので、いずれの場合についても説明しておきます。

## NetFlowインジェスターのdocker環境への導入

docker版SolitonNKがデプロイされているサーバにdocker版NetFlowインジェスターを設定するには、[dockerへのデプロイのマニュアルの「インジェスターを設定する」](https://www.solitonnk.com/docs/ja/#!configuration/docker.md#%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)の説明を参照しつつ、やってみます。

`sudo`しないで`docker`コマンドを使うには、[ユーザが`docker`という名称のグループに登録されてる必要があります](https://docs.docker.jp/engine/reference/run.html#docker-run)。もしも、ユーザを dockerグループに登録作業するなら、[ここあたり](https://qiita.com/DQNEO/items/da5df074c48b012152ee)を参考にしてください。

docker版SolitonNKでは、デフォルトでは（[解説されているように](https://www.solitonnk.com/docs/ja/#!configuration/docker.md)）、

	$ docker run --net gravnet -p 8080:80 -p 4023:4023 -p 4024:4024 -d -e GRAVWELL_INGEST_SECRET=MyIngestSecret -e GRAVWELL_INGEST_AUTH=MyIngestSecret -e GRAVWELL_CONTROL_AUTH=MyControlSecret -e GRAVWELL_SEARCHAGENT_AUTH=MySearchAgentAuth --name gravwell gravwell/gravwell:latest

として起動されているので、[dockerネットワーク](https://docs.docker.jp/engine/userguide/networking/dockernetworks.html)は`gravnet`、Ingest Secretの値は`MyIngestSecrets`になっています。

`gravnet`というdockerネットワークが使われてるかどうかは次のようにして確認できます。

	$ docker network ls
	NETWORK ID          NAME                DRIVER              SCOPE
	f3de7dc90d74        bridge              bridge              local
	907d5ae257a9        gravnet             bridge              local
	d471b1300e9f        host                host                local
	c83712ce3d98        none                null                local

このdocker環境にNetFlowインジェスターをデプロイするには次のようにします。

	$ docker run -d --net gravnet -p 2055:2055/udp -p 6343:6343/udp --name netflow -e GRAVWELL_CLEARTEXT_TARGETS=gravwell -e GRAVWELL_INGEST_SECRET=MyIngestSecrets gravwell/netflow_capture
	b501b4c34725036e773e3cffdbff633a9d11f8684cf1e7018b250a801467ba2d
	$ 

NewFlowインジェスターがデプロイされたCONTAINER IDが表示されてプロンプトが返ってくれば成功です。念のため、NetFlowインジェスターが動作してるか確認してみましょう。

	$ docker ps
	CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                                                    NAMES
	ef3b6227bc62        soliton/solitonnk:latest   "/opt/gravwell/bin/m…"   5 hours ago         Up 5 hours          0.0.0.0:4023-4024->4023-4024/tcp, 0.0.0.0:8080->80/tcp   gravwell
	b501b4c34725        gravwell/netflow_capture   "/opt/gravwell/bin/m…"   5 hours ago         Up 5 hours          0.0.0.0:2055->2055/udp, 0.0.0.0:6343->6343/udp           netflow

確かに、NetFlowインジェスターが動作していることが分かります。

SolitonNKサーバーとは別の、docker環境のサーバーにNetFlowインジェスターを導入する場合は、予めdockerネットワークを作っておいた方が良いことと、NetFlowインジェスターを導入時にインジェスト先のSolitonNKサーバーを指定する必要があることに注意してください。`gravnet`というdockerネットワークを作るには、

	$ docker network create gravnet

とします。この`gravnet`のネットワークを用い、インジェスト先（インデクサー）を192.168.20.97に指定してNetFlowインジェスターをデプロイするには次のようにします。

	$ docker run --rm -d --net gravnet -p 2055:2055/udp -p 6343:6343/udp --name netflow -e GRAVWELL_CLEARTEXT_TARGETS=192.168.20.97 -e GRAVWELL_INGEST_SECRET=MyIngestSecret gravwell/netflow_capture

## NetFlowインジェスターを非docker環境の外部サーバーにインストール

[SolitonNKのダウンロードページ](https://www.solitonnk.com/docs/ja/#!quickstart/downloads.md)から`gravwell_netflow_capture_installer_4.*.*.sh` （本記事公開時点で最新版はv.4.1.3でした）をダウンロードしてきて、root権限で次の要領でインストールします。インストール中に、Ingest Secretと、インジェスト先のIPアドレスを問われますので入力します。

	[root@localhost kakawai]# bash gravwell_netflow_capture_installer_4.0.2.sh



	*******  We could not extract an Ingest Secret from this device  *******

	If you do not want to enter your Ingest-Auth value, just press enter
	Otherwise, input your Ingest-Auth secret and press enter: MyIngestSecrets



	*******  We could not find a indexer resident on this device  *******

	If you do not want to enter an indexer target, just press enter
	Otherwise, input the IP of an indexer and press enter: 192.168.20.97
	Installing services... Created symlink from /etc/systemd/system/multi-user.target.wants/gravwell_netflow_capture.service to /etc/systemd/system/gravwell_netflow_capture.service.
	DONE


	Installation complete.  Thank you for using GravWell!

念のため、NetFlowインジェスターが動作してるか確認してみましょう。

	$ systemctl status gravwell_netflow_caputure
	...
	     Active: active (running) since Thu 2021-02-11 23:35:10 JST; 10h ago

間違いなくNetFlowインジェスターが動作してますね。

[NetFlowインジェスターのマニュアル](https://www.solitonnk.com/docs/ja/#!ingesters/ingesters.md#Netflow_Ingester)に従って、netflow_capture.conf の内容も確認してみましょう。

	[root@localhost /]# cat /opt/gravwell/etc/netflow_capture.conf
	[Global]
	Ingester-UUID="e5fd9489-0147-422e-a4a2-b54b85285c71"
	Ingest-Secret = MyIngestSecrets
	Connection-Timeout = 0
	Insecure-Skip-TLS-Verify=false
	Cleartext-Backend-Target=192.168.20.97 #example of adding a cleartext connection
	#Cleartext-Backend-Target=127.1.0.1:4023 #example of adding another cleartext connection
	#Encrypted-Backend-Target=127.1.1.1:4024 #example of adding an encrypted connection
	#Pipe-Backend-Target=/opt/gravwell/comms/pipe #a named pipe connection, this should be used when ingester is on the same machine as a backend
	Ingest-Cache-Path=/opt/gravwell/cache/netflow.cache
	#Max-Ingest-Cache=1024 #Number of MB to store, localcache will only store 1GB before stopping.  This is a safety net
	Log-Level=INFO

	[Collector "netflow v5"]
	 Bind-String="0.0.0.0:2055" #we are binding to all interfaces
	 Tag-Name=netflow
	 #Lack of a Flow-Type implies Flow-Type=netflowv5

	[Collector "ipfix"]
	 Tag-Name=ipfix
	 Bind-String="0.0.0.0:6343"
	 Flow-Type=ipfix

# IPFIXデータのインジェスト

NetFlowインジェスター3.2.3では、`NetFlow v5`のみがサポートされていましたが、NetFlowインジェスター3.3.3以降では、`Netflow v5`、`v9`と`IPFIX`がサポートされており、これらのプロトコルでのデータをインジェストして蓄積・解析することができます。

IPFIXデータをインジェストできるかどうか、手軽に確認できないものかと、Windows用のNetFlowシミュレータである、FlowAlizer NetFlow、Solar Winds NetFlow generator、Paessler NetFlow generator（v5のみ送出可能）などの利用を試みましたが、これらの疑似データは、うまくインジェストされるようにはできませんでした。

ここでは、[ローレンス・バークレー国立研究所から公開されている anonymous ftp の pcap ファイル](https://ee.lbl.gov/anonymized-traces.html)のデータを用い、[softflowd](https://github.com/irino/softflowd/wiki/softflowd)によってlocalhost で動いているインジェスターに対してIPFIXデータを送る方法を使ってサンプルIPFIXデータをインジェストしています。

	$ wget ftp://ita.ee.lbl.gov/new/lbnl.anon-ftp.03-01-10.tcpdump.gz
	$ zcat lbnl.anon-ftp.03-01-10.tcpdump.gz | softflowd -v 9 -r - -n localhost:6343 -D
	<<中略>>
	EXPIRED: seq:2168 [73.6.91.115]:2244 <> [131.243.2.12]:21 proto:6 octets>:14187                                                                                                                                                              packets>:269 octets<:11610 packets<:138 start:2003-01-11T09:25:54.043 finish:200                                                                                                                                                             3-01-11T09:30:11.158 tcp>:1a tcp<:1a flowlabel>:00000000 flowlabel<:00000000 vla                                                                                                                                                             n>:0 vlan<:0 ether:00:00:00:00:00:00 <> 00:00:00:00:00:00 (0x7fa6c9e94d90)
	Number of active flows: 0
	Packets processed: 319973
	Fragments: 0
	Ignored packets: 0 (0 non-IP, 0 too short)
	Flows expired: 2171 (0 forced)
	Flows exported: 2171 (4342 records) in 130 packets (0 failures)

	Expired flow statistics:  minimum       average       maximum
	  Flow bytes:                 300          9635        972303
	  Flow packets:                 5           147         13272
	  Duration:                  0.27s       329.04s     39892.80s

	Expired flow reasons:
	       tcp =         0   tcp.rst =         0   tcp.fin =         0
	       udp =         0      icmp =         0   general =         0
	   maxlife =         0
	over 2 GiB =         0
	  maxflows =         0
	   flushed =      2171

	Per-protocol statistics:     Octets      Packets   Avg Life    Max Life
	            tcp (6):       20917557       319973     329.04s   39892.80s
IPFIXデータがインデックスされていることを

	tag=ipfix table

として、確認したのが次の図です。

![SolitonNK_indexed-ipfix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480441/25bf768f-f755-064f-d82b-15a2b61c40e7.png)

これで、IPFIXデータがSolitonNKに蓄積されるようになったことは確認できました。

が、このままではこれらデータが何を表しているのかはさっぱりわかりません。というわけで、ここらから先のIPFIXのデータ解析については、[SolitonNK 「IPFIXキット」とはどんなものか？](https://qiita.com/kakawai/items/c05a9c98348af6e58ec6)の記事をご覧ください。

# レファレンス

Soliton NKを試したい人はの下の Soliton NK カスタマーコミュニティに登録の上、コミュニティページから申し込み下さい。

https://www.solitonnk.com/#customer-community

Soliton NK について、今後記事を追加していく予定です。