Mikrotik логирование на удаленный сервер rsyslog

Возникло желание собирать логи с роутера Mikrotik. Была нужна информация о подключенных по pptp абонентах и логи firewall для настройки. По-умолчанию, Mikrotik пишет все логи в лог журнал, который можно просмотреть через winbox. Стандартно, там хранятся последние 100 строк лога.

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

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

Mikrotik logging

Настраиваем удаленный сервер rsyslog

У меня в хозяйстве имелся сервер Debian. Решил хранить логи с микротиков именно на нем. В составе Debian уже имеется сервис сбора логов с удаленных источников rsyslog. Необходимо только включить в нем необходимый функционал. Правим файл /etc/rsyslog.conf:

Раскомментируем строки

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

чтобы получать логи по UDP, либо

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

чтобы получать логи по TCP

И в секцию RULES добавим несколько строк для удобного хранения файлов логов от разных удаленных источников:

# Зададим шаблон создания имен файлов (на основании IP адреса клиента)
$template FILENAME,"/var/log/!remote/%fromhost-ip%/syslog.log"
# Укажем сохранять сообщения от любого источника (*) с любым приоритетом (*) в файл, заданный шаблоном
# Например, клиенты (10.0.0.2,10.0.0.3...) будут раскладываться в соответствующие каталоги /var/log/10.0.0.2/syslog.log
 *.* ?FILENAME

Перезапускаем rsyslog для применения настроек:

/etc/init.d/rsyslog restart

Теперь наш сервер готов принимать логи с удаленных источников. Хранить он их будет в папке /var/log/!remote Для каждого источника будет создана папка с именем IP адреса этого источника.

Настраиваем пересылку логов в Mikrotik

Теперь настраиваем в роутере хранение логов на удаленном сервере. Для этого заходим в раздел System -> Logging, выбираем закладку Actions, два раза щелкаем по строчке remote. Открывается окно настроек. В нем вводим адрес удаленного сервера сбора логов. Порт на свое усмотрение либо оставляем по-умолчанию, либо меняем на свой. Больше ничего добавлять не надо.

настройка логов в mikrotik

Дальше в разделе Rules создаем необходимое правило хранения:

Правила для логов в mikrotik

Все готово. Теперь все наши логи будут храниться на удаленном сервере. Необходимо не забыть настроить ротацию логов, дабы в один прекрасный день они не заняли все свободное место.

запись логов с mikrotik в rsyslog

Если вы используете ELK Stack для централизованного сбора логов, то у меня есть статья по отправке логов mikrotik в elk stack.

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

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

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

Рекомендую полезные материалы по схожей тематике:

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Автор Zerox

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

