netflow

【図解】ELK + Elastiflow インストール手順 on RockyLinux8.5 minimal install

やりたいこと

Elastiflow という無償の Netflow Collector を構築します。そして別途用意した VyOS から netflow を送信し、それを今回構築する Netflow Collector で受信し、いい感じに可視化します。

具体的には Elasticsearch + Kibana + Logstash (いわゆる ELK stack) を基盤とし、elastiflow を Logstash のモジュールとして動作させます。Elasticsearch が WebAPI + DB となり、Logstash からのデータを格納し、Kibana が WebUI としてユーザにいい感じに表示します。

以下のような構成になります。

elastiflow はサービスとして動作するものではなく、Logstash を母体として動くモジュールです。

バージョン情報

  • elasticsearch 7.16.1-1
  • kibana 7.16.1-1
  • logstash 1:7.16.1-1
  • elastiflow v4.0.1

環境

VirtualBOX 上で以下を構築

    • RockyLinux8.5 (minimal install + rsyslog)

    CPU: 2core, Mem: 8GB, Disk: 100GB

    • VyOS 1.4-rolling-202102171100

    CPU: 2core, Mem: 1.5GB, Disk: 8GB

なお、公式のシステム要件としては、250 flow/秒 (※) の netflow 処理を行うために CPU: 4core, Mem: 32GB, Disk: 512 GB となっていますがとてもとても。。今回はあくまで検証用ですのであしからず。

elastiflow/INSTALL.md at master · robcowart/elastiflow
Network flow analytics (Netflow, sFlow and IPFIX) with the Elastic Stack - elastiflow/INSTALL.md at master · robcowart/elastiflow

※ 1 flow とは、Protocol (tcp, udp, icmp, etc), Src IP, Dst IP, Src Port, Dst Port の組み合わせ

Elasticsearch, Kibana, Logstash のインストール

まずは elasticsearch の GPG-KEY をインポートします。

