Инструменты пользователя

Инструменты сайта


raspberry_pi:pi_4_model_b:raspberry_pi_os:syslog-ng:mikrotik

Сбор и отправка логов MikroTik с syslog-ng

Устройства MikroTik всем хороши и это особенно хорошо, когда их много! А если много, то и проблем может быть чуть больше, чем хотелось бы, а лазить по разным железкам и смотреть там логи, это не вариант. А если еще какая-то железка куда-то из сети пропала…

О, кстати, еще есть нюанс – Микротик не умеет из коробки отправлять интересные строки логов на почту1)!

Настройка MikroTik

Тут все до жути банально – добавляем действие, причем, я предпочитаю использовать разные категории – к примеру, «local6» для роутеров, а «local7» для антенн.

Ну, и нужные правила – опять же, больше логов перешлем, чище будет жопа совесть.

syslog.rsc
/system logging action
add bsd-syslog=yes name=Syslog remote=192.168.0.245 syslog-facility=local6 \
target=remote
 
/system logging
add action=Syslog prefix=mk_log topics=info
add action=Syslog prefix=mk_log topics=critical
add action=Syslog prefix=mk_log topics=error
add action=Syslog prefix=mk_log topics=warning

Использование протокола BSD-syslog, на этом безрыбье2), обязательно, иначе не будет правильно передаваться важность события. Префикс тоже будет использоваться в дальнейшем и он должен быть у всех устройств одинаковый.

Сервер syslog-ng

Не скажу, почему именно эта ветка сислога, почему, к примеру, не rsyslog, установленный в Raspberry Pi OS 11 (bullseye) по умолчанию… Просто так сошлись звезды, ну… еще я в документации увидел, что он может без танцев с бубном отправлять письма! Вот.

Установка

Тут ничего нового:

  1. sudo apt update && sudo apt upgrade;
  2. sudo apt install syslog-ng.

При этом, rsyslog удалится автоматически! NG его полностью замещает.

Настройка

Базовые настройки хранятся в файле «/etc/syslog-ng/syslog-ng.conf», а дополнительные принято складывать в папку «/etc/syslog-ng/conf.d/», поэтому нужно создать новый файл sudo nano /etc/syslog-ng/conf.d/mikrotik.conf и добавить в него конфиг3):

mikrotik.conf
#Global
options {
  create-dirs( yes );
  dir-group( adm );
  dir-perm( 0755 );
  group( adm );
  perm( 0644 );
  use-dns( yes );
  use-fqdn( yes );
  dns-cache( yes );
};
 
#Sources
source s_my_udp {
  network(
    transport( udp )
    flags( no-hostname )
  );
};
 
#Filters
filter f_my_mikrotik {
  message( "mk_log" );
};
filter f_my_mail {
  message( "changed by admin" )
  or message( "XX:XX:XX:XX:XX:XX" );
};
 
#Rewrites
rewrite r_my_mikrotik {
  subst( "mk_log: ", "", value( "MESSAGE" ) );
  subst( "XX:XX:XX:XX:XX:XX", "iPhone-Nikolay", value( "MESSAGE" ) );
  subst( "XX:XX:XX:XX:XX:XX", "iPhone-Olga", value( "MESSAGE" ) );
};
 
#Templates
template t_my_mikrotik {
   template( "<${PRI}>1 ${ISODATE} ${HOST} - - - - ${MESSAGE}\n" );
};
 
#Destinations
destination d_my_mikrotik {
  file( "/var/log/mikrotik/remote.log"
    template( t_my_mikrotik )
  );
};
destination d_my_mail {
  smtp(
    host( "smtp.domain.int" ) port( 25 )
    from( "Syslog-NG" "syslog-ng@server.zone" )
    to( "Admin" "admin@server.zone" )
    subject( "=?UTF-8?B?<<<кОДИРОВАННЫЙтЕКСТ>>>?=" )
    body( "$MSG" )
  );
};
 
#Log paths
log {
  source( s_my_udp );
  filter( f_my_mikrotik );
  rewrite( r_my_mikrotik );
  destination( d_my_mikrotik );
    log {
      filter( f_my_mail );
      destination( d_my_mail );
    };
};

После сохранения файла, конфигурацию необходимо проверить sudo syslog-ng --syntax-only4) и перечитать sudo syslog-ng-ctl reload. Для рестарта демона можно использовать sudo systemctl restart syslog-ng.

#Global

Переписываем некоторые глобальные настройки5):

  • разрешаем создавать каталоги (1);
  • немного расширяем права доступа (2-5);
  • разрешаем резолвить имена (6-8)6).

#Sources

