Home » Devops » Централизованный сбор логов Mikrotik в ELK Stack

Централизованный сбор логов Mikrotik в ELK Stack

Очередной материал на тему централизованной системы сбора логов. Сегодня расскажу, как настроить сбор логов с устройств компании Mikrotik в ELK Stack. Статья ничем не примечательна, так как делается все стандартно и просто. Никакого парсинга и разбора логов я делать не буду. То есть будем просто хранить логи микротиков в одном месте с удобным поиском.

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти .
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на . Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

Данная статья является частью единого цикла статьей про Mikrotik.

Введение

Ранее я рассказал, как установить и настроить elk stack, потом как загружать и анализировать логи nginx и samba. Теперь пришел черед логов Mikrotik. Я уже рассказывал, как отправлять логи микротика на удаленный syslog сервер, в качестве которого может выступать в том числе syslog-ng. В данном случае на самом микротике ничего особенного делать не надо. Будем точно так же отправлять данные на удаленный syslog сервер, в качестве которого будет трудиться logstash.

Я некоторое время рассуждал на тему парсинга и разбора логов. Но посмотрев на типичную картину стандартных логов mikrotik, понял, что ничего не выйдет. События очень разные и разобрать их одним правилом grok не получится. Если нужен парсинг и добавление метаданных к событиям, необходимо определенные события выделять и направлять отдельным потоком в logstash, где уже обрабатывать своим фильтром. Например, отдельный фильтр можно настроить на парсинг подключений к vpn или подключение по winbox с анализом имен пользователей.

Я же буду просто собирать все логи скопом и складывать в единый индекс. У записей не будет метаданных, по которым можно строить дашборды и анализировать данные. Но тем не менее, это все равно удобно, так как все логи в одном месте с удобным и быстрым поиском.

Настройка logstash на прием логов микротик

В конфиге /etc/logstash/conf.d/input.conf добавляем секцию для приема syslog логов. Вместе с логами от beats конфиг будет выглядеть вот так:

input {
    beats {
	port => 5044
    }
    syslog {
	port => 5045
	type => syslog
    }
}

В конфиге с фильтрами filter.conf я разделил с помощью тэгов логи обычных роутеров, свитчей и wifi точек доступа по ip адресам. Получилось примерно так:

    else if [host] == "10.1.4.19" or [host] == "10.1.5.1" {
        mutate {
            add_tag => [ "mikrotik", "gateway" ]
        }
    }
    else if [host] == "10.1.4.66" or [host] == "10.1.3.110" or [host] == "10.1.3.111" {
        mutate {
            add_tag => [ "mikrotik", "wifi" ]
        }
    }
    else if [host] == "10.1.4.14" or [host] == "10.1.5.33" {
        mutate {
            add_tag => [ "mikrotik", "switch" ]
	}
    }

Это простой случай, когда устройств мало. Если у вас много устройств, то лучше наверно придумать что-то другое, чтобы не нагружать logstash лишними правилами. Да и в ручную править конфиг неудобно. Как лучше поступать в таком случае - не знаю, не продумывал тему. Наверно имеет смысл разделить потоки по разным портам и на этом основании принимать решение о дальнейшей обработке.

Отправляем полученные логи в elasticsearch, настроив конфиг output.conf:

    else if "mikrotik" in [tags] {
        elasticsearch {
            hosts     => "localhost:9200"
            index    => "mikrotik-%{+YYYY.MM}"
        }
    }

Я просто складываю все логи с тэгом mikrotik в один индекс с разбивкой по месяцам. На типы gateway, switch и wifi не разделяю, хотя можно это сделать. Тэги я добавил просто для удобства просмотра логов. С помощью тэгов можно будет быстро группировать логи по типу устройств.

Перезапускаем logstash и идем настраивать микротики на отправку логов на удаленный сервер.

Отправка логов mikrotik на удаленный сервер

Подключаемся к Mikrotik по winbox и идем в раздел System -> Logging. Изначально там вот так, если вы ничего не меняли.

Настройки логирования в Микротике

Идем на вкладку Actions, выбираем remote и указываем параметры:

Отправка логов Mikrotik на удаленный сервер

В данном случае:

  • 10.1.4.114 - сервер elk, точнее с logstash;
  • 5045 - порт, по которому logstash принимает syslog подключения.

