Данные будем брать с файла Лога БД через SQLite
СКАЧАТЬ Подробности описание данного шаблона ниже.
В начале рассмотрим готовые варианты.
github Grifagor zabbix-openvpn
serveradmin Мониторинг openvpn подключений пользователей в zabbix
github furlongm openvpn-monitor
openvpn_thevpncompany
В предыдущих версиях OpenVPN данные писались в Лог
OpenVPN получаем данные: Подключение, Статус, Скорость Передача/Прием
Код: Выделить всё
# Лог с данными варианты пути:
openvpnlog="/tmp/openvpn-status.log"
openvpnlog="/var/log/openvpn/status-users-udp.log"
openvpnlog="/var/etc/openvpn/openvpn-status.log"
openvpnlog="ваш путь"
# Статус
cat "${openvpnlog}" | grep $1, >/dev/null && echo 1 || echo 0
# Номер подключения
cat "${openvpnlog}"| sed -n '/Connected Since/,/ROUTING/p' | sed -e '1d' -e '$d' | wc -l
# Полученные байты
if [ "`grep -c $1, "${openvpnlog}"`" != "0" ]; then cat "${openvpnlog}"| grep $1, | tr "," "\n" | sed -n '3p' ; else echo "0" ; fi
# Отправленные байты
if [ "`grep -c $1, "${openvpnlog}"`" != "0" ]; then "${openvpnlog}"| grep $1, | tr "," "\n" | sed -n '4p' ; else echo "0" ; fi
# (Byte_Received,Byte_Sent) будут располагаться не на 3-й и 4-й строке, как в примере, а на 6 и 7
# Полученные байты
if [ "`grep -c $1, "${openvpnlog}"`" != "0" ]; then cat "${openvpnlog}"| grep $1, | tr "," "\n" | sed -n '6p' ; else echo "0" ; fi
# Отправленные байты
if [ "`grep -c $1, "${openvpnlog}"`" != "0" ]; then cat "${openvpnlog}"| grep $1, | tr "," "\n" | sed -n '7p' ; else echo "0" ; fi
В новой версии путь /var/log/openvpnas.log - текущий лог, /var/log/openvpnas.log.1 , /var/log/openvpnas.log.2 и так далее.
/var/log/openvpnas.node.log (в случае настройки аварийного переключения)
Формат лога изменился
Как прочитать Лог варианты ключи заббикс
vfs.file.contents[файл,<кодировка>] - Большие файлы нечитает
log[файл,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<вывод>,<максзадержка>,<опции>,<постоянное_хранилище>] - активная проверка
logrt[файл_регулярное выражение,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<вывод>,<максзадержка>,<опции>,<постоянное_хранилище>] - активная проверка
Содержимое файла
Код: Выделить всё
zabbix_get -s 192.168.XXX.XXX -p 10050 -k system.run["cat /var/log/openvpnas.log"]
zabbix_get -s 192.168.XXX.XXX -p 10050 -k vfs.file.contents["/var/log/openvpnas.log"]
zabbix_get -s 192.168.XXX.XXX -p 10050 -k system.run["cat /var/log/openvpnas.log |grep '2022-10-24'| grep -i 'ФИО'"]
Что бы выбрать нужные строки из лога нужно знать для какого подключения какого пользователя, их нам нужно обнаружить.
Есть несколько вариантов обнаружения всех клиентов/пользователей подключенных и отключенных которые есть в OpenVPN.
discover Обнаружение динамический список пользователей (SED):
Connection Initiated
Peer Connection Initiated with
Одноранговое соединение, инициированное с
Код: Выделить всё
cat /var/etc/openvpn/openvpn-status.log | sed -n '/Connected Since/,/ROUTING/p' | sed 's/,.*//' | sed 's/^/,{"{#VPNUSER}":"/' | sed 's/$/"}/' | sed -e '1d' -e '$d' | sed -e '1s/^/{"data"\:[/' -e '$s/$/]}/'
0,15,30,45 * * * * /usr/bin/find /tmp/openvpn-status.log||/bin/ln /var/etc/openvpn/openvpn-status.log /tmp/openvpn-status.log&&/bin/chmod 755 /tmp/openvpn-status.log
И получаем
Код: Выделить всё
cat /tmp/openvpn-status.log| sed -n '/Connected Since/,/ROUTING/p' | sed 's/,.*//' | sed 's/^/,{"{#VPNUSER}":"/' | sed 's/$/"}/' | sed -e '1d' -e '$d' | sed -e '1s/^/{"data"\:[/' -e '$s/$/]}/'
Первый способ обнаружения пользователей из ccd
"Минус один и весьма существенный - добавление итемов в виде отдельных пользователей работает через автообнаружение конфигураций пользователей в директории с ccd.
Для того, чтобы приведенный способ мониторинга openvpn подключений работал, у вас должны существовать индивидуальные конфигурации пользователей, заданные в конфиге openvpn параметром client-config-dir , конфиг может быть пустым нужны только для получения имени пользователя"
Массив имен пользователей, директория (сертификатов) для ccd файлов следующая -
Код: Выделить всё
ls -F /etc/openvpn/ccd-users-udp
Код: Выделить всё
ls -F /etc/openvpn/ccd
Код: Выделить всё
#!/bin/bash
path=/etc/openvpn/ccd-users-udp # путь к каталогу сертификатов
#path=/etc/openvpn/ccd # путь к каталогу сертификатов
users=`ls -F $path | sed 's/\///g'` # массив имен пользователей
echo "{"
echo "\"data\":["
comma=""
for user in $users
do
echo " $comma{\"{#VPNUSER}\":\"$user\"}"
comma=","
done
echo "]"
echo "}"
Другие способы Обнаружения с помощью ifconfig-pool-persist
Код: Выделить всё
#!/bin/bash
path=/etc/openvpn/ipp.txt # путь к файлу ifconfig-pool-persist
echo "{"
echo "\"data\":["
comma=""
while read line ; do
IFS=","
set -- $line
user=$1
echo " $comma{\"{#VPNUSER}\":\"$user\"}"
comma=","
done < $path
echo "]"
echo "}"
Еще способ Обнаружения файл index.txt
/etc/zabbix/scripts/index.txt
users=`grep "V" /etc/zabbix/scripts/index.txt | grep -v "vm-vpn-1" | cut -d= -f7 | cut -d\/ -f1`
Нашёл иное решение проблемы автообнаружения пользователей без использования ccd.
При генерации сертификата вместе с ключами меняется файл index.txt (я использовал пакет easy-rsa из репозиториев).
В файле упоминаются все выпущенные сертификаты.
В начале строки с действующим сертификатом стоит буква V, показывающая, как я понял, что сертификат валиден.
Осталось в скрипте автообнаружения прописать что-то вроде "users=`grep "V" /etc/zabbix/scripts/index.txt | grep -v "vm-vpn-1" | cut -d= -f7 | cut -d\/ -f1`" и список текущих пользователей готов.
Файл index.txt надо после каждой генерации скрипта переносить в папку со скриптами заббикса, например, потому что нечего OpenVPN-серверу глядеть куда не надо
Можно сделать по другому: в файле конфигурации openvpn использовать опцию "client-connect" - данная опция вызывает внешний скрипт при подключении к серверу кого-либо.
А в этом скрипте уже прописываем всё, что душе угодно, к примеру оповещение на почту или запись в бд.
С помощью следующих переменных получаем доп. информацию: ${common_name}, ${HOSTNAME}, ${untrusted_ip}, ${ifconfig_pool_remote_ip}
github furlongm openvpn-monitor
Файлы конфигурации:
В версиях сервера доступа перед выпуском 2.6.1:
Глобальная конфигурация сервера: /usr/local/openvpn_as/etc/db/config.db
Сертификаты сервера и клиента: /usr/local/openvpn_as/etc/db/certs.db
Свойства пользователя и группы: /usr/local/openvpn_as/etc/db/userprop.db
Журнал/Лог Базы данных: /usr/local/openvpn_as/etc/db/log.db
Настройки отладки и низкого уровня: /usr/local/openvpn_as/etc/as.conf
Они были добавлены с сервера доступа 2.6.1:
Конфигурация узла локального сервера: /usr/local/openvpn_as/etc/db/config_local.db
Конфигурация кластера: /usr/local/openvpn_as/etc/db/cluster.db
Конфигурация кластера ДБ: /usr/local/openvpn_as/etc/db/clusterdb.db
Кластерная система уведомлений: /usr/local/openvpn_as/etc/db/notification.db
По умолчанию теперь данные у нас: Веб-интерфейс администратора. Состояние > Отчеты журнала
Что бы включить вывод в Лог необходимо указать в конфигурации следующее.
В файле конфигурации
Код: Выделить всё
nano /usr/local/openvpn_as/etc/as.conf
SYSLOG=1
# Задать размер лога 1МБ
LOG_ROTATE_LENGTH=1000000
# Лицензирование когда возникают проблемы с доступом к серверу активации лицензии.
DEBUG_AWSINFO=1
# Hегистрирует информацию всякий раз, когда изменяется кол-во внутренних подключенных в данный момент пользователей.
LOG_N_CLIENTS_CHANGE=1
# Алгоритмы сжатия для подключения клиентов
FAVOR_LZO=1
# Регистрирует все изменения параметров конфигурации, регистрируя все действия между сервером доступа и базами данных конфигурации
API_TRACE_SA=1
# Регистрирует все, что входит в базу данных журналов: сведения о входах пользователей в систему и использовании полосы пропускания
DEBUG_LOGDB=1
# регистрирует вызовы API XML
LOG_DB_XML_API_VERBOSE=1
# также сбрасывается в openvpnas.log или syslog, если функция syslog включена.
API_TRACE_SA=1
# Dключает подробное ведение журнала службы отладки. связь между сервером доступа и системой отслеживания добавляется в журнал.
DEBUG_SUBSCRIPTION=2
Код: Выделить всё
service openvpnas restart
SHELL=/bin/bash
# каждую ночь удаляет файлы с именем /var/log/openvpnas.log.15 и выше (до .1000)
0 4 * * * /bin/rm /var/log/openvpnas.log.{15..1000} >/dev/null 2>&1
DEBUG_LOGDB=1
Этот флаг регистрирует все, что входит в базу данных журналов.
Сервер доступа предоставляет сведения о входах пользователей в систему и использовании полосы пропускания
на странице « Отчеты журнала» в веб-интерфейсе администратора.
Эта информация хранится в файле базы данных log.db отдельно от файлов журналов.
Причина этого в том, что файлы журналов помогают отслеживать и решать проблемы с самой программой сервера доступа,
а не отслеживать действия пользователя, такие как вход в систему и использование данных.
Однако используйте этот флаг, если хотите записывать все в лог-файлы.
Оф. манул Лога
Переходим к новому формату запроса из log.db
Узнать формат
Код: Выделить всё
file /usr/local/openvpn_as/etc/db/log.db
/usr/local/openvpn_as/etc/db/log.db: SQLite 3.x database
Установка
Код: Выделить всё
apt-get install sqlite3 libsqlite3-dev
Таблица: log
Столбцы:
session_id Идентификатор сеанса
node Узел
username имя пользователя
common_name Общее имя
start_time Время начала
duration Продолжительность
service Служба
api_method Метод api
active Активный
auth Авторизация
real_ip Реальный ip
vpn ip ВПН ip
proto Протокол
port Порт
bytes_in Полученые Байты
bytes_out Отправленные байты
bytes_total Общее кол-во байтов
error Ошибки
extra Дополнительная
timestamp временная метка
Команды sqlite3
Показать
.show Показывает текущие настройки заданных параметров
.help - подсказка со списком всех метакоманд
.exit или .quit - выход из сессии sqlite3
.databases - показывает присоединенные БД, название баз данных и файлов
.tables - показывает доступные таблицы, текущие таблицы
.schema Отражает структуру таблицы
.header Отобразить или скрыть шапку таблицы
.mode Выбор режима отображения данных таблицы
.dump Сделать копию базы данных в текстовом формате
и другие
данных DDL:
CREATE
ALTER
DROP
данными DML:
INSERT
UPDATE
DELETE
запросов DQL:
SELECT
.archive ... Управление архивами SQL
.auth ON|OFF Показывать обратные вызовы авторизатора
.backup ?DB? FILE Резервное копирование базы данных (по умолчанию "main") в файл
.bail on|off Остановитесь после нажатия на ошибку. По умолчанию ВЫКЛЮЧЕНО
.binary on|off Включите или выключите двоичный вывод. По умолчанию ВЫКЛЮЧЕНО
.cd DIRECTORY Измените рабочий каталог на КАТАЛОГ
.changes on|off Показать количество строк, измененных SQL
.check GLOB Сбой, если вывод с .testcase не соответствует
.clone NEWDB Клонирование данных в NEWDB из существующей базы данных
.databases Список имен и файлов подключенных баз данных
.dbconfig ?op? ?val? Перечислите или измените параметры sqlite3_db_config()
.dbinfo ?DB? Отображение информации о состоянии базы данных
.dump ?TABLE? Отображение содержимого базы данных в виде SQL
.echo on|off Включение или выключение командного эха
.eqp on|off|full|... Включить или отключить автоматическое ОБЪЯСНЕНИЕ ПЛАНА ЗАПРОСА
.excel Отображение выходных данных следующей команды в электронной таблице
.exit ?CODE? Выйдите из этой программы с помощью кода возврата
.expert экспериментальный. Предложите индексы для запросов
.explain ?on|off|auto? Измените режим форматирования ОБЪЯСНЕНИЯ. По умолчанию: авто
.filectrl CMD ... Выполнение различных операций sqlite3_file_control()
.fullschema ?--indent? Показать схему и содержимое таблиц sqlite_stat
.headers on|off Включение или выключение отображения заголовков
.help ?-all? ?PATTERN? Показать текст справки для ШАБЛОНА
.import FILE TABLE Импорт данных из ФАЙЛА в ТАБЛИЦУ
.imposter INDEX TABLE Создать таблицу самозванца ТАБЛИЦА на основе индекса INDEX
.indexes ?TABLE? Показывать имена индексов
.limit ?LIMIT? ?VAL? Отображение или изменение значения SQLITE_LIMIT
.lint OPTIONS Сообщайте о потенциальных проблемах со схемой.
.load FILE ?ENTRY? Загрузите библиотеку расширений
.log FILE|off Включите или выключите вход в систему. ФАЙЛ может быть stderr/stdout
.mode MODE ?TABLE? Установите режим вывода
.nullvalue STRING Используйте строку вместо нулевых значений
.once ?OPTIONS? ?FILE? Вывод для следующей команды SQL только в ФАЙЛ
.open ?OPTIONS? ?FILE? Закройте существующую базу данных и снова откройте ФАЙЛ
.output ?FILE? Отправить выходные данные в ФАЙЛ или stdout, если ФАЙЛ опущен
.parameter CMD ... Управление привязками параметров SQL
.print STRING... Вывести литеральную СТРОКУ
.progress N Вызывайте обработчик выполнения после каждых N кодов операций
.prompt MAIN CONTINUE Замените стандартные подсказки
.quit Выйдите из этой программы
.read FILE Считывание входных данных из ФАЙЛА
.recover Восстановите как можно больше данных из поврежденной базы данных.
.restore ?DB? FILE Восстановить содержимое базы данных (по умолчанию "main") из ФАЙЛА
.save FILE Запись базы данных в памяти в ФАЙЛ
.scanstats on|off Включение или выключение метрик sqlite3_stmt_scanstatus()
.schema ?PATTERN? Показать шаблон сопоставления инструкций CREATE statements
.selftest ?OPTIONS? Запускайте тесты, определенные в таблице SELFTEST
.separator COL ?ROW? Измените разделители столбцов и строк
.sha3sum ... Вычисление хэша SHA3 содержимого базы данных
.shell CMD ARGS... Запустите CMD ARGS... в системной оболочке
.show Отображение текущих значений для различных настроек
.stats ?on|off? Показывать статистику или включать или выключать статистику
.system CMD ARGS... Запустите CMD ARGS... в системной оболочке
.tables ?TABLE? Список имен таблиц, совпадающих с таблицей шаблонов
.testcase NAME Начните перенаправлять вывод на 'testcase-out.txt '
.testctrl CMD ... Выполняйте различные операции sqlite3_test_control()
.timeout MS Попробуйте открыть заблокированные таблицы в течение МС миллисекунд
.timer on|off Включение или выключение таймера SQL
.trace ?OPTIONS? Выводите каждую инструкцию SQL по мере ее выполнения
.vfsinfo ?AUX? Информация о VFS верхнего уровня
.vfslist Перечислите все доступные VFSE
.vfsname ?AUX? Выведите имя стека VFS
.width NUM1 NUM2 ... Установите минимальную ширину столбцов для столбчатого вывода
.help - подсказка со списком всех метакоманд
.exit или .quit - выход из сессии sqlite3
.databases - показывает присоединенные БД, название баз данных и файлов
.tables - показывает доступные таблицы, текущие таблицы
.schema Отражает структуру таблицы
.header Отобразить или скрыть шапку таблицы
.mode Выбор режима отображения данных таблицы
.dump Сделать копию базы данных в текстовом формате
и другие
данных DDL:
CREATE
ALTER
DROP
данными DML:
INSERT
UPDATE
DELETE
запросов DQL:
SELECT
.archive ... Управление архивами SQL
.auth ON|OFF Показывать обратные вызовы авторизатора
.backup ?DB? FILE Резервное копирование базы данных (по умолчанию "main") в файл
.bail on|off Остановитесь после нажатия на ошибку. По умолчанию ВЫКЛЮЧЕНО
.binary on|off Включите или выключите двоичный вывод. По умолчанию ВЫКЛЮЧЕНО
.cd DIRECTORY Измените рабочий каталог на КАТАЛОГ
.changes on|off Показать количество строк, измененных SQL
.check GLOB Сбой, если вывод с .testcase не соответствует
.clone NEWDB Клонирование данных в NEWDB из существующей базы данных
.databases Список имен и файлов подключенных баз данных
.dbconfig ?op? ?val? Перечислите или измените параметры sqlite3_db_config()
.dbinfo ?DB? Отображение информации о состоянии базы данных
.dump ?TABLE? Отображение содержимого базы данных в виде SQL
.echo on|off Включение или выключение командного эха
.eqp on|off|full|... Включить или отключить автоматическое ОБЪЯСНЕНИЕ ПЛАНА ЗАПРОСА
.excel Отображение выходных данных следующей команды в электронной таблице
.exit ?CODE? Выйдите из этой программы с помощью кода возврата
.expert экспериментальный. Предложите индексы для запросов
.explain ?on|off|auto? Измените режим форматирования ОБЪЯСНЕНИЯ. По умолчанию: авто
.filectrl CMD ... Выполнение различных операций sqlite3_file_control()
.fullschema ?--indent? Показать схему и содержимое таблиц sqlite_stat
.headers on|off Включение или выключение отображения заголовков
.help ?-all? ?PATTERN? Показать текст справки для ШАБЛОНА
.import FILE TABLE Импорт данных из ФАЙЛА в ТАБЛИЦУ
.imposter INDEX TABLE Создать таблицу самозванца ТАБЛИЦА на основе индекса INDEX
.indexes ?TABLE? Показывать имена индексов
.limit ?LIMIT? ?VAL? Отображение или изменение значения SQLITE_LIMIT
.lint OPTIONS Сообщайте о потенциальных проблемах со схемой.
.load FILE ?ENTRY? Загрузите библиотеку расширений
.log FILE|off Включите или выключите вход в систему. ФАЙЛ может быть stderr/stdout
.mode MODE ?TABLE? Установите режим вывода
.nullvalue STRING Используйте строку вместо нулевых значений
.once ?OPTIONS? ?FILE? Вывод для следующей команды SQL только в ФАЙЛ
.open ?OPTIONS? ?FILE? Закройте существующую базу данных и снова откройте ФАЙЛ
.output ?FILE? Отправить выходные данные в ФАЙЛ или stdout, если ФАЙЛ опущен
.parameter CMD ... Управление привязками параметров SQL
.print STRING... Вывести литеральную СТРОКУ
.progress N Вызывайте обработчик выполнения после каждых N кодов операций
.prompt MAIN CONTINUE Замените стандартные подсказки
.quit Выйдите из этой программы
.read FILE Считывание входных данных из ФАЙЛА
.recover Восстановите как можно больше данных из поврежденной базы данных.
.restore ?DB? FILE Восстановить содержимое базы данных (по умолчанию "main") из ФАЙЛА
.save FILE Запись базы данных в памяти в ФАЙЛ
.scanstats on|off Включение или выключение метрик sqlite3_stmt_scanstatus()
.schema ?PATTERN? Показать шаблон сопоставления инструкций CREATE statements
.selftest ?OPTIONS? Запускайте тесты, определенные в таблице SELFTEST
.separator COL ?ROW? Измените разделители столбцов и строк
.sha3sum ... Вычисление хэша SHA3 содержимого базы данных
.shell CMD ARGS... Запустите CMD ARGS... в системной оболочке
.show Отображение текущих значений для различных настроек
.stats ?on|off? Показывать статистику или включать или выключать статистику
.system CMD ARGS... Запустите CMD ARGS... в системной оболочке
.tables ?TABLE? Список имен таблиц, совпадающих с таблицей шаблонов
.testcase NAME Начните перенаправлять вывод на 'testcase-out.txt '
.testctrl CMD ... Выполняйте различные операции sqlite3_test_control()
.timeout MS Попробуйте открыть заблокированные таблицы в течение МС миллисекунд
.timer on|off Включение или выключение таймера SQL
.trace ?OPTIONS? Выводите каждую инструкцию SQL по мере ее выполнения
.vfsinfo ?AUX? Информация о VFS верхнего уровня
.vfslist Перечислите все доступные VFSE
.vfsname ?AUX? Выведите имя стека VFS
.width NUM1 NUM2 ... Установите минимальную ширину столбцов для столбчатого вывода
sqlite3 db.sqlite 'select * from test_table'
sqlite3 log.db 'select * from log'
sqlite3 log.db 'select username from log'|grep MamzikovAA выбор столбца username
sqlite3 log.db 'select username from log group by username;' - объединяем одинаковые логины
или
echo 'select * from test_table;'| sqlite3 asd.sqlite
Еще экспериментируем с запросами
#DATAUSER=`zabbix_get -s $IP -p $PORT -k system.run["sqlite3 /usr/local/openvpn_as/etc/db/log.db 'select * from log where username="MamzikovAA";'"]`
#DATAUSER=`sqlite3 /usr/local/openvpn_as/etc/db/log.db 'select * from log where username="MamzikovAA";'`
DATAUSER=`sqlite3 /usr/local/openvpn_as/etc/db/log.db 'select * from log WHERE 'username' in ("MamzikovAA");'`
select *, MAX(`start_time`) from log WHERE username="MamzikovAA"
select *, DATETIME(MAX('start_time'), 'unixepoch') from log WHERE username="MamzikovAA"
select *, DATETIME(ROUND(MAX(start_time)), 'unixepoch') from log WHERE username="MamzikovAA"
select session_id,node,username,common_name,datetime(round(max(start_time)),'unixepoch') as start_time,duration,service,api_method,active,auth,real_ip,vpn_ip,proto,port,bytes_in,bytes_out,bytes_total,error,extra,datetime(round(timestamp),'unixepoch') as timestamp from log where username="MamzikovAA"
select *,datetime(round(max(start_time)),'unixepoch') as start_time2,datetime(round(timestamp),'unixepoch') as timestamp2 from log where username="MamzikovAA"
SELECT DATE(ROUND(start_time), 'unixepoch') FROM log
SELECT DATETIME(ROUND(start_time), 'unixepoch') FROM log
SELECT DATETIME(ROUND(start_time), 'unixepoch') AS isodate FROM log
Скрипт в процессе openvpnlld.sh
Код: Выделить всё
#!/bin/bash
# https://diyit.ru/viewtopic.php?t=2010
# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
PORT=${2:-10050}
BLOCSCRIPT=$3
PUTLOGDB=${4:-/usr/local/openvpn_as/etc/db/log.db}
USERNAMEOPENVPN=$5
# Запрашиваем всех пользователей из базы OpenVPN и объединяем одинаковых
# Пример для теста ./openvpnlld.sh "192.168.xxx.xxx" "10050" "discoveryopenvpnuser" "/usr/local/openvpn_as/etc/db/log.db"
if [[ $BLOCSCRIPT = "discoveryopenvpnuser" ]]
then
VPNUSER=`zabbix_get -s $IP -p $PORT -k system.run["sqlite3 "${PUTLOGDB}" 'select username from log group by username;'"]`
# Если имя досенное через / нужно его экранировать сделать несколько
VPNUSER="${VPNUSER//\\/\\\\\\\\}"
#Списко пользователей | подставить макрос| закрытие скобки| удаление табуляции и переноса строк| удаление последней запятой| Сделаем читаемый вид
JSONUSER=`echo "${VPNUSER}"| sed 's/^/\t{\"{#VPNUSER}\":\"/'| sed 's/$/\"},/'| tr -d '\t\n'| sed 's/,\+$//'| sed 's/\.*"},/"},\n/g'`
# Формируем Вывод
JSON="[\n""${JSONUSER}""\n]"
echo -e "${JSON}"
fi
# Запрашиваем все данные для конкретного пользователя и разбираем на элементы
# Пример для теста ./openvpnlld.sh "192.168.xxx.xxx" "10050" "uservpn" "/usr/local/openvpn_as/etc/db/log.db" "MamzikovAA"
if [[ $BLOCSCRIPT = "uservpn" ]]
then
# Выбрать все записи из таблицы с данным пользователем
#sqlite3 "${PUTLOGDB}" 'select * from log where username="${USERNAMEOPENVPN}";'
#sqlite3 "${PUTLOGDB}" 'select * from log where 'username' in ("${USERNAMEOPENVPN}");'
# Выбрать запись с максимальным временем для данного пользователя
#sqlite3 "${PUTLOGDB}" 'select *, max(`start_time`) from log where username="${USERNAMEOPENVPN}";'
# Выбрать запись с максимальным временем для данного пользователя и преобразовать дату в читаемую
#sqlite3 "${PUTLOGDB}" 'select *, datetime(max('start_time'), "unixepoch") from log where username="${USERNAMEOPENVPN}";'
#sqlite3 "${PUTLOGDB}" 'select *, datetime(round(max(start_time)),"unixepoch") from log where username="${USERNAMEOPENVPN}";'
# Вывести все, последний доп столбец читаемая дата
#sqlite3 "${PUTLOGDB}" 'select date(round(start_time), "unixepoch") from log;'
#sqlite3 "${PUTLOGDB}" 'select datetime(round(start_time), "unixepoch") from log;'
# Вывести все, последний доп столбец имя isodate, читаемая дата
#sqlite3 "${PUTLOGDB}" 'select datetime(round(start_time), "unixepoch") as isodate from log;'
# Выбрать все столбцы, переименовать и преобразовать нужные, с максимальным временем для данного пользователя
#sqlite3 "${PUTLOGDB}" 'select session_id,node,username,common_name,datetime(round(max(start_time)),"unixepoch") as start_time,duration,service,api_method,active,auth,real_ip,vpn_ip,proto,port,bytes_in,bytes_out,bytes_total,error,extra,datetime(round(timestamp),"unixepoch") as timestamp from log where username="${USERNAMEOPENVPN}";'
# Преобразуем дату и выводим как 2 доп столбца, с максимальным временем для данного пользователя
#sqlite3 "${PUTLOGDB}" 'select *,datetime(round(max(start_time)),"unixepoch") as start_time2,datetime(round(timestamp),"unixepoch") as timestamp2 from log where username="${USERNAMEOPENVPN}";'
# Для раскрытия переменой имени
ZAPROS=`echo "'select *,datetime(round(max(start_time)),\"unixepoch\") as start_time2,datetime(round(timestamp),\"unixepoch\") as timestamp2 from log where username=\"${USERNAMEOPENVPN}\";'"`
#echo "${ZAPROS}"
# Выполняем запрос
DATAUSER=`zabbix_get -s $IP -p $PORT -k system.run["sqlite3 "${PUTLOGDB}" "${ZAPROS}""]`
# Разбираем столбцы
sessionid=`echo $DATAUSER|awk -F\| '{print $1}'`
node=`echo $DATAUSER|awk -F\| '{print $2}'`
username=`echo $DATAUSER|awk -F\| '{print $3}'`
commonname=`echo $DATAUSER|awk -F\| '{print $4}'`
starttime=`echo $DATAUSER|awk -F\| '{print $5}'`
starttime2=`echo $DATAUSER|awk -F\| '{print $21}'`
duration=`echo $DATAUSER|awk -F\| '{print $6}'`
service=`echo $DATAUSER|awk -F\| '{print $7}'`
apimethod=`echo $DATAUSER|awk -F\| '{print $8}'`
active=`echo $DATAUSER|awk -F\| '{print $9}'`
auth=`echo $DATAUSER|awk -F\| '{print $10}'`
realip=`echo $DATAUSER|awk -F\| '{print $11}'`
vpnip=`echo $DATAUSER|awk -F\| '{print $12}'`
proto=`echo $DATAUSER|awk -F\| '{print $13}'`
port=`echo $DATAUSER|awk -F\| '{print $14}'`
bytesin=`echo $DATAUSER|awk -F\| '{print $15}'`
bytesout=`echo $DATAUSER|awk -F\| '{print $16}'`
bytestotal=`echo $DATAUSER|awk -F\| '{print $17}'`
error=`echo $DATAUSER|awk -F\| '{print $18}'`
extra=`echo $DATAUSER|awk -F\| '{print $19}'`
timestamp=`echo $DATAUSER|awk -F\| '{print $20}'|sed 's/ .*//'`
timestamp2=`echo $DATAUSER|awk -F\| '{print $22}'|sed 's/ .*//'`
# Вывод результата
echo "Идентификатор сеанса-session_id:"${sessionid}"
Узел-----------------------node:"${node}"
Имя пользователя-------username:"${username}"
Общее имя-----------common_name:"${commonname}"
Время начала---------start_time:"${starttime2}" unix:"${starttime}"
Продолжительность------duration:"${duration}"
Служба------------------service:"${service}"
Метод api------------api_method:"${apimethod}"
Активный-----------------active:"${active}"
Авторизация----------------auth:"${auth}"
Реальный ip-------------real_ip:"${realip}"
ВПН ip-------------------vpn_ip:"${vpnip}"
Протокол------------------proto:"${proto}"
Порт-----------------------port:"${port}"
Полученые Байты--------bytes_in:"${bytesin}"
Отправленные Байты----bytes_out:"${bytesout}"
Общее кол-во Байтов-bytes_total:"${bytestotal}"
Ошибки--------------------error:"${error}"
Дополнительная------------extra:"${extra}"
Временная метка-------timestamp:"${timestamp2}" unix:"${timestamp}""
fi
Количество трафика за все время
select SUM(duration),SUM(bytes_in),SUM(bytes_out),SUM(bytes_total) from log where username="MamzikovAA";
+ Примерное кол-во подключений авторизаций
select SUM(duration),SUM(bytes_in),SUM(bytes_out),SUM(bytes_total),SUM(auth) from log where username="MamzikovAA";
Шаблон OpenVPN-LLD Макросы
{$HOST.PORTS} 10050
{$PUTLOGDB} /usr/local/openvpn_as/etc/db/log.db
Группы элементов данных OpenVPN
Правила обнаружения Обнаружение Пользователей OpenVPN Прототипы элементов данных 34 Прототипы триггеров 1 Прототипы графиков 3 Прототипы узлов сети openvpnlld.sh[{HOST.CONN},{$HOST.PORTS},discoveryopenvpnuser,{$PUTLOGDB}] 1h Внешняя проверка Активировано
Прототипы элементов данных Общая последняя информация о пользователе {#VPNUSER}: Активный active для {#VPNUSER} active[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Метод api_method для {#VPNUSER} api_method[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Суммарная информация о пользователе {#VPNUSER}: Кол-во Авторизаций За все время для {#VPNUSER} authTotal[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Авторизация auth для {#VPNUSER} auth[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Суммарная информация о пользователе {#VPNUSER}: Трафик Входящий За все время для {#VPNUSER} bytes_inTotal[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Трафик Входящий текущей сессии для {#VPNUSER} bytes_inT[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Скорость Входящая для {#VPNUSER} bytes_in[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Суммарная информация о пользователе {#VPNUSER}: Трафик Исходящий За все время для {#VPNUSER} bytes_outTotal[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Трафик Исходящий текущей сессии для {#VPNUSER} bytes_outT[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Скорость Исходящая для {#VPNUSER} bytes_out[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Суммарная информация о пользователе {#VPNUSER}: Трафик Суммарный За все время для {#VPNUSER} bytes_totalTotal[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Трафик Суммарный за текущую сессию для {#VPNUSER} bytes_totalT[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Скорость Суммарная для {#VPNUSER} bytes_total[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Общее имя common_name {#VPNUSER} common_name[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Суммарная информация о пользователе {#VPNUSER}: За все время подключения {#VPNUSER} durationTotal[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Продолжительность duration для {#VPNUSER} duration[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Ошибки error для {#VPNUSER} error[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Дополнительная extra для {#VPNUSER} extra[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Узел node для {#VPNUSER} node[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER} openvpnlld.sh[{HOST.CONN},{$HOST.PORTS},uservpn,{$PUTLOGDB},{#VPNUSER}] 10m 90d Внешняя проверка OpenVPN Нет
Общая последняя информация о пользователе {#VPNUSER}: Порт port для {#VPNUSER} port[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Протокол proto для {#VPNUSER} proto[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Реальный ip real_ip для {#VPNUSER} real_ip[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Служба service для {#VPNUSER} service[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Идентификатор сеанса session_id для {#VPNUSER} session_id[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Время начала start_time2 для {#VPNUSER} start_time2[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Время начала start_time для {#VPNUSER} start_time[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Строки с пользователем {#VPNUSER} из openvpnas.log system.run["cat /var/log/openvpnas.log | grep -i '{#VPNUSER}'"] 10m 90d Zabbix агент OpenVPN Нет
Общая последняя информация о пользователе {#VPNUSER} system.run["sqlite3 {$PUTLOGDB} 'select *,datetime(round(max(start_time)),\"unixepoch\") as start_time2,datetime(round(timestamp),\"unixepoch\") as timestamp2 from log where username=\"{#VPNUSER}\"'"] 10m 90d Zabbix агент OpenVPN Да
Суммарная информация о пользователе {#VPNUSER} system.run["sqlite3 {$PUTLOGDB} 'select SUM(duration),SUM(bytes_in),SUM(bytes_out),SUM(bytes_total),SUM(auth) from log where username=\"{#VPNUSER}\"'"] 4h 90d Zabbix агент OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Временная метка timestamp2 для {#VPNUSER} timestamp2[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Временная метка timestamp для {#VPNUSER} timestamp[{#VPNUSER}] 90d 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: Имя пользователя username {#VPNUSER} username[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Общая последняя информация о пользователе {#VPNUSER}: ВПН ip vpn_ip для {#VPNUSER} vpn_ip[{#VPNUSER}] 90d Зависимый элемент данных OpenVPN Да
Прототипы триггеров Информационная OpenVPN Подключен {#VPNUSER} {OpenVPN-LLD:active[{#VPNUSER}].last()}=1 Нет
Прототипы графиков Трафик текущей Сессии {#VPNUSER} 900 200 Нормальный
Трафик за все время {#VPNUSER} 900 200 Нормальный
Скорость передачи данных {#VPNUSER} 900 200 Нормальный