[Из песочницы] Удобный просмотр syslog журнала межсетевого экрана D-Link DFL-860E c помощью скрипта на PHP

В межсетевых экранах D-Link DFL есть несколько минусов в средстве просмотра журнала событий с помощью веб-интерфейса: — большой поток данных переполняет отображаемый журнал событий и просмотреть логи обычно возможно только за маленький промежуток времени (несколько дней, чаще только за 1 день); — чтобы посмотреть журнал нужно зайти в веб-панель маршрутизатора (ввести пароль и логин), выбрать статус и отображение журнала. Не имея доступа к веб-панели (не являясь админом устройства) посмотреть логи невозможно, а бывает нужно дать доступ на просмотр логов человеку, которому пароль и логин к устройству давать не нужно; — в журнале логи разбиваются на маленькие странички, и если журнал большой перелистывать такие странички становится утомительно.В DFL можно отправлять логи на syslog сервер, который будет писать журнал в файл, правда читать потом такой файл очень неудобно из-за его большого размера и неудобного поиска.

Для тех у кого есть возможность использовать web сервер, выполняющий скрипты на php можно просматривать журнал с помощью небольшого скрипта:

################## #SETTINGS //Путь до лога $default_log = »/mnt/WD1600BEVT/SYSLOG/syslog-dfl.log»; // Максимум категорий $default_limit = 200; #END SETTINGS ##################

if (isset ($_GET[«limit»])) $end = $_GET[«limit»]; else $end = $default_limit;

if (isset ($_GET[«logfilename»])) $logfilename = $_GET[«logfilename»]; else $logfilename = $default_log;

if (isset ($_GET[«queue»])) $ndqueueid = $_GET[«queue»]; if (isset ($_GET[«ndsearchred»])) $ndsearchred = $_GET[«ndsearchred»]; if (isset ($_GET[«status»])) $ndstatus = $_GET[«status»];

//Лимитируем кол-во итераций если нужно вывести все записи $readlimit = false; if ($ndstatus!==«errors» && $ndsearchred==») $readlimit = true;

$first=true;

//Временные ограничения $monthfrom = date («m»); $monthto = date («m»); $dayfrom = date («d»); $dayto = date («d»); $ndtimefrom = mktime (0,0,0); $ndtimeto = time ();

//Указан ли месяц if (isset ($_GET[«monthfrom»])) $monthfrom = $_GET[«monthfrom»]; if (isset ($_GET[«monthto»])) $monthto = $_GET[«monthto»];

//Указана ли дата if (isset ($_GET[«dayfrom»])) $dayfrom = $_GET[«dayfrom»]; if (isset ($_GET[«dayto»])) $dayto = $_GET[«dayto»];

//Сгенерируем unixtime для периода сортировки if (isset ($_GET[«timefrom»])) { if (strlen ($_GET[«timefrom»])>0) $ndtimefrom = mktime ($_GET[«timefrom»],0,0,$_GET[«monthfrom»],$_GET[«dayfrom»]); }

if (isset ($_GET[«timeto»])) { if (strlen ($_GET[«timeto»])>0) $ndtimeto = mktime ($_GET[«timeto»],0,0,$_GET[«monthto»],$_GET[«dayto»]); } elseif (isset ($_GET[«monthto»])) { if (strlen ($_GET[«monthto»])>0) $ndtimeto = mktime (23,59,59,$_GET[«monthto»],$_GET[«dayto»]); }

?>

Анализатор syslog файлов D-Link DFL-860e или аналогов

Анализатор syslog файлов D-Link DFL-860e или аналогов

Укажите имя и расположение syslog файла :
полный путь к log файлу
Выберите какую показать категорию в журнале:
Введите что нужно найти.
CONN PPTP ALG …
Введите дату День/Месяц (от до) :
по умолчанию текущая дата
» size=»3» /> - » size=»3» />
Найти в журнале данный текст :
текст для поиска и выделения цветом

$ndtimeto){die («Error: Invalid time period»);}

$filearray = @file ($logfilename); if (!$filearray){die («Error: Can’t open file. Check permissions.»);}

//Отсортируем массив в обратном порядке krsort ($filearray); reset ($filearray); $array = array ();

//Перебираем строчки с конца foreach ($filearray as $string) { //Выбирать только с QUEUEID $regexp = »'.+: ([0–9_A-Z]*): (.+)$'»; //Поиск по QUEUEID if (strlen ($ndqueueid)>0){$regexp = »'^(.+): (».$ndqueueid.»[0–9_A-Z]*): (.+)$'»;} //Создание массива if (preg_match ($regexp,$string)) { $time = trim (preg_replace (»'^(\w*)\s*(\d*) (\d\d:\d\d:\d\d).+$'»,»$1 $2 $3»,$string)); $unixtime = strtotime ($time); //По времени if ($unixtime<$ndtimefrom)break; //Чтобы не молотить все строчки if($unixtime>$ndtimeto)continue; $queueid = trim (preg_replace (»'^(.+): ([0–9_A-Z]*): (.+)$'»,»$2»,$string)); $mess = htmlspecialchars (preg_replace (»'(.+)($queueid):(.+)'»,»$3»,$string)); if (! isset ($array[»$queueid»][«message»])) $array[»$queueid»][«message»] =»; $array[»$queueid»][«time»]= $unixtime; $array[»$queueid»][«message»]= $time.$mess.»
».$array[»$queueid»][«message»]; //Время лога if ($first==true){$endperiod = $unixtime; $first=false;} $startperiod = $unixtime; //Лимит не должен быть превышен if ($readlimit){if (count ($array)>=$end){break;}} } }

//Ничего не нашел if (count ($array)==0){die («Ничего с данными условиями не найдено в log файле, измените параметры поиска.»);}

//Отсортируем массив по времени в обратном порядке arsort ($array); reset ($array);

//Статистическая инфа echo »Всего найдено категорий :».count ($array).»
»; echo »Ограничение категорий :».$end.»
»; printf (»Размер log файла: %.2f Kb
», filesize ($logfilename)/1024); echo »Выбранный период времени:».date («d.M H: i»,$startperiod).» — ».date («d.M H: i»,$endperiod).»
»;

//Вывод foreach ($array as $k => $sarray) { $process = «Выбраная категория сообщений при поиске в логе:»; //Поиск что нужно подсветить красным if (strlen ($ndsearchred)>0) { if (! stripos ($array[$k][«message»],$ndsearchred)){continue;} else $array[$k][«message»] = str_ireplace ($ndsearchred,»$ndsearchred»,$array[$k][«message»]); } //Подсветка $array[$k][«message»] = preg_replace (»'srcip='»,»srcip=»,$array[$k][«message»]); $array[$k][«message»] = preg_replace (»'destip'»,»destip»,$array[$k][«message»]); $array[$k][«message»] = preg_replace (»'srcport='»,»srcport=»,$array[$k][«message»]); $array[$k][«message»] = preg_replace (»'destport='»,»destport=»,$array[$k][«message»]); $array[$k][«message»] = preg_replace (»'action=reject'»,»action=reject»,$array[$k][«message»]); $array[$k][«message»] = preg_replace (»'user='»,»user=»,$array[$k][«message»]); $array[$k][«message»] = preg_replace (»'remotegw='»,»remotegw=»,$array[$k][«message»]); $array[$k][«message»] = preg_replace (»'uptime='»,»uptime=»,$array[$k][«message»]);

$start++; echo »

$process ».$k.»
\n»; //Вывод echo $array[$k][«time»].»
».$array[$k][«message»].»
\n»;

echo »

»; if ($start>=$end){break;} }

printf (»», microtime (true)-$starttime); ?> Основа для данного скрипта была взята тут kirsenn.ru/postfix-log-parser-php/ и переделана для работы с syslog файлом, который отдает D-Link DFL-860E. В настройках скрипта нужно указать путь к syslog файлу и ограничение для работы скрипта на максимально число категорий выводимых на экран. При запуске скрипта нужно указать путь (если он есть в настройках не обязательно) и выбрать какую категорию показать (по умолчанию выводит все категории), также возможно выбрать дату и время в журнале и текст для поиска (он будет подсвечен красным в выводимом тексте).

В директории в которой будет находится сам скрипт можно положить файлик help.txt (он дает подсказку по категориям):

1 (ПРИНЯТЬ) Пакеты, принятые для дальнейшей передачи 2 (ALG) События от Application Layer Gateways 3 (ARP) События ARP 4 (BIGPOND) События клиента BigPond 5 (BUFFERS) События, относящиеся к использованию буфера 6 (CONN) События State engine, например, открытие/закрытие соединений 7 (DHCP) События DHCP-клиента 8 (DHCPRELAY) События DHCP relayer 9 (DHCPSERVER) События DHCP-сервера 10 (ОТБРОСИТЬ) Запрещенные пакеты / соединения 11 (ДИНМАРШРУТИЗАЦИЯ) Динамическая маршрутизация 12 (HA) События High Availability 13 (IDP) События предотвращения/обнаружения вторжения 14 (ОБНОВЛЕНИЕIDP) Обновления БД IDP 15 (IP_ОШИБКА) Пакеты, отброшенные из-за ошибок/ошибки в IP-заголовке 16 (IP_ФЛАГ) События, относящиеся к флагам IP-заголовка 17 (IP_OPT) События, относящиеся к опциям IP-заголовка 18 (IPSEC) События IPsec (VPN) 19 (IP_ПУЛ) События IP-пула 20 (FRAG) События фрагментации 21 (FWD) Пакеты, пересылаемые в неизменном виде 22 (GRE) События GRE 23 (NETCON) События Netcon (удаленное упр-е) 24 (OSPF) События OSPF 25 (PPP) События PPP-туннеля 26 (PPPOE) События PPPoE-туннеля 27 (PPTP) События PPTP-туннеля 28 (L2TP) События L2TP-туннеля 29 (SLB) События SLB 30 (SMTPLOG) События SMTPLOG 31 (SNMP) Разрешенный и запрещенный доступ SNMP 32 (SYSTEM) Системные события: запуск, выключение и т.д. 33 (TCP_FLAG) События, относящиеся к флагам заголовка TCP 34 (TCP_OPT) События, относящиеся к опциям заголовка TCP 35 (TIMESYNC) События синхронизации времени межсетевого экрана 36 (ИСПОЛЬЗОВАНИЕ) Отчет об использовании системы: полоса пропускания, соединения… 37 (USERAUTH) События аутентификации пользователей (например, RADIUS) 38 (ZONEDEFENSE) События ZoneDefense 39 (IFACEMON) События мониторинга интерфейса 40 (HWM) События мониторинга аппаратного обеспечения 41 (RFO) События Route fail over 42 (IGMP) События IGMP 44 (TRANSPARENCY) События, относящиеся к Transparent Mode 46 (BLACKLIST) События Черного списка 47 (SSHD) События SSH-сервера 48 (REASSEMBLY) События, относящиесяк сборке данных 49 (SESMGR) События управления сессиями 50 (AVUPDATE) Обновление антивирусных сигнатур 51 (AVSE) События антивирусного сканирования 52 (VFS) События обработки файлов VFS 53 (THRESHOLD) События правил порога 56 (NATPOOL) События, относящиеся к пулам NAT 58 (ANTIVIRUS) События, относящиеся к антивирусу 59 (ANTISPAM) События, относящиеся к антиспаму 60 (RULE) События, переключаемые правилами 70 (IP_PROTO) События проверки IP-протокола Также я туда же закинул файлик NetDefendOS_2.27.03_Log_Reference_Guide.pdf (полное подробное описание всех категорий), которой можно скачать с ftp D-Link ftp.dlink.ru/pub/FireWall/ чтобы можно было быстро подглядеть подсказку если что-то непонятно в логе.

Данный скрипт работает на web сервере lighttpd в системе freebsd 9.2.0.1 (nas4free). Для вывода журнала с DFL в файл нужно настроить syslog сервер чтобы он принимал с DFL информацию и писал ее в файл. Для freebsd настройка как это сделать тут niknav.ru/? p=266В nas4free к сожалению я не нашел демона newsyslog, поэтому очистку раздувшегося журнала я буду делать вручную (хотя размер моего лог файла за пару недель всего около 4 Мбайт, я отключил вывод некоторых ненужным мне событий в лог в DFL).Испытано на DFL-860E c русской прошивкой 2.27.06.10. Думаю для других устройств серии DFL скрипт тоже будет работоспособен, нужно лишь будет добавить (изменить) категории поиска тут:

input type=«text» name=«queue» value=»» size=»12» /> В результате получится примерно такой вывод журнала (на мониторе 1920×1080 переносов строк почти нет, просмотр комфортнее, на меньших разрешениях монитора нужно уменьшать размер шрифта чтобы строки не переносились и было удобнее читать):

image

Надеюсь данный скрипт поможет владельцам DFL в просмотре и анализе логов с устройства. Удачи!

© Habrahabr.ru