После этого идем на вкладку Rules и дублируем стандартные правила, указывая action remote или добавляем новые правила для отправки логов. Должно получиться примерно вот так:

Централизованный сбор логов Mikrotik

Все, микротик настроен на отправку логов на удаленный сервер. Больше на нем ничего делать не надо. Идем в web интерфейс Kibana.

Добавление индекса mikrotik в kibana

Если в предыдущих разделах вы все сделали правильно, в elasticsearch должны начать поступать данные от микротиков в индекс mikrotik-*. Идем в Kibana в раздел Management -> Index Patterns и добавляем новый индекс.

Индекс в elasticsearch для логов микротика

После этого можно в разделе Discover просматривать логи. При этом работает группировка по тэгам, которые характеризуют тип устройства.

Хранение логов mikrotik в elk stack

На этом по настройке хранения логов mikrotik в elk stack все. Надеюсь, было полезно.

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Получилась простая статья по сбору логов. Для тех, кто уже работал с ELK Stack тут ничего нового нет. По сути, никакого анализа и графиков нет, а именно это чаще всего интересует при использовании elk. Я просто не придумал, что может быть полезного в логах микротика, что требует какого-то детального разбора и построения дашбордов. Если у кого-то есть идеи или примеры grok фильтров, прошу поделиться.

Напоминаю, что данная статья является частью единого цикла статьей про Mikrotik.

Онлайн курс "DevOps практики и инструменты"

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров. Проверьте себя на вступительном тесте и смотрите программу детальнее по .

Онлайн курсы по Mikrotik

Если у вас есть желание научиться работать с роутерами микротик и стать специалистом в этой области, рекомендую пройти курсы по программе, основанной на информации из официального курса MikroTik Certified Network Associate. Помимо официальной программы, в курсах будут лабораторные работы, в которых вы на практике сможете проверить и закрепить полученные знания. Все подробности на сайте . Стоимость обучения весьма демократична, хорошая возможность получить новые знания в актуальной на сегодняшний день предметной области. Особенности курсов:
  • Знания, ориентированные на практику;
  • Реальные ситуации и задачи;
  • Лучшее из международных программ.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

