在将Graylog部署到生产环境时,我们遇到了一些问题,其中最主要的是无法安装MongoDB并且无法随时重启机器去修改BIOS设置来修复问题 【WARNING: MongoDB 5.0+ requires a CPU with AVX support, and your current system does not appear to have that!
】。为了寻找一个更可行的解决方案,我们决定将注意力转向另一个强大的日志管理系统:Grafana Loki。同时,我们还使用了nfcolector来收集网络设备的Netflow信息并保存在InfluxDB中。最终,我们通过Grafana将所有这些收集到的日志和数据进行集中展示,为网络设备的日常管理提供了更加美观和直观的界面。这样的架构和工具组合使得我们在网络设备管理和监控方面取得了更好的效果。
架构
Grafana Loki
Grafana Loki是一个开源日志聚合系统。它允许您收集、存储、浏览和查询大规模分布式日志数据。与传统的日志管理系统相比,Grafana Loki的设计理念更加轻量级和高效。
使用Grafana Loki,您可以通过两个核心组件实现日志管理:Loki和Promtail。
-
Loki:Loki是Grafana Loki系统的核心,它是一个分布式日志存储系统。Loki与传统的日志存储不同,它使用流水线处理和索引数据,以便在查询时可以快速访问所需的日志数据。Loki使用基于标签的存储模型,并支持水平扩展,使您能够处理大量的日志数据。
-
Promtail:Promtail是一个日志收集代理,它负责从各个源(如文件、系统日志、容器日志等)收集日志数据,并将其发送到Loki进行存储。Promtail可以与各种各样的日志源进行集成,并支持标准的日志格式,如JSON、GELF等。
Go Netflow Collector(goNfCollector)
goNfCollector帮助您从网络设备中收集Netflow数据。它将所需的所有信息存储在InfluxDB中,以便进行进一步的分析,并使用Grafana进行可视化。
Grafana
Grafana是一个流行的开源数据可视化平台。它提供了强大的数据可视化功能和丰富的插件生态系统,使用户能够创建仪表盘、报表和警报,并对数据进行深入的分析。Grafana与Grafana Loki,InfluxDB等可以结合使用,通过数据源,您可以在Grafana中轻松地创建日志查询和仪表盘,将日志数据与监控数据进行统一展示和分析。
部署
环境说明
- Ubuntu 22.04
- Docker version 24.0.5
- Docker Compose version v2.20.2
1. rsyslog的部署
默认情况下,Rsyslog安装在Ubuntu服务器上。如果没有安装,您可以通过运行以下命令来安装它:
apt install rsyslog -y
修改配置文件 /etc/rsyslog.conf
vim /etc/rsyslog.conf
以下是最终结果及大概的解释:
# /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf
#################
#### MODULES ####
#################
module(load="imuxsock") # provides support for local system logging
module(load="immark") # provides --MARK-- message capability
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")
# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")
$template RemoteLogs,"/var/log/network/%FROMHOST-IP%.log" *
*.* ?RemoteLogs
& ~
###########################
#### GLOBAL DIRECTIVES ####
###########################
#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Filter duplicated messages
$RepeatedMsgReduction on
#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog
#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
-
module(load="imudp")
: 加载imudp
模块,它提供了UDP协议的syslog接收功能。UDP是一种无连接的协议,用于接收远程主机发送的syslog消息。 -
input(type="imudp" port="514")
: 配置UDP syslog的输入。它指定rsyslogd监听本地端口514,以接收UDP syslog消息。 -
module(load="imtcp")
: 加载imtcp
模块,它提供了TCP协议的syslog接收功能。与UDP不同,TCP是一种面向连接的协议,可以提供可靠的消息传递。 -
input(type="imtcp" port="514")
: 配置TCP syslog的输入。它指定rsyslogd监听本地端口514,以接收TCP syslog消息。 -
module(load="imklog" permitnonkernelfacility="on")
: 加载imklog
模块,它提供了内核日志支持,并允许接收非内核klog消息。klog是内核日志的一种特殊设备。 -
$template RemoteLogs,"/var/log/network/%FROMHOST-IP%.log" *
: 定义了一个名为RemoteLogs的日志模板。它指定了日志的输出位置和格式,这里的意思是将远程主机的日志以IP地址为文件名保存在/var/log/network/
目录下。 -
*.* ?RemoteLogs
: 这是一个日志规则,它指定将所有类型的日志消息发送到RemoteLogs模板中定义的输出位置。 -
& ~
: 这是另一个日志规则,它指定丢弃所有匹配的日志消息。这里的作用是防止消息被重复处理。
这些配置行的作用是配置rsyslogd以接收不同来源的syslog消息,并将它们保存到相应的日志文件中。
保存完配置后,重启rsyslog服务,并查看状态
systemctl restart rsyslog
systemctl status rsyslog
netstat -nltup | grep 514
2. goNfCollector部署
环境要求:需要安装docker、docker-compose和wget工具。安装过程中需要魔法
,否则可能会失败
下载最新版本:通过以下命令将最新版本的脚本文件下载到本地:
wget -O latest.sh https://raw.githubusercontent.com/javadmohebbi/goNfCollector/main/dockerize/build-up-from-github.sh
使脚本文件可执行:通过以下命令给下载的脚本文件赋予执行权限:
chmod +x latest.sh
运行下载的脚本:通过以下命令运行下载的脚本文件:
./latest.sh
在执行过程中,可能会要求输入用户密码。
在执行完成后,脚本会告诉你如何运行容器。但我们不需要通过这个来运行容器。
3. Grafana Loki部署
因为是使用docker环境来部署的,所以就相对就方便很多,仅需要编辑下docker compose文件就可以了,并且将上一步中的influxdb,nfcolector合并到一起并修改下network设置。
version: "3"
networks:
loki:
external: true
services:
loki:
image: grafana/loki:2.8.0
ports:
- "3100:3100"
volumes:
- loki-config:/etc/loki
command: -config.file=/etc/loki/local-config.yaml
networks:
- loki
promtail:
image: grafana/promtail:2.8.0
volumes:
- promtail-config:/etc/promtail
- /var/log:/var/log
command: -config.file=/etc/promtail/config.yml
networks:
- loki
grafana:
environment:
- GF_PATHS_PROVISIONING=/etc/grafana/provisioning
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
- GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource,agenty-flowcharting-panel
entrypoint:
- sh
- -euc
- |
mkdir -p /etc/grafana/provisioning/datasources
cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
orgId: 1
url: http://loki:3100
basicAuth: false
isDefault: true
version: 1
editable: false
EOF
/run.sh
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- grafana-storage:/var/lib/grafana
networks:
- loki
# Influx DB
influxdb:
image: influxdb:2.0.7
restart: always
volumes:
- /docker/nfcollector/vendors/influxdb:/var/lib/influxdb2
ports:
- "8086:8086"
# - "8082:8082"
#- "8089:8089"
networks:
- loki
nfcolector:
image: javadmohebbi/gonfcollector
restart: always
# network_mode: host
ports:
- "6859:6859/udp"
volumes:
- /docker/nfcollector/bin:/opt/nfcollector/bin
- /docker/nfcollector/etc:/opt/nfcollector/etc
- /docker/nfcollector/var:/opt/nfcollector/var
- /docker/nfcollector/vendors:/opt/nfcollector/vendors
networks:
- loki
environment:
- NFC_DEBUG=true
# total number of cpu nfcollector could use
- NFC_CPU_NUM=0
- NFC_LISTEN_ADDRESS=0.0.0.0
- NFC_LISTEN_PORT=6859
- NFC_INFLUXDB_HOST=influxdb
- NFC_INFLUXDB_PORT=8086
- NFC_INFLUXDB_TOKEN=5vqt0q0b4g_lZwNgp7-8GgPq5Nxf3YY37xbVZP_ypeK_G3dwdNlTrAkcKN_Q6QzbmG-Th96lT_65Kp0j2UD1HA==
- NFC_INFLUXDB_BUCKET=nfCollector
- NFC_INFLUXDB_ORG=OPENINTELLIGENCE
- NFC_IP_REPTATION_IPSUM=/opt/nfcollector/vendors/ipsum/ipsum.txt
- NFC_IP2L_ASN=/opt/nfcollector/vendors/ip2location/db/IP2LOCATION-LITE-ASN.IPV6.CSV/IP2LOCATION-LITE-ASN.IPV6.CSV
- NFC_IP2L_IP=/opt/nfcollector/vendors/ip2location/db/IP2LOCATION-LITE-DB11.IPV6.BIN/IP2LOCATION-LITE-DB11.IPV6.BIN
- NFC_IP2L_PROXY=/opt/nfcollector/vendors/ip2location/db/IP2PROXY-LITE-PX10.IPV6.CSV/IP2PROXY-LITE-PX10.IPV6.CSV
- NFC_IP2L_LOCAL=/opt/nfcollector/vendors/ip2location/local-db/local.csv
- NFC_SOCK_PATH=/opt/nfcollector/var/socket/fw.socket
volumes:
loki-config:
promtail-config:
grafana-storage:
编辑完之后使用命令行检查下yaml设置并启动docker
docker compose config #命令用于验证和查看`docker-compose.yaml`文件的配置。
docker compose up -d #命令用于在后台启动并运行基于`docker-compose.yaml`文件定义的容器组。其中,`-d`标志表示以后台(守护)模式运行容器。
访问Grafana
通过访问http://hostip:3000来访问Grafana平台,初始密码为admin/admin
后续工作
- 将网络设备的日志及netflow转存到对应的服务中。
- 在Grafana上对数据进行筛选及展示。
Refernce
[1] https://github.com/javadmohebbi/goNfCollector
[2] https://grafana.com/docs/loki/latest/installation/docker/
[3] https://github.com/grafana/loki
[4] https://github.com/grafana/grafana