Список источников. В данном примере он только один – BSD-syslog7) на порту 514/UDP. Флаг «no-hostname» необходим для правильного разбора строки8) – MikroTik не передает имя хоста и все сдвигается на одну позицию влево из-за чего все ломается…

#Filters

Список фильтров. Первым мы отбираем из потока сообщения от определенных устройств. А вторым отбираем, что нужно отправлять по почте.

#Rewrites

Правила перезаписи. Сперва мы удаляем уже не нужную метку, а далее для удобства заменяем MAC-адреса читаемыми названиями. Последнее, кстати, мега удобно при просмотре логов!

#Templates

Шаблоны. Такой шаблон необходим, чтобы логи MikroTik правильно и, что главное, красиво отображались LogAnalyzer'ом в формате IETF-syslog.

#Destinations

Список назначений. Первое, это текстовый файл с подготовленным выше шаблоном. Второе… ну понятно, же! LOL Отправка на электронную почту.

:!: Тут есть один нюанс – чтобы использовать русский текст в теме письма9), его необходимо закодировать в BASE6410), к примеру, используя этот сайт, и разместить внутри такой конструкции =?UTF-8?B?_________?=.

#Log paths

Ну и напоследок собираем путь – тут он один, но с вложением – сперва сохраняем в файл, а потом отправляем по почте.

Ротация логов

Для контроля над занимаемым логами местом и размером самих логов, используется утилита «logrotate», которая читает дополнительные конфигурации из папки «/etc/logrotate.d», куда и нужно добавить новую конфигурацию, открыв пустой файл sudo nano /etc/logrotate.d/syslog-ng-mk и введя в него следующее:

/var/log/mikrotik/remote.log
{
        rotate 10
        size 10M
        missingok
        notifempty
        delaycompress
        compress
        nocreate
        postrotate
                invoke-rc.d syslog-ng reload > /dev/null
        endscript
}

Это будет обозначать, что:

  • храним 10 файлов,
  • сдвигаем при достижении размера в 10 мегабайт,
  • не пишем ошибку, если нет файла,
  • не сдвигаем пустой файл,
  • не архивируем только что сдвинутый файл,
  • далее архивируем,
  • не создаем новый,
  • после ротации выполняем указанную команду11).

Далее нужно только проверить конфиг sudo logrotate /etc/logrotate.conf --debug и все.

Просмотр логов

Смотреть журналы удобно локально утилитой «lnav»12) или через web с помощью LogAnalyzer.


Дисклеймер

  • Использование материалов данной базы знаний разрешено на условиях лицензии, указанной внизу каждой страницы! При использовании материалов активная гиперссылка на соответствующую страницу данной базы знаний обязательна!
  • Автор не несет и не может нести какую либо ответственность за последствия использования материалов, размещенных в данной базе знаний. Все материалы предоставляются по принципу «как есть». Используйте их исключительно на свой страх и риск.
  • Все высказывания, мысли или идеи автора, размещенные в материалах данной базе знаний, являются исключительно его личным субъективным мнением и могут не совпадать с мнением читателей!
  • При размещении ссылок в данной базе знаний на интернет-страницы третьих лиц автор не несет ответственности за их техническую функциональность (особенно отсутствие вирусов) и содержание! При обнаружении таких ссылок, можно и желательно сообщить о них в комментариях к соответствующей статье.
1)
Конечно, скрипты нам в помощь, но это не торт.
2)
Могли бы уже добавить IETF-syslog!
3)
Вообще, настроек более, чем много и все они описаны в официальной документации.
4)
Если в ответ тишина, значит ошибок нет.
5)
Можно изменить их в файле «syslog-ng.conf», но зачем?
6)
Не рекомендуется! Вместо этого лучше использовать use-dns( persist_only ); и dns-cache-hosts( «/etc/hosts» ); со статическим списком адресов.
7)
Поэтому используется драйвер «network()», т.к. «syslog()» предназначен для новой версии IETF-standard syslog protocol, а «tcp()» и «udp()» являются устаревшими.
8)
Вообще, немного не правильная реализация, т.к. она лишена гибкости – лучше использовать конструкцию junction { channel { }; channel { }; };, как в этом примере, но до нее я пока не добрался.
9)
В теле и так все нормально работает.
10)
Вот эта статейка навела на мысль, как это правильно сделать…
11)
Которая заставляет syslog-ng перечитать конфигурацию и самостоятельно создать пустой файл.
12)
Которая доступна в одном из репозиториев apt, т.е. устанавливается командой sudo apt install lnav.

Обсуждение

Ваш комментарий:
J P X M S E X H P R Y D F M W W
 
Последнее изменение: 2023/08/03 10:33 — Николай Солошин