46 комментариев

  1. Аноним

    Syslog input plugin хорошо только для логов созданных по RFC3164 style or ISO8601. Если это не так, то нужно парсить их GROK фильтром https://www.elastic.co/guide/en/logstash/current/plugins-inputs-syslog.html

  2. Алексей

    Если железо древнее и на нем нельзя сменить порт сервера syslog (514 по умолчанию), то вы не сможете запустить logstash на привилегированном порту, как было в моем случае. Я нашел такое решение.
    Можно воспользоваться setcap и выдать java возможность на запуск сервиса на привилегированном диапазоне портов (0-1024).
    systemctl stop logstash
    setcap CAP_NET_BIND_SERVICE=+eip /usr/share/logstash/jdk/bin/java
    Если сейчас запустить logstash, то в /var/log/ messages будут ошибки:
    logstash: /usr/share/logstash/jdk/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
    Чтобы исправить создаем символьную ссылку ln -s /usr/share/logstash/jdk/lib/jli/libjli.so /usr/lib/
    Обновляем кэш динамических библиотек: ldconfig
    Теперь можно запускать logstash, если в конфиге указан 514 порт, то теперь можно убедиться, что он открыт netstat -ntlup

    Чтобы проверить наличие возможности у бинарника - getcap /usr/share/logstash/jdk/bin/java
    В выводе будет /usr/share/logstash/jdk/bin/java = cap_net_bind_service+eip

    Другое решение, можно с помощью iptables включить перенаправление с 514 порта на тот, на котором запущен logstash

  3. Владимир, вы используете в filter.conf IP адреса конкретных устройств:
    "[host] == "10.1.4.19" or [host] == "10.1.5.1""
    А как правильно задать необходимую подсеть?
    [host] == "10.1.5.0/24"
    Вот так правильно будет?

    • Скорее всего нет, надо проверять. Я сейчас уже не помню точно. Тут смысл не в том, чтобы указать правильно именно подсеть. Там просто берется поле host и в нем проверяется конкретная запись. То есть если нужна подсеть, то должно быть что-то в стиле "10.1.5.*" или "10.1.5." Хотя скорее всего вместо == должно стоять какое-то сравнение по шаблону, а не точное соответствие. Синтаксис надо уточнить в документации.

  4. @Zerox зависает на этапе установки. Случайно, не нужно добавлять правила в firewall или NAT для 5045 порта на Микротике?

    • Что именно зависает, не понял?

      • У меня Windows Server выступает как logstash server.
        На последнем этапе запуска команды PowerShell: bin\logstash -f mikrotik.conf

        Зависает тут и дальше процесс не идет. Логи в ELK не поступают. Поддержка Elastic не очень сильна в добаление Mikrotik и убеждает, что упущенно правило на роутере.
        [2021-02-10T11:57:44,364][INFO ][logstash.javapipeline ][main] Pipeline Java execution initialization time {"seconds"
        =>1.88}
        [2021-02-10T11:57:44,904][INFO ][logstash.javapipeline ][main] Pipeline started {"pipeline.id"=>"main"}
        [2021-02-10T11:57:44,943][INFO ][logstash.inputs.syslog ][main][0f5fb9cf96985447f83be753c676bd828f1e2bbc7ab
        c23dc207b3] Starting syslog tcp listener {:address=>"0.0.0.0:5045"}
        [2021-02-10T11:57:44,969][INFO ][logstash.inputs.syslog ][main][0f5fb9cf96985447f83be753c676bd828f1e2bbc7ab
        c23dc207b3] Starting syslog udp listener {:address=>"0.0.0.0:5045"}
        [2021-02-10T11:57:45,012][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :
        non_running_pipelines=>[]}
        [2021-02-10T11:57:46,064][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}

  5. Владимир

    А для анализа трафика можно использовать traffic flow в mikritik. Не пробовал связать с ELK?

  6. Добрый день.
    Подскажите что я делаю не так. Микротик не отправляет логи.

    input {
    beats {
    port => 5044
    }
    syslog {
    port => 5045
    type => syslog
    }
    }

    output {
    if [type] == "nginx_access" {
    elasticsearch {
    hosts => "localhost:9200"
    index => "nginx-%{+YYYY.MM.dd}"
    }
    }
    else if [type] == "nginx_error" {
    elasticsearch {
    hosts => "localhost:9200"
    index => "nginx-%{+YYYY.MM.dd}"
    }
    }
    else if "winsrv" in [tags] {
    elasticsearch {
    hosts => "localhost:9200"
    index => "winsrv-%{+YYYY.MM.dd}"
    }
    }
    else if "mikrotik" in [tags] {
    elasticsearch {
    hosts => "localhost:9200"
    index => "mikrotik-%{+YYYY.MM}"
    }
    }
    else {
    elasticsearch {
    hosts => "localhost:9200"
    index => "unknown_messages"
    }
    }
    #stdout { codec => rubydebug }
    }

    filter {
    if [type] == "nginx_access" {
    grok {
    match => { "message" => "%{IPORHOST:remote_ip} - %{DATA:user} \[%{HTTPDATE:access_time}\] \"%{WORD:http_method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent_bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\"" }
    }
    }
    else if [host] == "172.17.113.1" or [host] == "172.17.112.1" {
    mutate {
    add_tag => [ "mikrotik", "gateway" ]
    }
    }
    date {
    match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
    }
    geoip {
    source => "remote_ip"
    target => "geoip"
    add_tag => [ "nginx-geoip" ]
    }
    }

    • Так сходу не подскажу, надо вникать в правила. Сделайте отдельный индекс для всех, кто не попал ни в какое правило и смотрите, поступает ли туда что-то от микротика. Возможно у вас тегирование не работает, поэтому данные не попадают в нужный индекс. А если данные вообще не идут в elastic, смотрите, что на микротике не так. Задача не сложная, я много раз собирал логи с микротов в elk. Надо все аккуратно сделать и проверить.

      • Логи с микрота идут, падают в unknown_messages, как правильно оформить конфиг filter? Я думаю там проблема.
        Конфиги все с вашего мануала 1 в 1.
        Как туда правильно добавить микротика?

  7. Как в ELK передать название микротика то что в Identity ?

  8. Владимир

    Все делал как вы и описали но увы ничего нет, не могу добавить индекс микротика(

  9. Виталий

    А каким образом можно увеличить параметр Top 5 values in 500 / 500 records, хотелось бы видеть все записи, а не только топ 5?

    • По-быстрому не знаю как. А в общем случае сделайте визуализацию по полю tag и выведите столько значений, сколько надо. Заодно и подсчитаете вхождение каждого tag в записях.

  10. Доброго.

    В догонку habr.com/post/431600/

  11. Константин

    Спасибо за статью.
    нет ли ошибки в logstash input? ведь там не указан протокол (tcp, udp)
    И должен ли быть порт 5044 в состоянии LISTEN в системе?

    • Ошибки нет. Порт должен быть открыт и принимать соединения.

      • Валерий

        Мне удалось запустить на данной системе модуль netflow в настройках файла logstash.yml "Module Settings" раскомментируем строку modules (второй) и добавляем

        modules:
        -name:netflow
        var.input.udp.port: 9300

        Сохраняем, перезапускаем
        # systemctl restart logstash.service
        Идем смотреть лог
        # tail -f /var/log/logstash/logstash-plain.log

        После этого он будет игнорировать некоторые версии пакетов, но в индексах появиться "netflow-2018.11.30"
        Гораздо более расширенные данные о трафике, и не забудьте на микроте настроить TraffikFlow с портом и таргетом на logstash

        • Валерий

          Один существенный минус, я так и не разобрался как выставить сопоставление IP адресов и DNS имен

          • Валерий

            https://github.com/robcowart/elastiflow/blob/master/INSTALL.md Вот еще лучше версия и кстати 300 готовых визуализаций

            • Валерий

              Установка и настройка прошла успешно, 7 день полет нормальный принимаю полностью статистику от микротика с выводом данных и визуализацией и движениям по сети как локальной так и внешней

              • Можно скриншот этой красоты увидеть? Визуализацию или дашборд готовый, если есть.

                • Валерий

                  Вот скрины https://yadi.sk/d/eX5VFNDYjKzckw

                  Если есть вопросы могу помочь почта для вопросов valerondestoer@gmail.com

                  • Красиво получилось, информативно. Мне кажется, эти логи будут очень много места занимать. Если нет большой нужды в таком подробном анализе логов, то весьма накладно все это хранить и обрабатывать. Хотя для расследования инцидентов, можно хранить за последние 2-3 дня и дальше чистить.

                    • Валерий

                      Выделил под виртуалку 600гб лог за день весит от 1.5-до 2гб на месяц должно хранить, и главное для jvm выделить не 4 а 8

        • Константин

          А input.conf надо настраивать для netflow?

          • Валерий

            для netflow лучше использовать кодеки, и там настраивается целый стек параметров

  12. Валерий

    И все таки как прикрутить грамотно dashboard сюда пока не разобрался никто

  13. Что по вашему все таки удобнее/оптимальнее для сбора логов с mikrotik, syslog-ng или ELK?

    • Прошу прощения, имел ввиду rsyslog. У вас статья была по этому поводу.

    • Так это совсем разные вещи, решающие разные задачи. rsyslog просто хранит логи в текстовом виде и все. А elk это целый многофункциональный комплекс с web доступом. Только для микротиков я бы не стал поднимать elk. Я бы настроил rsyslog и webmin, если хочется через браузер смотреть логи и выполнять поиск по ним.

  14. Дмитрий

    Давно хотел почитать эти статьи про ELK, наконец, добрался.
    А можно настроить какие-то уведомления на критические события? Допустим, тот же логин пользователя или, к примеру, падение интерфейса.
    Полезное в логах микротика? Нагрузка на dhcp, wifi, данные PoE out. Или, например, если каждый час измеряется скорость, то можно рисовать эту скорость на графиках, но это, мне кажется, очень узкоприменимый кейс.

    • Мне кажется под все описанное больше zabbix подходит.

      • Дмитрий

        Да, zabbix сейчас и используется. Просто интересен функционал ELK с точки зрения хранения всех логов. Кстати, вопрос по уведомлениям актуален) Или, наверно, логичнее уже мониторить эти логи в zabbix?

        • Нужно разделять функционал. То, что вы описали вначале, не только про логи. Например, падение интерфейса. Логичнее это мониторить по snmp в zabbix и слать уведомления. Логин пользователя, тут уже надо думать, где лучше реализовывать. Можно и в заббиксе и в elk. Но мне кажется, elk все же больше про большие логи и визуализацию, поиск в них. Мониторинг не его задача. Уведомления в нем есть, но я не разбирался и не настраивал.

Добавить комментарий

Ваш адрес email не будет опубликован.

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.