使用Docker构建的EFK(Elasticsearch+Fluentd+Kibana)可将YAMAHA RTX路由器的syslog数据可视化
请注意
由于这篇2019年的帖子已经过时且不能正常运行,所以我重新发表了一篇帖子。
最新的内容
2022/06/07 关于发布的新内容,添加注意事项
2019/06/11 在GitHub上发布了设置文件的存储库
2019/05/24 在Fluentd的设置说明中添加了补充并追加了GeoIP设置
背景:
# 路由器设备
YAMAHA RTX系列
假设所有家庭都经常使用YAMAHA的RTX系列路由器的syslog。
同时考虑到不仅仅使用一台路由器,还会标记多台路由器的设施号。
此外,对于RTX系列的防火墙设置将不予讨论。
syslog的设置如下所示。
syslog host [syslogサーバー指定]
syslog facility [ファシリティ番号]
syslog notice on
请确保不要忘记设置防火墙,因为syslog使用UDP/514端口。
Docker环境
主机操作系统使用的是Ubuntu Server 18.04 LTS,在Docker CE和Docker-compose上创建容器。请参考官方指南以了解安装方法。我也会记录一个示例。
Docker CE 安装
https://docs.docker.com/install/linux/docker-ce/ubuntu/
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
$ apt-cache madison docker-ce
$ sudo docker run hello-world
Docker Compose 安装
https://docs.docker.com/compose/install/
$ sudo -i
# curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# exit
$ docker-compose --version
使用Elasticsearch+Fluentd+Kibana (EFK) 进行建设
通常情况下,使用docker-compose可以轻松构建复杂的EFK。
Elasticsearch的配置
事前に需要对Elasticsearch进行虚拟内存配置的VM所需设置。
$ sudo sysctl -w vm.max_map_count=262144
自动设定 –
vm.max_map_count=262144
创建工作目录
创建EFK的工作目录。
$ mkdir -p efk
$ cd efk
从GitHub上获取存储库
我已经将所需的配置文件上传到GitHub上,您可以从存储库中获取。
https://github.com/ohhara-shiojiri/syslog-efk
$ git clone https://github.com/ohhara-shiojiri/syslog-efk.git
流畅的Fluentd syslog配置
以下是一个示例设置,旨在通过将syslog日志存储在Elasticsearch中,并在Kibana上使用图表等方式进行可视化,从而影响可视化的便利性。
创建日志目录
$ mkdir -p log
除了Elasticsearch,还可以使用文本文件保存syslog的原始数据。它可以用于备份以及正则表达式模式分析等。
syslog接收设置
<source>
@type syslog
port 5140
bind 0.0.0.0
format none
tag raw.syslog
</source>
使用fluentd接收syslog的部分。即使没有单独准备syslog服务器,fluentd也会接收消息。
由于使用docker-compose的端口转发将UDP/514转发到UDP/5140,因此会变成这样。
通过文件保存和正则表达式进行模式提取
<match raw.syslog.**>
@type copy
<store>
@type file
path /home/fluent/log/syslog/syslog
time_slice_format %Y%m%d
<buffer time>
@type file
path /home/fluent/log/syslog/buffer
</buffer>
</store>
<store>
@type parser
format multi_format
key_name message
remove_prefix raw
add_prefix facility
<pattern>
format with_extra_fields
base_format /^(?<target>.+)\s+Rejected\s+at\s+(?<direction>.+)\((?<filter_num>.+)\)\s+filter:\s+(?<proto>.+)\s+(?<src_ip>.+):(?<src_port>.+)\s+>\s+(?<dest_ip>.+):(?<dest_port>.+)$/
extra_fields { "log_type": "reject" }
</pattern>
<pattern>
format with_extra_fields
base_format /^(?<msg>.+)$/
extra_fields { "log_type": "other" }
</pattern>
</store>
</match>
syslog日志的保存设置为将日志保存在log/syslog/syslog文件中,并转发到fluentd。
作为日志搜索模式,提取了与防火墙的“Rejected”日志相符的条件。
不符合条件的日志最终被分类为“其他”。
设定设施编号的标签
<match facility.syslog.**>
@type record_reformer
tag yamaha_rtx
<record>
@facility ${tag_parts[-2]}
</record>
</match>
为了区分来自多个RTX路由器设备的syslog,使用设备的设施号进行标记分隔。这样可以确定该日志是来自哪个RTX路由器设备。
GeoIP的配置
設定GeoIP插件来根据IP地址确定国家名称。还要获取纬度和经度坐标值以在Kibana上显示地图。由于Fluentd的Dockerfile已经设置好,所以在此阶段已经完成了安装。请注意,设置应该在”filter”中而不是”match”中。而且”filter”应该在”match”之前进行设置。此外,Elasticsearch坐标字段的类型应设置为”geo_point”。这是一个容易出错的地方,我将通过示例解释。
<filter yamaha_rtx.**>
@type geoip
geoip_lookup_key src_ip
<record>
location '[${location.latitude["src_ip"]},${location.longitude["src_ip"]}]'
country_name ${country.names.en["src_ip"]}
</record>
skip_adding_null_record true
</filter>
在将Fluentd的数据传输到Elasticsearch的部分之前,添加””的设置。
经度纬度的坐标将被设置为”location”的数组。
国家名称将被设置在”country_name”中。
此外,无法确定国家名称的数据将被跳过和排除。
将Fluentd配置为将数据传输到Elasticsearch。
<match yamaha_rtx.**>
type elasticsearch
logstash_format true
logstash_prefix yamaha_rtx
include_tag_key true
tag_key @log_name
hosts elasticsearch:9200
buffer_type memory
num_threads 1
flush_interval 60
retry_wait 1.0
retry_limit 17
</match>
将最后的传输设置到Elasticsearch
启动EFK容器环境
当准备好设置文件后,使用docker-compose启动EFK的各个容器环境。
$ docker-compose build
$ docker-compose up -d
先建立fluentd容器并创建容器镜像,然后启动每个容器。
Elasticsearch的配置设置
在使用Kibana进行地图显示时,纬度和经度的坐标字段必须是”geo_point”类型,但是默认情况下会变成”float”类型。
此外,由于数据在Elasticsearch中按日期分开注册,因此每次更改数据类型都很麻烦,因此我们将在模板设置中自动化这一过程。
在Elasticsearch已经启动的情况下,使用命令行执行以下配置。
$ curl -X POST -H 'Content-Type: application/json' 'localhost:9200/_template/yamaha_rtx-reject' -d '{
"template": "yamaha_rtx-reject-*",
"mappings": {
"fluentd": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}'
因為在設定之後,從新增的數據中進行更改才會生效,所以需要刪除現有的數據。
從 Kibana 的設定畫面進入「Management」→「Elasticsearch」→「Index management」→「yamaha_rtx-reject-年月日」
→「Mapping」,如果「location」的類型是「geo_point」則為正確。
另外,在 Kibana 的設定畫面進入「Management」→「Kibana」→「Index Patterns」→「yamaha_rtx-reject-*」→「Name」
→「location」,如果類型是「geo_point」則為正確。
Kibana的Web用户界面
当EFK的每个容器环境成功启动后,我们将使用Web浏览器打开Kibana。网址为:http://127.0.0.1:5601。
操作Kibana的方法是,在“management”中确认Elasticsearch是否通过Fulentd接收日志。
通过在“management”的“index Patterns”中注册日志模式,然后可以使用您喜欢的图形等方式进行可视化。
请阅读以下内容,并用中文进行翻译,只需提供一种选择:
– Reference
[使用Yamaha RTX810路由器将日志通过syslog发送到docker + EFK进行查看]
(https://qiita.com/330k/items/7c266b44d4a23f017634)
[使用Fluentd + Elasticsearch + Kibana以较为直观的方式可视化YAMAHA RTX1100的syslog]
(https://qiita.com/hiraro/items/474879a70b7b8a715782)