Всем привет, хочу поделиться своим опытом по реализации сбора syslog с маршрутизаторов Juniper. Изначально хотел использовать под эту задачу zabbix так, как он уже используется в рабочей сети как основная система мониторинга, но после анализа различных источников на эту тему, понял, что он просто не справится с такой нагрузкой. Исходя из этого, было принято решения использовать инструменты заточенные под сбор логов. Первое что пришло в голову, это связка promtail-loki-grafana так, как она достаточно быстро и просто реализуема. Всё бы ничего, но в процессе отладки, promtail не удавалось распарсить syslog с маршрутизаторов. Погуглив ошибку, выяснилось, что маршрутизаторы отправляют syslog с небольшим отклонением от формата RFC, заложенного в promtail. Таким образом, новая задача состояла в преобразовании syslog к надлежащему виду, с помощью какого-либо инструмента, и таким инструментом стал Vector. Vector отлично подходит для работы с логами сетевых устройств. После определения новой связки: vector-loki-grafana, я приступил к созданию конфигурационных файлов для vector и loki.
vector.toml
data_dir = "/var/lib/vector"
[sources.syslog_514]
type = "syslog"
address = "0.0.0.0:514" # порт для приема syslog с устройств Juniper
mode = "udp"
[sources.syslog_515]
type = "syslog"
address = "0.0.0.0:515" # порт для приема syslog с устройств Cisco
mode = "udp"
[transforms.filter_severity]
type = "filter"
inputs = [ "syslog_514", "syslog_515" ]
condition = """
!includes(["debug"], .severity)
"""
[transforms.check_labels]
type = "remap"
inputs = ["filter_severity"]
source = '''
if !exists(.host) || !exists(.severity) {
log("Missing required fields: host or severity", level: "error")
abort
}
if is_string(.host) {
.host = replace!(.host, "/", "_")
} else {
host_str, err = to_string(.host)
if err != null {
log("Failed to convert host to string: " + err, level: "error")
host_str = "unknown_host"
}
log("Host is not a string: " + host_str, level: "error")
.host = "unknown_host" # Значение по умолчанию
}
'''
[sinks.my_sink_id]
type = "loki"
inputs = [ "check_labels" ]
endpoint = "http://localhost:3100"
[sinks.my_sink_id.encoding]
codec = "json"
[sinks.my_sink_id.labels]
host = "{{ host }}" # для отображения syslog по каждому хосту
severity = "{{ severity }}" # для отображения syslog по уровням важности
log_type = "all_logs" # для отображения syslog всех хостов
[sinks.file_syslog]
type = "file"
inputs = [ "filter_severity" ]
healthcheck = true
path = "/var/log/vector/vector-%Y-%m-%d.log"
[sinks.file_syslog.encoding]
codec = "text" # Указываем кодировку для файлового вывода
loki-config.yaml
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
common:
instance_addr: 127.0.0.1
path_prefix: /tmp/loki
storage:
filesystem:
chunks_directory: /tmp/loki/chunks
rules_directory: /tmp/loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
query_range:
results_cache:
cache:
embedded_cache:
enabled: true
max_size_mb: 100
schema_config:
configs:
- from: 2020-10-24
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
ruler:
alertmanager_url: http://localhost:9093
После подготовки основных конфигурационных файлов, я приступил к развертыванию непосредственно самих инструментов. Наиболее быстрым и удобным решением для этого, является использование docker-compose.
Docker-compose.yml
services:
loki:
image: grafana/loki:3.2.1
container_name: loki
ports:
- "3100:3100"
volumes:
- ./:/mnt/config
command: -config.file=/mnt/config/loki-config.yaml # Указание конфигурационного файла
restart: unless-stopped
grafana:
hostname: grafana
environment:
- GF_PATHS_PROVISIONING=/etc/grafana/provisioning
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
- TZ=${SYSTEM_TIMEZONE:-Europe/Moscow}
image: grafana/grafana:latest
ports:
- "3000:3000"
vector:
image: timberio/vector:latest-alpine # Официальный образ Vector
container_name: vector
restart: unless-stopped
ports:
- "514:514/udp" # Порт для syslog Juniper
- "515:515/udp" # Порт для syslog Cisco
volumes:
- ./vector.toml:/etc/vector/vector.toml # Подключение конфигурации
environment:
- VECTOR_CONFIG=/etc/vector/vector.toml # Указание конфигурационного файла
Инициировал запуск контейнеров с помощью команды: "docker-compose up -d", из директории в которой располагается конфигурационный файл docker-compose.yml. После того как, все контейнеры подгрузились, проверил их состояние: "docker ps -a".
После развертывания можно убедится в корректности функционирования каждого сервиса. Работоспособность grafana, проверяется по адресу: "http://localhost:3100/". Проверка loki осуществляется с помощью выполнения HTTP-запроса к API Loki: http://localhost:3100/ready.
Ожидаемый ответ:
ready
Проверку работы vector, я осуществлял посредством анализа логов контейнера: "docker logs vector".
Теперь, когда все необходимые инструменты развернуты, остается произвести конфигурацию сетевых устройств, для отправки их syslog на сокет vector. В маршрутизаторах и коммутаторах juniper достаточно прописать следующие команды:
set system syslog host <ip-адрес vector> any any
set system syslog host <ip-адрес vector> port 514
set system syslog host <ip-адрес vector> facility-override local7
set system syslog host <ip-адрес vector> structured-data
Изменить конфигурацию можно двумя способами:
1) Подключиться к устройству и прописать вручную
2) Написать playbook, и с помощью Ansible изменить конфигурацию
Я выбрал второй вариант, так как изменять конфигурацию на каждом устройстве вручную, достаточно долгое занятие, особенно в крупных сетях.
Примерный вариант используемого мной playbook:
---
- name: "logs"
hosts: junos
connection: local
gather_facts: no
collections: juniper.device
tasks:
- name: "logs"
junipernetworks.junos.junos_config:
lines:
- "set system syslog host <ip-сервера> any any"
- "set system syslog host <ip-сервера> port 514"
- "set system syslog host <ip-сервера> facility-override local7"
- "set system syslog host <ip-сервера> structured-data"
commit: yes
В целях проверки, отправляемых сетевыми узлами syslog, можно на стороне сервера с помощью команды: "sudo tcpdump -i any port 514" осуществить прослушивание порта.
В целом, система уже собирает логи, остается только решить задачу визуализации данных , посредством создания dashboard в Grafana, но тут как говорится: "на вкус и цвет товарищей нет". Поэтому, я покажу какие варианты панелей на мой взгляд имеют место быть. Но для начала, необходимо подключить Loki к Grafana, как новый источник данных. Заходим в Grafana по адресу http://<ip-сервера>:3000, переходим в вкладку "Connections" и выбираем "Data sources" - "+ Add new data source". Далее, с помощью поисковой строки находим и выбираем "Loki", в случае если grafana и loki располагаются на одном устройстве, достаточно указать указать в разделе Connection url: http://localhost:3100, в противном случае указать ip-сервера на котором развернут Loki. После чего сохраняем новый источник данных "save & test".
Panel №1. Вывод Logs
Переходим в "Dashboards" - "New" - "New dashboard" - "Add Visualization" - "Loki"
1 - Выбираем тип Logs; 2 - Задаем название panel; 3 - Включаем временные метки; 4 - Создаем запрос. Результатом запроса будет вывод всех syslog со всех устройств. После чего обновляем значение "Run query", получаем вывод syslog и сохраняем.
Далее добавляем средства поиска и фильтрации, выводимых syslog.
Переходим в выделенную красным цветом, вкладку - "Dashboard settings" - "Variables" - "Add variable" и действуем как показано ниже.
Проделываем аналогичные действия по созданию поля метки "Severity". После этого добовляем filter, как показано на рисунке ниже.
В результате проделанных действий, получается панель с выводом syslog и поисковой системой с фильтрацией.
Panel №2. Bar gauge and Pie chart
Панель отображения статистики хоста создается согласно следующего изображения.
Пример запроса:
sum by(severity) (
count_over_time({host="RLIK-Krasnoyrsk-Olive"} [$__range])
)
Точное имя хоста можно взять при выборе метки в режиме "Builder"
С аналогичной информативностью представляется возможным, построить и круговую диаграмму "Pie chart"
Пример запроса аналогичный, отличаться будет только имя хоста или использование метки для анализа всех syslog. На основе информации представленной выше вы можете собрать dashboard как на изображении ниже, исходя из своих интересов.
Заключение
Таким образом, используя инструменты Vector, Loki и Grafana, посредством не сложных манипуляций можно собрать достаточно хорошую систему сбора и анализа логов с сетевых устройств. Благодаря грамотной конфигурации Vector и правильно составленного dashboard в Grafana вы сможете: своевременно выявлять сетевые сбои и проблемы, отслеживать производительность, обнаруживать атаки и многое другое, что поможет вам успешно заниматься администрированием сети.