[root@localhost ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

次にリポジトリを追加します。以下リポジトリに最新の elasticsearch, kibana, logstash が含まれているようです。以下のように任意の名前で .repo ファイル (例では ELK.repo) を新規作成し、以下のように追記します。

[root@localhost ~]# vi /etc/yum.repos.d/ELK.repo

[ELK-7.x]
name=ELK repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

そしてインストールします。

[root@localhost ~]# dnf install -y elasticsearch kibana logstash

補足ですが、elasticsearch と logstash はそれぞれ Java も内包されており、バージョンも違います。

[root@localhost ~]# /usr/share/elasticsearch/jdk/bin/java -version
openjdk version "17.0.1" 2021-10-19
OpenJDK Runtime Environment Temurin-17.0.1+12 (build 17.0.1+12)
OpenJDK 64-Bit Server VM Temurin-17.0.1+12 (build 17.0.1+12, mixed mode, sharing)
[root@localhost ~]# /usr/share/logstash/jdk/bin/java -version
openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment Temurin-11.0.13+8 (build 11.0.13+8)
OpenJDK 64-Bit Server VM Temurin-11.0.13+8 (build 11.0.13+8, mixed mode)

各種設定変更

elasticsearch はデフォルト設定だとクラスタ構成で動作する設定になっていますので、1 台構成のタイプに修正します。

[root@localhost ~]# vi /etc/elasticsearch/elasticsearch.yml

# 以下を discovery.seed_hosts の下に追記
discovery.type: single-node

Kibana は Listen ポートがデフォルトで localhost のみになっており、以下の例では全インタフェースで Listen するよう 0.0.0.0 に置き換えています。(特定インタフェースのみ Listen したいならそのインタフェースの IP を指定)また、最終行に locale で ja-JP を指定します。

[root@localhost ~]# vi /etc/kibana/kibana.yml
~~~
server.host: "0.0.0.0"
~~~
i18n.locale: "ja-JP"

Logstash の Java の heap メモリはかなり消費するようですが、デフォルトがなぜか 1g となっています。これを 3GB に変更します。(1GB だとエラーが出た。公式は 250 flow/秒で 4GB。)

[root@localhost ~]# vi /etc/logstash/jvm.options

-Xms3g
-Xmx3g

さらに logstash の plugin "logstash-codec-sflow" をインストールし、plugin 全体を update します。

[root@localhost ~]# /usr/share/logstash/bin/logstash-plugin install logstash-codec-sflow
[root@localhost ~]# /usr/share/logstash/bin/logstash-plugin update

ELK のサービス起動&自動起動設定、状態確認

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl enable --now elasticsearch kibana logstash
[root@localhost ~]# systemctl status elasticsearch kibana logstash

elastiflow インストール

git でダウンロードします。まずは git のインストール。

[root@localhost ~]# dnf install -y git

次に elastiflow の最新バージョンのダウンロードディレクトリに移動します。ここでは /usr/share とします。そこで git clone によりダウンロードします。

[root@localhost ~]# cd /usr/share
[root@localhost share]# git clone https://github.com/robcowart/elastiflow.git

バージョンを確認します。

[root@localhost ~]# more /usr/share/elastiflow/CHANGELOG.md
# ElastiFlow™ Change Log

---

## v4.0.1
~~~

次に、/usr/share から /etc に必要ファイルをコピーしていきます。

[root@localhost ~]# cp -r /usr/share/elastiflow/logstash/elastiflow/ /etc/logstash/
[root@localhost ~]# cp -r /usr/share/elastiflow/sysctl.d/* /etc/sysctl.d/
[root@localhost ~]# cp -r /usr/share/elastiflow/logstash.service.d/ /etc/systemd/system/

次に、logstash の pipeline.yml にて config ファイルの読み込み先 (path.config) を、/etc/logstash/conf.d/ から /etc/logstash/elastiflow/conf.d/ に変更します。

[root@localhost ~]# vi /etc/logstash/pipelines.yml

 # path.config: "/etc/logstash/conf.d/*.conf"
path.config: "/etc/logstash/elastiflow/conf.d/*.conf"

config ファイル読み込み先のディレクトリに移動し、不要な .conf ファイルを .conf.disabled に変更します。今回は sflow と ipfix (netflow v10) は受信しない想定ですので disable にします。

[root@localhost ~]# cd /etc/logstash/elastiflow/conf.d
[root@localhost conf.d]# mv 10_input_ipfix_ipv4.logstash.conf 10_input_ipfix_ipv4.logstash.conf.disabled
[root@localhost conf.d]# mv 10_input_sflow_ipv4.logstash.conf 10_input_sflow_ipv4.logstash.conf.disabled
[root@localhost conf.d]# mv 20_filter_30_ipfix.logstash.conf 20_filter_30_ipfix.logstash.conf.disabled
[root@localhost conf.d]# mv 20_filter_40_sflow.logstash.conf 20_filter_40_sflow.logstash.conf.disabled

logstash を再起動します。

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart logstash

firewalld を開放

デフォルトだと cockpit と dhcpv6-client が開いているので閉じます。そしてリモートからのアクセスが必要な 5601/tcp (kibana WebUI) と 2055/udp (netflow v9) のみ開放します。--reload で再読み込み後に --list-all で状態確認します。

[root@localhost ~]# firewall-cmd --permanent --remove-service={cockpit,dhcpv6-client}
[root@localhost ~]# firewall-cmd --permanent --add-port={5601/tcp,2055/udp}
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# firewall-cmd --list-all

なお、elasticsearch へのアクセス 9200/tcp, 9300/tcp, logstash へのアクセス 9600/tcp は、今回 localhost 内でのアクセスになるため firewalld の設定は不要ですが、elasticsearch と kibana, logstash をそれぞれサーバを分けて IP 通信で連携する場合は Listen を 127.0.0.1 ではなく 0.0.0.0 や受信インタフェースの IP で Listen したうえで、firewalld を開ける必要があります。

ss -nltup で TCP と UDP の Listen アドレス、ポート、プロセスが表示されます。

[root@localhost ~]# ss -nltup
Netid  State   Recv-Q   Send-Q     Local Address:Port     Peer Address:Port  Process
udp    UNCONN  0        0              127.0.0.1:323           0.0.0.0:*      users:(("chronyd",pid=888,fd=6))
udp    UNCONN  0        0                0.0.0.0:2055          0.0.0.0:*      users:(("java",pid=31216,fd=99))
tcp    LISTEN  0        128              0.0.0.0:22            0.0.0.0:*      users:(("sshd",pid=944,fd=5))
tcp    LISTEN  0        50             127.0.0.1:9600          0.0.0.0:*      users:(("java",pid=31216,fd=70))
tcp    LISTEN  0        128              0.0.0.0:5601          0.0.0.0:*      users:(("node",pid=2379,fd=23))
tcp    LISTEN  0        128            127.0.0.1:9200          0.0.0.0:*      users:(("java",pid=2378,fd=296))
tcp    LISTEN  0        128            127.0.0.1:9300          0.0.0.0:*      users:(("java",pid=2378,fd=294))

上記では、リモートからのアクセスができるのは 2055/udp (netflow), 5601/tcp (Kibana WebUI) のみです。ローカルでアクセスする場合は firewalld を開けなくても 127.0.0.1 の 9200/tcp や 9300/tcp, 9600/tcp にアクセスできます。

Web UI へアクセス

http://<ip address>:5601 (今回の例では http://192.168.1.231:5601) へアクセスすると、以下画面が表示され、「独りで閲覧」をクリックすると認証無しに home 画面へ入っていけます。

Kibana の elastiflow 用のテンプレートをインポート

elastiflow 用の Web UI テンプレートを以下からダウンロードします。

elastiflow/elastiflow.kibana.7.8.x.ndjson at master · robcowart/elastiflow
Network flow analytics (Netflow, sFlow and IPFIX) with the Elastic Stack - elastiflow/elastiflow.kibana.7.8.x.ndjson at master · robcowart/elastiflow

(raw ボタンを右クリックして「名前を付けて保存」)

そして以下のスライドショーの赤枠をクリックなどしていきます。

elastiflow-install-02
elastiflow-install-03
elastiflow-install-04
elastiflow-install-05
elastiflow-install-06
elastiflow-install-07
elastiflow-install-08
elastiflow-install-09
elastiflow-install-10
previous arrow
next arrow
elastiflow-install-02
elastiflow-install-03
elastiflow-install-04
elastiflow-install-05
elastiflow-install-06
elastiflow-install-07
elastiflow-install-08
elastiflow-install-09
elastiflow-install-10
previous arrow
next arrow

最後のページは実際に netflow のデータが集まってから表示されるグラフィックです。

上記とは順番が前後しますが、VyOS での netflow 設定を以下に示します。

VyOS 設定

前提として、以下のサイトなどを参考に、初期セットアップをします。

【VyOS】の基本設定,初期設定, Oracle VM での検証環境設定
VyOS (読み方:ヴィワイオーエス)とは VMware や KVM 等の仮想...

最初に示した通りの NW 構成を前提とし、以下の通りに設定します。

# set interfaces ethernet eth0 address 192.168.1.252/24
# set interfaces ethernet eth1 address 192.168.20.1/24
# set protocols static route 0.0.0.0/0 next-hop 192.168.1.1
# system flow-accounting interface eth0
# system flow-accounting interface eth1
# system flow-accounting netflow server 192.168.1.213 port 2055
# system flow-accounting netflow source-ip 192.168.1.252
# system flow-accounting netflow timeout expiry-interval 60
# system flow-accounting netflow version 9
# commit
# save

なお、家庭用 BB ルータにもスタティックルートを追加設定しています。192.168.20.0/24 宛の NextHop=192.168.1.252 (VyOS) としています。

次回予告

elasticsearch が認証無しに使えてしまっているため、認証機構を有効化します。

また、elasticsearch および kibana が https (TLS) 暗号化ができていませんので https 化も実施します。

コメント

タイトルとURLをコピーしました