やりたいこと
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)
- VyOS 1.4-rolling-202102171100
CPU: 2core, Mem: 8GB, Disk: 100GB
CPU: 2core, Mem: 1.5GB, Disk: 8GB
なお、公式のシステム要件としては、250 flow/秒 (※) の netflow 処理を行うために CPU: 4core, Mem: 32GB, Disk: 512 GB となっていますがとてもとても。。今回はあくまで検証用ですのであしからず。
※ 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 テンプレートを以下からダウンロードします。
(raw ボタンを右クリックして「名前を付けて保存」)
そして以下のスライドショーの赤枠をクリックなどしていきます。
最後のページは実際に netflow のデータが集まってから表示されるグラフィックです。
上記とは順番が前後しますが、VyOS での netflow 設定を以下に示します。
VyOS 設定
前提として、以下のサイトなどを参考に、初期セットアップをします。
最初に示した通りの 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 化も実施します。
コメント