21 комментарий

  1. Цитата:
    "# Укажем сохранять сообщения от любого источника (*) с любым приоритетом (*) в файл, заданный шаблоном
    # Например, клиенты (10.0.0.2,10.0.0.3...) будут раскладываться в соответствующие каталоги /var/log/10.0.0.2/syslog.log
    *.* ?FILENAME"
    Приветствую. Значит, настроил логирование с микротика на серверок по вашей статье. Вроде работает. Но несть несколько "НО"
    К примеру, после включения вышепроцитированной опции на сервере начало "срать" везде, где только можно: например, появился "дубль" syslog по пути "/var/log/!remote/127.0.0.1/syslog.log" - а он там и нафиг не нужен был, тем более дубль "/var/log/syslog".
    Далее, записи от микрота дублируются в том же "/var/log/syslog", а это тоже, мягко говоря, лишнее. По вашей статье я, к сожалению, не могу разобраться, что там и где "позакрывать", чтобы подавить лишнее "логирование".
    Я так понимаю в конфиге "rsyslog.conf" надо чего-то где-то попрописывать, чтобы отключить или подавить ненужное?

    • У меня есть более свежая статья по этой теме. Лучше посмотреть решение там:
      https://serveradmin.ru/monitoring-mikrotik-v-zabbix/

      • Благодарю. По новой статейке настроил. Хотя ликбеза по синтаксису rsyslog.conf и logrotate*.* мне это не отменяет. Далеко не все там "интуитивно" понятно - с переменными, с их созданием, с их использованием в разных местах конфига, отличия в использовании системных переменных от пользовательских и пр., и пр...

  2. Николай

    В догонку скрипт, с помощью которого можно организовать удалённое логирование событий при падении аплинка. Когда скрипт замечает что аплинк упал, он начинает писать логи событий в файл, а когда аплинк поднимется отправляет их в лог, в том числе и удаленно, если удалённое логирование настроено. Для работы скрипта в имени интерфейса, который является аплинком должно быть слово uplink. Например так: ether3 uplink

    :local tmp [:toarray ""]
    :local numInt 
    :local truFal [:toarray ""]
    :local l 0
    :local tf
    :local file
    :local lastPos 0
    :local k true
    :local line
    :local count 1
    
    #:delay 30s;
    
    /log info ("uplinkMonitor working!")
    
    for i from=0 to=50 do={ :set ($truFal->$i) 1;}
    
    while (true) do={
    
        :set tmp [/interface ethernet find where name~".*uplink"]
    
        :if ( [:len $tmp]>1) do={ /log info ("More then one uplink!"); :delay 10s; /log info ("Trying!"); :set count 0 } else={
            :if ( [:len $tmp]$i) 1;} }
                  
                :set l [:len ($tmp->0)]
                :set $numInt [:pick ($tmp->0) 1 $l];
                      
                :set tf [/interface get ($numInt-1) running];
                 			
                :if (  $truFal->(($numInt*1)-1)=1  ) do={ 
                   :set ($truFal->(($numInt*1)-1)) $tf;
                }
                 			 
                :if (  $truFal->(($numInt*1)-1)=true  && $tf=false ) do={
                    :set ($truFal->(($numInt*1)-1) ) false;
                       
                    /system logging action  add name="uplinkCrashDisk" target="disk" disk-file-name="uplinkCrash"
                    /system logging add topics="critical" action="uplinkCrashDisk"	
                    /system logging add topics="error" action="uplinkCrashDisk"	
                    /system logging add topics="warning" action="uplinkCrashDisk"	
                    /system logging add topics="info" action="uplinkCrashDisk"	
                    /log info ("ether" . ($numInt)  . " uplink link down (BY SCRIPT)");                  
                       
                }
                   
                :if (  $truFal->(($numInt*1)-1)=false  && $tf=true ) do={ 
                    :set ($truFal->(($numInt*1)-1)) true;
                    /log info ("ether" . ($numInt)  . " uplink link up (BY SCRIPT)")
    	/system logging remove [/system logging find where  action="uplinkCrashDisk"]
    	/system logging action remove [/system logging action find where name="uplinkCrashDisk"]
                                        				
                    :delay 1s
                          
                    :set file [/file get [/file find where name="uplinkCrash.0.txt"] contents ]
                    /log error ("start-------------SCRIPT-------------------start")
                            
                    :set k true; set lastPos 0;
                    :while (k) do={
                        :set line [:pick $file $lastPos [:find $file "\n" $lastPos]];
                        /log info $line
                        :set $lastPos  ([:find $file "\n" $lastPos ]+1)
                        :if ( $lastPos>=[:len $file] ) do={ :set k false }
                    }
                                      
                    /log error ("end---------------SCRIPT---------------end" )
                       
                    /file remove [/file find where name="uplinkCrash.0.txt"]
                        
                 }
                :delay 300ms;
            }        
        }
    }
    • А какой в этом смысл, если эти же аплинки можно мониторить по snmp? У меня есть статья.

      • Николай

        Мониторить по snmp можно, но опрашивать девайс, допустим каждую секунду - не комильфо. А если интерфейс флапает. Этот скрипт проверяет состояние интерфейса раз в 300 миллисекунд. Изначально цель была именно мониторить кратковременные падения-подъёмы интерфейсов.
        Хороший способ мониторить флапы интерфейса - это трапы на вышестоящем девайсе.
        Скрипт, кстати, вставился криво. Там как минимум две строки кривые. Если интересно, могу, допустим на почту, прислать нормальный текст скрипта.

        • Если есть задача в таких частых проверках, то наверно имеет право на жизнь. Но как себя само устройство чувствует с такими частыми проверками, особенно если интерфейсов много?

          Движок сайта не позволяет нормально вставлять код. Я поправил руками.

      • Дмитрий

        Здравствуйте, можете дать ссылку на эту статью?

  3. Алексадр

    Добрый день.
    настроил пересылку логов на киви syslog server. теперь вопрос как просматривать в удобоваримом формате. возможно реализовать подсчет трафика, а также кто куда ходил и сколько скачал с помощью логов микротика ?

    • Эти вопросы должны решаться не хранилищем логов. Нужен какой-то софт, который все это будет обрабатывать, складывать в базу данных и формировать отчеты. Мне такие инструменты, тем более бесплатные, не известны.

  4. Николай

    Добрый день.
    Спасибо за статью. Вопрос:
    Как быть с падением аплинка на микротике. Пока аплинк лежит, логи на удалённый сервер естественно не приходят. Но нет ли возможности получить все пропущенные события, когда аплинк поднимется?

    • Не знаю, не прорабатывал этот момент. Возможно как-то через скрипт это можно реализовать. Логи же он все равно локально пишет. Но задача на первый взгляд не простая.

  5. Владимир

    Добрый день.
    Настроил сбор логов в сети 192.168.65.0/24 все прекрасно работает. Так же имеется микротик в сети другого офиса 192.168.70.0/24, впн туннел настроен, пинги идут. Но логи не отправляются на сервер rsyslog 192.168.65.93. Не подскажете в чем может быть причина?

    • В чем угодно :) Так разве скажешь. Настройки firewall в первую очередь проверяйте. Дальше в rsyslog смотрите, нет ли там ограничение на прием по ip адресам.

      • Владимир

        В фаерволе разрешающие входящие правила для порта и ip были добавлены, получилось только после того, как добавил правильно в NAT (chain dstnat, dst.port 514, action=netmap 192.168.65.93 to ports 514). Я думал, что и без него микротик должен отправлять пакеты.

  6. Виктор

    Можно ли копить статистику на самом роутере и выкачивать её на внешний ресур только по необходимости, раз в неделю например? Или просматривать логи прямо на роутере?

  7. Добрый день!
    Подскажите поднял на CentOS Syslog в настройках указал только две строки:
    $template FILENAME,"/var/log/!remote/%fromhost-ip%/syslog.log"
    *.* ?FILENAME
    В Mikrotik указал какие логи слать на удаленный сервер и тишина ничего не падает...514 порт на CentOs открыт не подскажите куда копать?

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar