使用Fluent、Elasticsearch和Kibana来监控VyOS的NetFlow
本次我们将设置NetFlow监视环境,以确定访问VyOS的终端设备(IP地址)是否合法。我们将在Ubuntu 16.04上搭建Fluent、Elasticsearch和Kibana的配置,作为NetFlow的收集器服务器。
解释术语
因为这次要用的包对我自己来说也是第一次使用,所以我会写下简单的说明。
流畅日志数据收集工具
Fluentd(フルエントディー)是一款日志收集管理工具。它以开源软件形式提供,并可在Linux和各种Unix系统上运行。虽然所说的日志类型有很多,例如syslog、access-log和Flow信息等,但在Fluentd中,事件的接收(input)和存储(output)都以插件形式实现。在这种情况下,我们将使用fluent-plugin-netflow来接收NetFlow信息(input),并使用fluent-plugin-elasticsearch对其进行解析并存储到Elasticsearch(output)中。
此外,Fluentd以标签管理日志类型,而日志内容以JSON格式表示。牢记这一点有助于理解后续的配置内容。
由于Fluentd具有灵活性的优点,我认为它不仅适用于当前环境,还可以与各种编程语言和服务进行协同操作。
Elasticsearch 弹性搜索
Elasticsearch(エラスティックサーチ)是一种全文搜索引擎。全文搜索引擎是一种能够分析大量数据并进行搜索和提取特定数据的机制。它是开源软件,可以在Linux和各种Unix系统上运行。
它具有各种特点,其中突出的是分析的灵活性和速度。您可以轻松使用强大的搜索功能,而且由于使用REST接口进行输入和输出,只要使用JSON库,就可以在任何开发语言中进行数据的输入和输出。
此外,它还可以与其他软件集成,在与Kibana集成后,可以轻松地在Web界面上可视化搜索结果。如果与大数据处理平台Hadoop集成,可以轻松进行文本数据的丰富化和数据整理等处理。
要了解Elasticsearch的结构,要记住它是在称为索引的类似数据库的区域中存在类型(表)、文档(记录)、字段(列)和文本(数据本身),这样做之后的操作会更加清晰明了。
Kibana 可视化分析引擎。
Kibana(Kibana)是一个用于以图表形式显示Elasticsearch搜索结果的工具。以下这个很酷的监控界面(可以通过Web访问)是由Kibana创建的。
通过自由创建仪表盘、图表和查询过滤器来实现智能监控,我目前也在学习如何熟练运用这一点。
这个网站是我非常参考的一个网站。
- 初心者のためのKibanaの詳しい使い方
处理过程
创建环境
-
- ubuntu 16.04
-
- Fluentd(td-agent) 0.14.16
-
- Elasticsearch 5.5.2
-
- Kibana 5.5.2
-
- VyOS 1.1.7
- NetFlow version 5
搭建NetFlow收集器
流畅的日志记录器
请按照公式网站的”使用rpm软件包安装Fluentd”进行安装。如果状态和版本能够正常确认,那就OK。
$ curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent3.sh | sh
$ /etc/init.d/td-agent restart
$ /etc/init.d/td-agent status
$ td-agent --version
安装用于收集和传输NetFlow的Fluentd插件(fluent-plugin-elasticsearch、fluent-plugin-netflow)及其相关包。
$ sudo apt-get install libcurl4-openssl-dev -y
$ sudo apt-get install gcc -y
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-netflow
请为/etc/td-agent/td-agent.conf进行NetFlow收集的设置。以下设置等待接收NetFlow version5,9的数据,并使用端口号5141。同时,指定将NetFlow数据以指定的文件格式传输到localhost的端口号9200上运行的Elastisearch。
$ sudo vim /etc/td-agent/td-agent.conf
--省略--
<match netflow.**>
type elasticsearch
host localhost
port 9200
type_name netflow
logstash_format true
logstash_prefix flow
logstash_dateformat %Y%m%d
</match>
<source>
type netflow
tag netflow.event
port 5141
versions [5, 9]
</source>
重新启动Fluentd(td-agent)。
$ /etc/init.d/td-agent restart
弹性搜索
为了运行Elasticsearch,至少需要Java 7版本,因此建议安装Oracle JDK版本1.8.0_xx。
$ sudo apt-get install openjdk-8-jdk
$ java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2ubuntu1.16.04.3-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
接下来,我们将按照官方网站上的“使用Debian软件包安装Elasticsearch”文档来构建Elasticsearch。
注册Elasticsearch存储库
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
将软件包的下载来源定义添加到/etc/apt/sources.list文件中
echo "deb http://packages.elastic.co/elasticsearch/5.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-5.x.list
在更新apt-get之后,安装Elasticsearch。
sudo apt-get update
sudo apt-get install elasticsearch
将Elasticsearch的版本升级到5.5.2(随后与要安装的Kibana版本匹配)。
$ curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.deb
$ sudo dpkg -i elasticsearch-5.5.2.deb
为了允许远程访问,请编辑/etc/elasticsearch/elasticsearch.yml文件。
$ sudo vim /etc/elasticsearch/elasticsearch.yml
--省略--
変更前
#network.host: "localhost"
変更後
network.host: "0.0.0.0"
将设置应用并启动Elasticsearch.
$ sudo systemctl daemon-reload
$ sudo systemctl enable elasticsearch
$ sudo systemctl start elasticsearch
确认行动
$ curl http://localhost:9200
"name" ,"cluster_name" ,"cluster_uuid" ,"version"などが表示されればOK
Elasticsearch可视化插件Kibana。
注册Kibana存储库
$ sudo wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
安装支持https的apt方法
$ sudo apt-get install apt-transport-https
在/etc/apt/sources.list文件中添加包的下载源定义。
$ echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list
在更新apt-get后,安装Kibana。
$ sudo apt-get update
$ sudo apt-get install kibana
为了允许远程访问,需要编辑/etc/kibana/kibana.yml文件。
$ sudo vim /etc/kibana/kibana.yml
--省略--
変更前
#server.host: "localhost"
変更後
server.host: "0.0.0.0"
应用配置并启动Kibana。
$ sudo systemctl daemon-reload
$ sudo systemctl enable kibana
$ sudo systemctl start kibana
为了确认Kibana是否正常运行,我们需要打开Web浏览器,在地址栏输入http://<IP地址|完全限定域名>:5601访问。
如果Kibana能够没有错误地启动,则安装完成。
VyOS配置NetFlow
在VyOS上配置并指定NetFlow流量设置和服务器,并设置其他选项。
# 設定モードに入る
configure
# Flow監視するインターフェースの指定
set system flow-accounting interface eth0
# NetFlow version 5で動作させることを設定
set system flow-accounting netflow version 5
# サンプリングレートの指定(300個ごとに1個のパケット)
set system flow-accounting netflow sampling-rate 300
# Flowを集めるサーバの指定
set system flow-accounting netflow server 192.168.1.100 port 5141
# 60秒で動作しなければタイムアウトとみなす
set system flow-accounting timeout expiry-interval 60
# 変更のコミットおよび設定保存
commit
save
确认流量核算是否正常运作。
$ show flow-accounting
Kibana(Web前端)的设置
在进行前端操作确认之前,请使用CLI确认服务器端是否收到了NetFlow信息
首先进行索引确认
$ curl -XGET 'localhost:9200/_cat/indices?v&pretty'
yellow open .kibana GI9kYoEQQyevSkezhedEUw 1 1 3 1 17.1kb 17.1kb
yellow open flow-YYYYMMDD AeGvmzhgSbeq0C_wtbnjlw 5 1 261 0 428.7kb 428.7kb
如果能够接收到NetFlow,则可以确认存在名为flow-YYYYMMDD的索引,从这里可以查看详细信息。
$ curl -XGET 'localhost:9200/flow-YYYYMMDD/_search?pretty'
如果能够确认Flow信息,那就没问题了。
在Web前端,首先需要进行初始设置。
在显示为http://<ip地址|FQDN>:5601的界面上,首先要进行默认索引的注册。设置如下所示。
接下来,从[管理]-[+创建索引模式]中注册NetFlow的索引。
按下[Discover],然后选择kibana标签的▼选项,选择flow-*。这样,NetFlow信息就可以像下面的示例一样可视化。
在初始阶段,VyOS的流量信息以最近15分钟的形式显示。要更改显示时间区间,只需在右上方进行更改。
以上是构建NetFlow监控环境的基本步骤。
(附加1)自动删除索引
由于类似本例这样的索引文件会随着日期的增加而积累,所以这会导致Elastisearch和Kibana在内存和CPU方面变得较重,同时服务器的磁盘容量也会变少,这是一个问题。
因此,需要定期删除索引文件。
以下的方法是如何从命令中删除索引的。
$ curl -XDELETE 'http://localhost:9200/[index名]?pretty'
但是,如果可能的话,希望能够自动执行这些操作。
作为实现这一目标的便利工具,curator是个不错的选择。
由于curator是在Python上运行的工具,因此需要事先安装Python和pip作为准备工作。
$ sudo apt-get install python
$ cd /tmp
$ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
$ sudo python get-pip.py
使用pip安装curator。
$ sudo pip install elasticsearch-curator
$ curator --version
curator, version 5.1.2
curator会在config.yml和action_file.yml中运行。
我们要创建一个存放这些文件的目录。
$ mkdir ~/.curator/
我将创建一个 config.yml 文件。由于默认设置看起来是可以接受的,所以我会把官方示例代码拿来并注释掉。
$ vim ~/.curator/curator.yml
---
# Remember, leave a key empty if there is no value. None will be a string,
# not a Python "NoneType"
#client:
# hosts:
# - 127.0.0.1
# port: 9200
# url_prefix:
# use_ssl: False
# certificate:
# client_cert:
# client_key:
# ssl_no_validate: False
# http_auth:
# timeout: 30
# master_only: False
#
#logging:
# loglevel: INFO
# logfile:
# logformat: default
# blacklist: ['elasticsearch', 'urllib3']
创建一个`action_file.yml`文件。在这里,我们会关闭(从Elasticsearch中取消对index的引用)超过10天之前的index,并删除(删除index)超过20天之前的index。我们参考了以下官方文档的示例进行创建。
$ vim ~/.curator/close_delete_indices.yml
---
# Remember, leave a key empty if there is no value. None will be a string,
# not a Python "NoneType"
#
# Also remember that all examples have 'disable_action' set to True. If you
# want to use this action as a template, be sure to set this to False after
# copying it.
actions:
1:
action: delete_indices
description: >-
Delete indices older than 20 days (based on index name), for flow-
prefixed indices. Ignore the error if the filter does not result in an
actionable list of indices (ignore_empty_list) and exit cleanly.
options:
ignore_empty_list: True
disable_action: False
filters:
- filtertype: pattern
kind: prefix
value: flow-
- filtertype: age
source: name
direction: older
timestring: '%Y%m%d'
unit: days
unit_count: 20
2:
action: close
description: >-
Close indices older than 10 days (based on index name), for flow-
prefixed indices.
options:
ignore_empty_list: True
delete_aliases: False
disable_action: False
filters:
- filtertype: pattern
kind: prefix
value: flow-
- filtertype: age
source: name
direction: older
timestring: '%Y%m%d'
unit: days
unit_count: 10
执行以下命令。
$ curator ~/.curator/close_delete_indices.yml
如果使用cron定时执行这些操作,将会定期删除索引文件。
确认Cron正在运行。
$ systemctl status cron.service
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since 木 2017-08-17 15:07:19 JST; 6 days ago
使用Cron来设置Curator的定期执行计划。
$ crontab -e
(適当なエディタを選択)
cron文件的编写方式符合以下格式。
分 時 日 月 曜日 コマンド
* * * * * command
因此,编写 curator 的操作,每周一的中午12点执行。
0 12 * * 1 curator ~/.curator/close_delete_indices.yml
确认 Cron 是否正确注册。
$ crontab -l
另外,以下是用于确认是否正常运作的命令。
$ cat /var/log/cron
顺便提一下,随着本次索引的关闭和删除,记住以下调试命令会很方便。
# indexのクローズ
curl -XPOST 'localhost:9200/[index名]/_close'
# indexのオープン
curl -XPOST 'localhost:9200/[index名]/_open'
最后
这次虽然环境搭建完成了,但是对于安装的包所带来的好处只是在享受中,却还有很多不懂的地方。尤其是我不太理解如何在Kibana中制作出漂亮的可视化图表和仪表板,所以还需要学习。我打算有一天写一篇文章,所以会在那时解释如何使用Kibana。