Мониторинг пользователей OpenVPN с помощью Zabbix и визуализации в Grafana

от автора

Ты под колпаком.

Ты под колпаком.

Всем привет. Меня зовут Игорь, я Tech Lead команды DevOps-инженеров и активно развиваю направления мониторинга в компании. В продолжение статьи своего коллеги по цеху @EvgenNet хочу познакомить вас с шаблоном для Zabbix и дашбордом в Grafana для визуализации активности пользователей OpenVPN. Возьмите вкусняшек, чайку и присаживайтесь поудобнее.

Предыстория

Далеко в 2019 году появилась потребность смотреть статистику по пользователям не только в реальном времени, но и за определённый промежуток. Есть такой инструмент https://github.com/furlongm/openvpn-monitor, он позволяет в реальном времени смотреть из какой страны подключён пользователь, с какими IP-адресами и какой трафик через него проходит. Как раз в это время мы активно использовали Influx и все бизнес-метрики были именно там. Недолго думая, я решил немного переделать скрипт под вывод метрик в формате Influx для Telegraf-агента и накидать небольшой дашборд для Grafana. Кому интересен скрипт и дашборд — велком в личку.

Вывод скрипта
./openvpn-monitor.py exec,username=user1 local_ip="10.20.30.176",remote_ip="192.168.1.223",bytes_recv=297964i,bytes_sent=2788764i,connected_since="2019-02-22 11:44:38",last_seen="ERROR",total_time="0:29:04" exec,username=user2 local_ip="10.20.40.185",remote_ip="192.168.2.142",bytes_recv=311415i,bytes_sent=2181895i,connected_since="2019-02-22 11:48:09",last_seen="ERROR",total_time="0:25:33" exec,username=user3 local_ip="10.20.50.170",remote_ip="192.168.3.248",bytes_recv=651527i,bytes_sent=11307713i,connected_since="2019-02-22 11:16:13",last_seen="ERROR",total_time="0:57:29"

Конфигурация для Telegraf-агента
[[inputs.exec]]   interval = "1m"   commands = ["python /usr/local/bin/openvpn-monitor.py"]   timeout = "20m"   name_suffix = "_openvpn"   data_format = "influx"   [[outputs.influxdb]]     urls = ["http://influx.example.com:8086"] # required   database = "openvpn" # required   username = "user"   password = "pass"   namepass = ["exec_openvpn*"]     retention_policy = ""   write_consistency = "any"   timeout = "5s"     ## Compress each HTTP request payload using GZIP.   content_encoding = "gzip"

Всё это великолепие работало и радовало своих потребителей до тех пор, пока мы не начали переезжать на новую архитектуру OpenVPN и не стали отказываться от Influx. Теперь необходимо было затащить всё под Zabbix, а @EvgenNetдоблестно вызвался написать скрипт.

Предварительная настройка

Всё, от чего мы пляшем — это ограничения текстовых данных (массив, который мы будем предварительно обрабатывать и создавать метрики на основе прототипов).

Text data limits depend on the database backend. Before storing text values in the database they get truncated to match the database value type limit.

Database

Type of information

Character

Log

Text

MySQL

255 characters

65536 bytes

65536 bytes

PostgreSQL

255 characters

65536 characters

65536 characters

Oracle

255 characters

65536 characters

65536 characters

Так как мы используем PostgreSQL и упираемся в 65 536 символов, то решили разделить сотрудников по их ролям/профилям:

  • Админы;

  • Бизнес;

  • Разработка;

  • Мобилки;

  • Безопасность.

Для сбора данных нам необходимо раскидать UserParameter и скрипт на серверы с OpenVPN:

userparameter_openvpn.conf

UserParameter=discovery.openvpn[*], /usr/bin/openvpn-mon.py $1

Скрипт принимает на вход один аргумент из списка:

  • admin;

  • bs;

  • dev;

  • mobile;

  • sec.

Создание шаблона в Zabbix

Приступаем к созданию самого шаблона, нам необходимо создать мастер-элементы (Items) для каждой пользовательской роли:

Name

Key

Interval

Type of information

Type

Get openvpn admin users

discovery.openvpn[admin]

5m

Text

Zabbix agent

Get openvpn business users

discovery.openvpn[bs]

5m

Text

Zabbix agent

Get openvpn develop users

discovery.openvpn[dev]

5m

Text

Zabbix agent

Get openvpn mobile users

discovery.openvpn[mobile]

5m

Text

Zabbix agent

Get openvpn security users

discovery.openvpn[sec]

5m

Text

Zabbix agent

Items.

Items.

Теперь необходимо создать правила обнаружения (Discovery rules) с зависимыми элементами:

Name

Key

Type

Get openvpn admin users: Discovery admin stats

get.openvpn.admin.stats

Dependent item

Get openvpn business users: Discovery business stats

get.openvpn.business.stats

Dependent item

Get openvpn develop users: Discovery develop stats

get.openvpn.develop.stats

Dependent item

Get openvpn mobile users: Discovery mobile stats

get.openvpn.mobile.stats

Dependent item

Get openvpn security users: Discovery security stats

get.openvpn.security.stats

Dependent item

Discovery rules.

Discovery rules.

Тут остановимся и разберём подробнее на примере Discovery admin stats:

  • Discovery rule

    • Name: Discovery admin stats.

    • Type: Dependent item.

    • Key: get.openvpn.admin.stats.

    • Master item: Get openvpn admin users — выбираем из выпадающего списка элемент, с которым будем работать.

    • Keep lost resources period: 90d.

  • Preprocessing — не используем.

  • LLD Macros (LLD macro : JSONPath) — вытаскиваем в макросы необходимую на в будущем информацию.

    • {#OVPN_CODE} : $..code.first()

    • {#OVPN_ENV} : $..env.first()

    • {#OVPN_USER} : $..user.first()

  • Filters — не используем.

  • Overrides — не используем.

Теперь необходимо создать прототипы элементов (Item prototypes), на их основе будут автоматически создаваться элементы (Items) под каждого нового пользователя. Разберу на примере одного из 9 элементов, а остальные сведу в таблицу:

  • Item prototype

    • Name: OpenVPN bytes received by {#OVPN_USER}.

    • Type: Dependent item.

    • Key: bytes_r.openvpn[{#OVPN_USER},admin].

    • Type of information: Numeric (unsigned).

    • Master item: Get openvpn admin users — выбираем из выпадающего списка элемент, с которым будем работать.

    • Units: B.

  • Tags

    • Application: OpenVPN.

    • Country: {#OVPN_CODE}.

    • Department: {#OVPN_ENV}.

    • User: {#OVPN_USER}.

  • Preprocessing

    • 1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}')].bytes_r.first().

    • 2: Simple change.

Item prototype.

Item prototype.

Список прототипов элементов

Для примера я взял роль/профиль админов:

Name

Key

Type of information

Units

Preprocessing

OpenVPN bytes received by {#OVPN_USER}

bytes_r.openvpn[{#OVPN_USER},admin]

Numeric (unsigned)

B

1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].bytes_r.first()

2: Simple change

OpenVPN bytes sent by {#OVPN_USER}

bytes_s.openvpn[{#OVPN_USER},admin]

Numeric (unsigned)

B

1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].bytes_s.first()

2: Simple change

OpenVPN connected since by {#OVPN_USER}

unix_time.openvpn[{#OVPN_USER},admin]

Numeric (unsigned)

unixtime

1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].unix_time.first()

OpenVPN connected since by {#OVPN_USER}

con_time.openvpn[{#OVPN_USER},admin]

Character

1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].con_time.first()

OpenVPN country of connection by {#OVPN_USER}

code.openvpn[{#OVPN_USER},admin]

Character

1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].code.first()

OpenVPN department of connection by {#OVPN_USER}

env.openvpn[{#OVPN_USER},admin]

Character

1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].env.first()

OpenVPN real ip gotten by {#OVPN_USER}

real_ip.openvpn[{#OVPN_USER},admin]

Character

1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].real_ip.first()

OpenVPN total online by {#OVPN_USER}

duration.openvpn[{#OVPN_USER},admin]

Numeric (unsigned)

s

1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].duration.first()

OpenVPN vpn ip gotten by {#OVPN_USER}

vpn_ip.openvpn[{#OVPN_USER},admin]

Character

1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].vpn_ip.first()

Item prototypes

Item prototypes

И так для каждой пользовательской роли/профиля. Получается 5 правил обнаружения, и в каждом правиле по 9 прототипов элементов. Почему же две OpenVPN connected since by {#OVPN_USER}?

  1. unixtime конвертирует сам Zabbix и отображает корректную дату подключения.

  2. Строка с датой для Grafana, ибо она не умеет в unixtime, а когда научится — мы её удалим.

Под спойлером сам шаблон, надеюсь, он вам пригодится.

template_app_openvpn.yaml
zabbix_export:   version: '6.0'   date: '2023-07-06T19:05:17Z'   groups:     -       uuid: 7df96b18c230490a9a0a9e2307226338       name: Templates   templates:     -       uuid: 5923ee2fbec145b18d823dfa94df7bc8       template: 'Template App OpenVPN'       name: 'Template App OpenVPN'       groups:         -           name: Templates       items:         -           uuid: e656bbb1bf5042978a021b8540716f40           name: 'Get openvpn admin users'           key: 'discovery.openvpn[admin]'           delay: 5m           history: 14d           trends: '0'           value_type: TEXT           tags:             -               tag: Application               value: 'Zabbix raws'         -           uuid: d22796d8741744e386b0cfd6872bd86e           name: 'Get openvpn business users'           key: 'discovery.openvpn[bs]'           delay: 5m           history: 14d           trends: '0'           value_type: TEXT           tags:             -               tag: Application               value: 'Zabbix raws'         -           uuid: f56db6ba3c0d41c9a025701e1f3cfc10           name: 'Get openvpn develop users'           key: 'discovery.openvpn[dev]'           delay: 5m           history: 14d           trends: '0'           value_type: TEXT           tags:             -               tag: Application               value: 'Zabbix raws'         -           uuid: fd71ad243f5c41e2bc7afd8f2575cbd5           name: 'Get openvpn mobile users'           key: 'discovery.openvpn[mobile]'           delay: 5m           history: 14d           trends: '0'           value_type: TEXT           tags:             -               tag: Application               value: 'Zabbix raws'         -           uuid: 525ca7181d234482b7310061d0fcaefa           name: 'Get openvpn security users'           key: 'discovery.openvpn[sec]'           delay: 5m           history: 14d           trends: '0'           value_type: TEXT           tags:             -               tag: Application               value: 'Zabbix raws'       discovery_rules:         -           uuid: baeaac7dc625495e88cd31b0c1eb8d5e           name: 'Discovery admin stats'           type: DEPENDENT           key: get.openvpn.admin.stats           delay: '0'           lifetime: 90d           item_prototypes:             -               uuid: 0b5ab8b304624c7fa674c1a0d7c3c7fe               name: 'OpenVPN bytes received by {#OVPN_USER}'               type: DEPENDENT               key: 'bytes_r.openvpn[{#OVPN_USER},admin]'               delay: '0'               history: 7d               units: B               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_r.first()'                 -                   type: SIMPLE_CHANGE                   parameters:                     - ''               master_item:                 key: 'discovery.openvpn[admin]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 81c4e81957d3445bac60b4d01f66d77b               name: 'OpenVPN bytes sent by {#OVPN_USER}'               type: DEPENDENT               key: 'bytes_s.openvpn[{#OVPN_USER},admin]'               delay: '0'               history: 7d               units: B               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_s.first()'                 -                   type: SIMPLE_CHANGE                   parameters:                     - ''               master_item:                 key: 'discovery.openvpn[admin]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 9fe06c0a371142b5b0e5c02fe687d373               name: 'OpenVPN country of connection by {#OVPN_USER}'               type: DEPENDENT               key: 'code.openvpn[{#OVPN_USER},admin]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].code.first()'               master_item:                 key: 'discovery.openvpn[admin]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 07499de2e96c40d4ba91ac4d4e6c2819               name: 'OpenVPN connected since by {#OVPN_USER}'               type: DEPENDENT               key: 'con_time.openvpn[{#OVPN_USER},admin]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].con_time.first()'               master_item:                 key: 'discovery.openvpn[admin]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: d1a9d74555b6405e97490cec6efe5f8d               name: 'OpenVPN total online by {#OVPN_USER}'               type: DEPENDENT               key: 'duration.openvpn[{#OVPN_USER},admin]'               delay: '0'               history: 7d               units: s               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].duration.first()'               master_item:                 key: 'discovery.openvpn[admin]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 9194cada5a924a5da76680d80b99c05c               name: 'OpenVPN department of connection by {#OVPN_USER}'               type: DEPENDENT               key: 'env.openvpn[{#OVPN_USER},admin]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].env.first()'               master_item:                 key: 'discovery.openvpn[admin]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 05c5aa9e98aa4b16a69e1ca60b7c4c04               name: 'OpenVPN real ip gotten by {#OVPN_USER}'               type: DEPENDENT               key: 'real_ip.openvpn[{#OVPN_USER},admin]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].real_ip.first()'               master_item:                 key: 'discovery.openvpn[admin]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 3ef110acde6842168cbaa7c70afd5afe               name: 'OpenVPN connected since by {#OVPN_USER}'               type: DEPENDENT               key: 'unix_time.openvpn[{#OVPN_USER},admin]'               delay: '0'               history: 7d               units: unixtime               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].unix_time.first()'               master_item:                 key: 'discovery.openvpn[admin]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 5aa04efb0bd74e2c865d3f4a9b9cdb4a               name: 'OpenVPN vpn ip gotten by {#OVPN_USER}'               type: DEPENDENT               key: 'vpn_ip.openvpn[{#OVPN_USER},admin]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].vpn_ip.first()'               master_item:                 key: 'discovery.openvpn[admin]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'           master_item:             key: 'discovery.openvpn[admin]'           lld_macro_paths:             -               lld_macro: '{#OVPN_CODE}'               path: $..code.first()             -               lld_macro: '{#OVPN_ENV}'               path: $..env.first()             -               lld_macro: '{#OVPN_USER}'               path: $..user.first()         -           uuid: 4ef4d0675fff4bbb829ee0c7848ff6d8           name: 'Discovery business stats'           type: DEPENDENT           key: get.openvpn.bussines.stats           delay: '0'           lifetime: 90d           item_prototypes:             -               uuid: 0fce2e7ac92e472bbe12fb131ff53b08               name: 'OpenVPN bytes received by {#OVPN_USER}'               type: DEPENDENT               key: 'bytes_r.openvpn[{#OVPN_USER},busines]'               delay: '0'               history: 7d               units: B               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_r.first()'                 -                   type: SIMPLE_CHANGE                   parameters:                     - ''               master_item:                 key: 'discovery.openvpn[bs]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: ea4a01e3fd864e5a9f6b1b9d4f19f57e               name: 'OpenVPN bytes sent by {#OVPN_USER}'               type: DEPENDENT               key: 'bytes_s.openvpn[{#OVPN_USER},busines]'               delay: '0'               history: 7d               units: B               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_s.first()'                 -                   type: SIMPLE_CHANGE                   parameters:                     - ''               master_item:                 key: 'discovery.openvpn[bs]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 1c03acadf4bf47feb2e7563eb89bf0b0               name: 'OpenVPN country of connection by {#OVPN_USER}'               type: DEPENDENT               key: 'code.openvpn[{#OVPN_USER},busines]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].code.first()'               master_item:                 key: 'discovery.openvpn[bs]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 3bf56ef8c86f46c2acdb737f68d0bfc0               name: 'OpenVPN connected since by {#OVPN_USER}'               type: DEPENDENT               key: 'con_time.openvpn[{#OVPN_USER},busines]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].con_time.first()'               master_item:                 key: 'discovery.openvpn[bs]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 88fff908f7fc4a18be4547915b0ec73d               name: 'OpenVPN total online by {#OVPN_USER}'               type: DEPENDENT               key: 'duration.openvpn[{#OVPN_USER},busines]'               delay: '0'               history: 7d               units: s               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].duration.first()'               master_item:                 key: 'discovery.openvpn[bs]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 91754aacf7844872a734d2632b5349dc               name: 'OpenVPN department of connection by {#OVPN_USER}'               type: DEPENDENT               key: 'env.openvpn[{#OVPN_USER},busines]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].env.first()'               master_item:                 key: 'discovery.openvpn[bs]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 63446bb24db04889b148dfe918d2aa53               name: 'OpenVPN real ip gotten by {#OVPN_USER}'               type: DEPENDENT               key: 'real_ip.openvpn[{#OVPN_USER},busines]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].real_ip.first()'               master_item:                 key: 'discovery.openvpn[bs]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 84262ed2324442278cbee1bbef57c021               name: 'OpenVPN connected since by {#OVPN_USER}'               type: DEPENDENT               key: 'unix_time.openvpn[{#OVPN_USER},busines]'               delay: '0'               history: 7d               units: unixtime               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].unix_time.first()'               master_item:                 key: 'discovery.openvpn[bs]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 4c98fffd90c64211af6ce7c005b2a02b               name: 'OpenVPN vpn ip gotten by {#OVPN_USER}'               type: DEPENDENT               key: 'vpn_ip.openvpn[{#OVPN_USER},busines]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].vpn_ip.first()'               master_item:                 key: 'discovery.openvpn[bs]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'           master_item:             key: 'discovery.openvpn[bs]'           lld_macro_paths:             -               lld_macro: '{#OVPN_CODE}'               path: $..code.first()             -               lld_macro: '{#OVPN_ENV}'               path: $..env.first()             -               lld_macro: '{#OVPN_USER}'               path: $..user.first()         -           uuid: 9264e60d816e4af998da034ee24d1a82           name: 'Discovery develop stats'           type: DEPENDENT           key: get.openvpn.develop.stats           delay: '0'           lifetime: 90d           item_prototypes:             -               uuid: f3fca8e2b72f43069ad734746712abf6               name: 'OpenVPN bytes received by {#OVPN_USER}'               type: DEPENDENT               key: 'bytes_r.openvpn[{#OVPN_USER},develop]'               delay: '0'               history: 7d               units: B               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_r.first()'                 -                   type: SIMPLE_CHANGE                   parameters:                     - ''               master_item:                 key: 'discovery.openvpn[dev]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 84fd401d059040c4b2ec0956f20b5f1f               name: 'OpenVPN bytes sent by {#OVPN_USER}'               type: DEPENDENT               key: 'bytes_s.openvpn[{#OVPN_USER},develop]'               delay: '0'               history: 7d               units: B               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_s.first()'                 -                   type: SIMPLE_CHANGE                   parameters:                     - ''               master_item:                 key: 'discovery.openvpn[dev]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 064f37842d3143dbbd7989a9d0751992               name: 'OpenVPN country of connection by {#OVPN_USER}'               type: DEPENDENT               key: 'code.openvpn[{#OVPN_USER},develop]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].code.first()'               master_item:                 key: 'discovery.openvpn[dev]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 92561f23f0504c38aa3c006e2e261ceb               name: 'OpenVPN connected since by {#OVPN_USER}'               type: DEPENDENT               key: 'con_time.openvpn[{#OVPN_USER},develop]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].con_time.first()'               master_item:                 key: 'discovery.openvpn[dev]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 8fc80b04d1d14ddbb05fd1d1767639e0               name: 'OpenVPN total online by {#OVPN_USER}'               type: DEPENDENT               key: 'duration.openvpn[{#OVPN_USER},develop]'               delay: '0'               history: 7d               units: s               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].duration.first()'               master_item:                 key: 'discovery.openvpn[dev]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 67917b15f36141fab2e4fec270eb6348               name: 'OpenVPN department of connection by {#OVPN_USER}'               type: DEPENDENT               key: 'env.openvpn[{#OVPN_USER},develop]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].env.first()'               master_item:                 key: 'discovery.openvpn[dev]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: dc83cdd12b694de1a77298972f05941d               name: 'OpenVPN real ip gotten by {#OVPN_USER}'               type: DEPENDENT               key: 'real_ip.openvpn[{#OVPN_USER},develop]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].real_ip.first()'               master_item:                 key: 'discovery.openvpn[dev]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: bcead3fc33ef46eabdf58fefcf725eaf               name: 'OpenVPN connected since by {#OVPN_USER}'               type: DEPENDENT               key: 'unix_time.openvpn[{#OVPN_USER},develop]'               delay: '0'               history: 7d               units: unixtime               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].unix_time.first()'               master_item:                 key: 'discovery.openvpn[dev]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 8851c704aa1f4ce39b31ea01f378d412               name: 'OpenVPN vpn ip gotten by {#OVPN_USER}'               type: DEPENDENT               key: 'vpn_ip.openvpn[{#OVPN_USER},develop]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].vpn_ip.first()'               master_item:                 key: 'discovery.openvpn[dev]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'           master_item:             key: 'discovery.openvpn[dev]'           lld_macro_paths:             -               lld_macro: '{#OVPN_CODE}'               path: $..code.first()             -               lld_macro: '{#OVPN_ENV}'               path: $..env.first()             -               lld_macro: '{#OVPN_USER}'               path: $..user.first()         -           uuid: 8a989dbd659f45789520f30278d39d91           name: 'Discovery mobile stats'           type: DEPENDENT           key: get.openvpn.mobile.stats           delay: '0'           lifetime: 90d           item_prototypes:             -               uuid: 4bad29b577e2459c973466eacdd6dfcb               name: 'OpenVPN bytes received by {#OVPN_USER}'               type: DEPENDENT               key: 'bytes_r.openvpn[{#OVPN_USER},mobile]'               delay: '0'               history: 7d               units: B               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_r.first()'                 -                   type: SIMPLE_CHANGE                   parameters:                     - ''               master_item:                 key: 'discovery.openvpn[mobile]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: be818605d9154f009313a6e9af03010b               name: 'OpenVPN bytes sent by {#OVPN_USER}'               type: DEPENDENT               key: 'bytes_s.openvpn[{#OVPN_USER},mobile]'               delay: '0'               history: 7d               units: B               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_s.first()'                 -                   type: SIMPLE_CHANGE                   parameters:                     - ''               master_item:                 key: 'discovery.openvpn[mobile]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 5aee4d04aa984a03a408d59a2a3f60ae               name: 'OpenVPN country of connection by {#OVPN_USER}'               type: DEPENDENT               key: 'code.openvpn[{#OVPN_USER},mobile]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].code.first()'               master_item:                 key: 'discovery.openvpn[mobile]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: d2b566cae7f14cb78c1d06d2108532d2               name: 'OpenVPN connected since by {#OVPN_USER}'               type: DEPENDENT               key: 'con_time.openvpn[{#OVPN_USER},mobile]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].con_time.first()'               master_item:                 key: 'discovery.openvpn[mobile]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 57a9f5127f00472dbbf26913113824a5               name: 'OpenVPN total online by {#OVPN_USER}'               type: DEPENDENT               key: 'duration.openvpn[{#OVPN_USER},mobile]'               delay: '0'               history: 7d               units: s               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].duration.first()'               master_item:                 key: 'discovery.openvpn[mobile]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 5edef6cb3f3e4d45862b313b405d1ac0               name: 'OpenVPN department of connection by {#OVPN_USER}'               type: DEPENDENT               key: 'env.openvpn[{#OVPN_USER},mobile]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].env.first()'               master_item:                 key: 'discovery.openvpn[mobile]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 9f126688d6ad42918f6fa7adecbe438a               name: 'OpenVPN real ip gotten by {#OVPN_USER}'               type: DEPENDENT               key: 'real_ip.openvpn[{#OVPN_USER},mobile]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].real_ip.first()'               master_item:                 key: 'discovery.openvpn[mobile]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 94bea80e0ebb4c37ac7924a54c94a156               name: 'OpenVPN connected since by {#OVPN_USER}'               type: DEPENDENT               key: 'unix_time.openvpn[{#OVPN_USER},mobile]'               delay: '0'               history: 7d               units: unixtime               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].unix_time.first()'               master_item:                 key: 'discovery.openvpn[mobile]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: d4f3967738b34a979f87916fb451f882               name: 'OpenVPN vpn ip gotten by {#OVPN_USER}'               type: DEPENDENT               key: 'vpn_ip.openvpn[{#OVPN_USER},mobile]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].vpn_ip.first()'               master_item:                 key: 'discovery.openvpn[mobile]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'           master_item:             key: 'discovery.openvpn[mobile]'           lld_macro_paths:             -               lld_macro: '{#OVPN_CODE}'               path: $..code.first()             -               lld_macro: '{#OVPN_ENV}'               path: $..env.first()             -               lld_macro: '{#OVPN_USER}'               path: $..user.first()         -           uuid: a33e27cfdc1144f3b5b5baef683de5bb           name: 'Discovery security stats'           type: DEPENDENT           key: get.openvpn.security.stats           delay: '0'           lifetime: 90d           item_prototypes:             -               uuid: f040b7a6ab1449d783eb3c22aff560ea               name: 'OpenVPN bytes received by {#OVPN_USER}'               type: DEPENDENT               key: 'bytes_r.openvpn[{#OVPN_USER},security]'               delay: '0'               history: 7d               units: B               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_r.first()'                 -                   type: SIMPLE_CHANGE                   parameters:                     - ''               master_item:                 key: 'discovery.openvpn[sec]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 0e608df3acf84c3bada3bcca3a37a313               name: 'OpenVPN bytes sent by {#OVPN_USER}'               type: DEPENDENT               key: 'bytes_s.openvpn[{#OVPN_USER},security]'               delay: '0'               history: 7d               units: B               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_s.first()'                 -                   type: SIMPLE_CHANGE                   parameters:                     - ''               master_item:                 key: 'discovery.openvpn[sec]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: b860e8b0f9574fefb79813f38b394601               name: 'OpenVPN country of connection by {#OVPN_USER}'               type: DEPENDENT               key: 'code.openvpn[{#OVPN_USER},security]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].code.first()'               master_item:                 key: 'discovery.openvpn[sec]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 0f5ee76db7ed4c25b0a252af516b2b8b               name: 'OpenVPN connected since by {#OVPN_USER}'               type: DEPENDENT               key: 'con_time.openvpn[{#OVPN_USER},security]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].con_time.first()'               master_item:                 key: 'discovery.openvpn[sec]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: ecfc8ad8eb6845b6b21441fd4bf161a8               name: 'OpenVPN total online by {#OVPN_USER}'               type: DEPENDENT               key: 'duration.openvpn[{#OVPN_USER},security]'               delay: '0'               history: 7d               units: s               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].duration.first()'               master_item:                 key: 'discovery.openvpn[sec]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 7ed85921a3384bfc85e02ed264a04769               name: 'OpenVPN department of connection by {#OVPN_USER}'               type: DEPENDENT               key: 'env.openvpn[{#OVPN_USER},security]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].env.first()'               master_item:                 key: 'discovery.openvpn[sec]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 0affb5c0718145d9a8c16b586c3a47cc               name: 'OpenVPN real ip gotten by {#OVPN_USER}'               type: DEPENDENT               key: 'real_ip.openvpn[{#OVPN_USER},security]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].real_ip.first()'               master_item:                 key: 'discovery.openvpn[sec]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: 74e8d8808af74ef5bc78f7ee79cbc821               name: 'OpenVPN connected since by {#OVPN_USER}'               type: DEPENDENT               key: 'unix_time.openvpn[{#OVPN_USER},security]'               delay: '0'               history: 7d               units: unixtime               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].unix_time.first()'               master_item:                 key: 'discovery.openvpn[sec]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'             -               uuid: c7662b3f044c4305a1ddc9e580ce89dd               name: 'OpenVPN vpn ip gotten by {#OVPN_USER}'               type: DEPENDENT               key: 'vpn_ip.openvpn[{#OVPN_USER},security]'               delay: '0'               history: 7d               trends: '0'               value_type: CHAR               preprocessing:                 -                   type: JSONPATH                   parameters:                     - '$.data.[?(@.user==''{#OVPN_USER}'')].vpn_ip.first()'               master_item:                 key: 'discovery.openvpn[sec]'               tags:                 -                   tag: Application                   value: OpenVPN                 -                   tag: Country                   value: '{#OVPN_CODE}'                 -                   tag: Department                   value: '{#OVPN_ENV}'                 -                   tag: User                   value: '{#OVPN_USER}'           master_item:             key: 'discovery.openvpn[sec]'           lld_macro_paths:             -               lld_macro: '{#OVPN_CODE}'               path: $..code.first()             -               lld_macro: '{#OVPN_ENV}'               path: $..env.first()             -               lld_macro: '{#OVPN_USER}'               path: $..user.first() 

Дашборд в Grafana

Что мы можем в нём увидеть:

  • Получено трафика от пользователя.

  • Отправлено трафика пользователю.

  • Статистика подключений:

    • Время проверки Zabbix’ом.

    • Регион подключения.

    • Внешний IP.

    • Внутренний IP.

    • Роль/профиль.

  • Длительность текущего подключения.

  • Поиск пользователей:

    • По внешнему IP.

    • По внутреннему IP.

    • По роли/профилю VPN.

OpenVPN User Stats.

OpenVPN User Stats.

Под спойлером JSON для экспорта в Grafana.

openvpn_user_stats.json
{   "__inputs": [     {       "name": "DS_ZABBIX",       "label": "Zabbix",       "description": "",       "type": "datasource",       "pluginId": "alexanderzobnin-zabbix-datasource",       "pluginName": "Zabbix"     }   ],   "__elements": [],   "__requires": [     {       "type": "datasource",       "id": "alexanderzobnin-zabbix-datasource",       "name": "Zabbix",       "version": "1.0.0"     },     {       "type": "grafana",       "id": "grafana",       "name": "Grafana",       "version": "8.3.6"     },     {       "type": "panel",       "id": "table",       "name": "Table",       "version": ""     },     {       "type": "panel",       "id": "timeseries",       "name": "Time series",       "version": ""     }   ],   "annotations": {     "list": [       {         "builtIn": 1,         "datasource": "-- Grafana --",         "enable": true,         "hide": true,         "iconColor": "rgba(0, 211, 255, 1)",         "name": "Annotations & Alerts",         "target": {           "limit": 100,           "matchAny": false,           "tags": [],           "type": "dashboard"         },         "type": "dashboard"       }     ]   },   "editable": true,   "fiscalYearStartMonth": 0,   "graphTooltip": 0,   "id": null,   "iteration": 1688671488450,   "links": [],   "liveNow": false,   "panels": [     {       "collapsed": false,       "gridPos": {         "h": 1,         "w": 24,         "x": 0,         "y": 0       },       "id": 15,       "panels": [],       "title": "Статистика пользователя $username",       "type": "row"     },     {       "datasource": {         "type": "alexanderzobnin-zabbix-datasource",         "uid": "${DS_ZABBIX}"       },       "description": "",       "fieldConfig": {         "defaults": {           "color": {             "mode": "palette-classic"           },           "custom": {             "axisLabel": "",             "axisPlacement": "auto",             "barAlignment": 0,             "drawStyle": "line",             "fillOpacity": 15,             "gradientMode": "opacity",             "hideFrom": {               "legend": false,               "tooltip": false,               "viz": false             },             "lineInterpolation": "linear",             "lineStyle": {               "fill": "solid"             },             "lineWidth": 2,             "pointSize": 5,             "scaleDistribution": {               "type": "linear"             },             "showPoints": "auto",             "spanNulls": false,             "stacking": {               "group": "A",               "mode": "none"             },             "thresholdsStyle": {               "mode": "off"             }           },           "mappings": [],           "thresholds": {             "mode": "absolute",             "steps": [               {                 "color": "green",                 "value": null               }             ]           },           "unit": "decbytes"         },         "overrides": []       },       "gridPos": {         "h": 8,         "w": 12,         "x": 0,         "y": 1       },       "id": 34,       "options": {         "legend": {           "calcs": [             "last",             "min",             "max",             "sum"           ],           "displayMode": "table",           "placement": "bottom"         },         "tooltip": {           "mode": "single"         }       },       "targets": [         {           "application": {             "filter": ""           },           "datasource": {             "type": "alexanderzobnin-zabbix-datasource",             "uid": "${DS_ZABBIX}"           },           "functions": [             {               "$$hashKey": "object:1405",               "def": {                 "category": "Alias",                 "defaultParams": [],                 "name": "setAlias",                 "params": [                   {                     "name": "alias",                     "type": "string"                   }                 ]               },               "params": [                 "Получено:"               ],               "text": "setAlias(Получено:)"             }           ],           "group": {             "filter": "openvpn"           },           "host": {             "filter": "$host"           },           "item": {             "filter": "/OpenVPN bytes received by$username/"           },           "itemTag": {             "filter": "Application: OpenVPN"           },           "options": {             "disableDataAlignment": false,             "showDisabledItems": false,             "skipEmptyValues": false,             "useZabbixValueMapping": false           },           "proxy": {             "filter": ""           },           "queryType": "0",           "refId": "A",           "resultFormat": "time_series",           "table": {             "skipEmptyValues": false           },           "tags": {             "filter": ""           },           "trigger": {             "filter": ""           },           "triggers": {             "acknowledged": 2,             "count": true,             "minSeverity": 3           }         }       ],       "title": "Получено трафика от пользователя",       "transparent": true,       "type": "timeseries"     },     {       "datasource": {         "type": "alexanderzobnin-zabbix-datasource",         "uid": "${DS_ZABBIX}"       },       "description": "",       "fieldConfig": {         "defaults": {           "color": {             "mode": "palette-classic"           },           "custom": {             "axisLabel": "",             "axisPlacement": "auto",             "barAlignment": 0,             "drawStyle": "line",             "fillOpacity": 15,             "gradientMode": "opacity",             "hideFrom": {               "legend": false,               "tooltip": false,               "viz": false             },             "lineInterpolation": "linear",             "lineStyle": {               "fill": "solid"             },             "lineWidth": 2,             "pointSize": 5,             "scaleDistribution": {               "type": "linear"             },             "showPoints": "auto",             "spanNulls": false,             "stacking": {               "group": "A",               "mode": "none"             },             "thresholdsStyle": {               "mode": "off"             }           },           "mappings": [],           "thresholds": {             "mode": "absolute",             "steps": [               {                 "color": "green",                 "value": null               }             ]           },           "unit": "decbytes"         },         "overrides": []       },       "gridPos": {         "h": 8,         "w": 12,         "x": 12,         "y": 1       },       "id": 35,       "options": {         "legend": {           "calcs": [             "last",             "min",             "max",             "sum"           ],           "displayMode": "table",           "placement": "bottom"         },         "tooltip": {           "mode": "single"         }       },       "targets": [         {           "application": {             "filter": ""           },           "datasource": {             "type": "alexanderzobnin-zabbix-datasource",             "uid": "${DS_ZABBIX}"           },           "functions": [             {               "$$hashKey": "object:1432",               "def": {                 "category": "Alias",                 "defaultParams": [],                 "name": "setAlias",                 "params": [                   {                     "name": "alias",                     "type": "string"                   }                 ]               },               "params": [                 "Отправлено:"               ],               "text": "setAlias(Отправлено:)"             }           ],           "group": {             "filter": "openvpn"           },           "host": {             "filter": "$host"           },           "item": {             "filter": "/OpenVPN bytes sent by$username/"           },           "itemTag": {             "filter": "Application: OpenVPN"           },           "options": {             "disableDataAlignment": false,             "showDisabledItems": false,             "skipEmptyValues": false,             "useZabbixValueMapping": false           },           "proxy": {             "filter": ""           },           "queryType": "0",           "refId": "A",           "resultFormat": "time_series",           "table": {             "skipEmptyValues": false           },           "tags": {             "filter": ""           },           "trigger": {             "filter": ""           },           "triggers": {             "acknowledged": 2,             "count": true,             "minSeverity": 3           }         }       ],       "title": "Отправлено трафика пользователю",       "transparent": true,       "type": "timeseries"     },     {       "datasource": {         "type": "alexanderzobnin-zabbix-datasource",         "uid": "${DS_ZABBIX}"       },       "fieldConfig": {         "defaults": {           "color": {             "mode": "thresholds"           },           "custom": {             "align": "center",             "displayMode": "auto",             "filterable": true           },           "mappings": [],           "thresholds": {             "mode": "absolute",             "steps": [               {                 "color": "green",                 "value": null               }             ]           }         },         "overrides": [           {             "matcher": {               "id": "byName",               "options": "Time"             },             "properties": [               {                 "id": "custom.width",                 "value": 180               },               {                 "id": "displayName",                 "value": "Время"               }             ]           },           {             "matcher": {               "id": "byRegexp",               "options": "^OpenVPN country of connection by.*"             },             "properties": [               {                 "id": "displayName",                 "value": "Регион"               },               {                 "id": "custom.width",                 "value": 120               }             ]           },           {             "matcher": {               "id": "byRegexp",               "options": "OpenVPN real ip gotten by.*"             },             "properties": [               {                 "id": "displayName",                 "value": "Внешний IP"               },               {                 "id": "custom.width",                 "value": 180               }             ]           },           {             "matcher": {               "id": "byRegexp",               "options": "OpenVPN vpn ip gotten by.*"             },             "properties": [               {                 "id": "displayName",                 "value": "Внутренний IP"               },               {                 "id": "custom.width",                 "value": 180               }             ]           },           {             "matcher": {               "id": "byRegexp",               "options": "OpenVPN department of connection by.*"             },             "properties": [               {                 "id": "displayName",                 "value": "Профиль"               },               {                 "id": "custom.align",                 "value": "center"               },               {                 "id": "custom.width",                 "value": 120               }             ]           }         ]       },       "gridPos": {         "h": 9,         "w": 12,         "x": 0,         "y": 9       },       "hideTimeOverride": false,       "id": 32,       "options": {         "footer": {           "fields": "",           "reducer": [             "lastNotNull"           ],           "show": false         },         "showHeader": true,         "sortBy": []       },       "pluginVersion": "8.3.6",       "targets": [         {           "application": {             "filter": ""           },           "datasource": {             "type": "alexanderzobnin-zabbix-datasource",             "uid": "${DS_ZABBIX}"           },           "functions": [],           "group": {             "filter": "openvpn"           },           "host": {             "filter": "$host"           },           "item": {             "filter": "/OpenVPN country of connection by$username/"           },           "itemTag": {             "filter": "Application: OpenVPN"           },           "options": {             "disableDataAlignment": false,             "showDisabledItems": false,             "skipEmptyValues": false,             "useZabbixValueMapping": false           },           "proxy": {             "filter": ""           },           "queryType": "2",           "refId": "A",           "resultFormat": "time_series",           "table": {             "skipEmptyValues": false           },           "tags": {             "filter": ""           },           "trigger": {             "filter": ""           },           "triggers": {             "acknowledged": 2,             "count": true,             "minSeverity": 3           },           "useCaptureGroups": false         },         {           "application": {             "filter": ""           },           "datasource": {             "type": "alexanderzobnin-zabbix-datasource",             "uid": "${DS_ZABBIX}"           },           "functions": [],           "group": {             "filter": "openvpn"           },           "hide": false,           "host": {             "filter": "$host"           },           "item": {             "filter": "/OpenVPN real ip gotten by$username/"           },           "itemTag": {             "filter": "Application: OpenVPN"           },           "options": {             "disableDataAlignment": false,             "showDisabledItems": false,             "skipEmptyValues": false,             "useZabbixValueMapping": false           },           "proxy": {             "filter": ""           },           "queryType": "2",           "refId": "B",           "resultFormat": "time_series",           "table": {             "skipEmptyValues": false           },           "tags": {             "filter": ""           },           "trigger": {             "filter": ""           },           "triggers": {             "acknowledged": 2,             "count": true,             "minSeverity": 3           }         },         {           "application": {             "filter": ""           },           "datasource": {             "type": "alexanderzobnin-zabbix-datasource",             "uid": "${DS_ZABBIX}"           },           "functions": [],           "group": {             "filter": "openvpn"           },           "hide": false,           "host": {             "filter": "$host"           },           "item": {             "filter": "/OpenVPN vpn ip gotten by$username/"           },           "itemTag": {             "filter": "Application: OpenVPN"           },           "options": {             "disableDataAlignment": false,             "showDisabledItems": false,             "skipEmptyValues": false,             "useZabbixValueMapping": false           },           "proxy": {             "filter": ""           },           "queryType": "2",           "refId": "C",           "resultFormat": "time_series",           "table": {             "skipEmptyValues": false           },           "tags": {             "filter": ""           },           "trigger": {             "filter": ""           },           "triggers": {             "acknowledged": 2,             "count": true,             "minSeverity": 3           }         },         {           "application": {             "filter": ""           },           "datasource": {             "type": "alexanderzobnin-zabbix-datasource",             "uid": "${DS_ZABBIX}"           },           "functions": [],           "group": {             "filter": "openvpn"           },           "hide": false,           "host": {             "filter": "$host"           },           "item": {             "filter": "/OpenVPN department of connection by$username/"           },           "itemTag": {             "filter": "Application: OpenVPN"           },           "options": {             "disableDataAlignment": false,             "showDisabledItems": false,             "skipEmptyValues": false,             "useZabbixValueMapping": false           },           "proxy": {             "filter": ""           },           "queryType": "2",           "refId": "D",           "resultFormat": "time_series",           "table": {             "skipEmptyValues": false           },           "tags": {             "filter": ""           },           "trigger": {             "filter": ""           },           "triggers": {             "acknowledged": 2,             "count": true,             "minSeverity": 3           }         }       ],       "title": "Статистика подключений",       "transparent": true,       "type": "table"     },     {       "datasource": {         "type": "alexanderzobnin-zabbix-datasource",         "uid": "${DS_ZABBIX}"       },       "fieldConfig": {         "defaults": {           "color": {             "mode": "continuous-GrYlRd"           },           "custom": {             "axisLabel": "",             "axisPlacement": "auto",             "barAlignment": 0,             "drawStyle": "bars",             "fillOpacity": 90,             "gradientMode": "scheme",             "hideFrom": {               "legend": false,               "tooltip": false,               "viz": false             },             "lineInterpolation": "linear",             "lineWidth": 1,             "pointSize": 5,             "scaleDistribution": {               "type": "linear"             },             "showPoints": "auto",             "spanNulls": false,             "stacking": {               "group": "A",               "mode": "none"             },             "thresholdsStyle": {               "mode": "off"             }           },           "mappings": [],           "thresholds": {             "mode": "absolute",             "steps": [               {                 "color": "green",                 "value": null               }             ]           },           "unit": "dtdhms"         },         "overrides": [           {             "matcher": {               "id": "byName",               "options": "Длительность подключений:"             },             "properties": [               {                 "id": "color",                 "value": {                   "fixedColor": "orange",                   "mode": "fixed"                 }               }             ]           }         ]       },       "gridPos": {         "h": 9,         "w": 12,         "x": 12,         "y": 9       },       "id": 37,       "links": [],       "options": {         "legend": {           "calcs": [             "last"           ],           "displayMode": "table",           "placement": "bottom",           "sortBy": "Distinct Count",           "sortDesc": true         },         "tooltip": {           "mode": "single"         }       },       "pluginVersion": "8.3.6",       "targets": [         {           "application": {             "filter": ""           },           "datasource": {             "type": "alexanderzobnin-zabbix-datasource",             "uid": "${DS_ZABBIX}"           },           "functions": [],           "group": {             "filter": "openvpn"           },           "host": {             "filter": "$host"           },           "item": {             "filter": "/OpenVPN total online by$username/"           },           "itemTag": {             "filter": "Application: OpenVPN"           },           "options": {             "disableDataAlignment": false,             "showDisabledItems": false,             "skipEmptyValues": false,             "useZabbixValueMapping": false           },           "proxy": {             "filter": ""           },           "queryType": "0",           "refId": "A",           "resultFormat": "time_series",           "table": {             "skipEmptyValues": false           },           "tags": {             "filter": ""           },           "trigger": {             "filter": ""           },           "triggers": {             "acknowledged": 2,             "count": true,             "minSeverity": 3           }         }       ],       "title": "Длительность подключений",       "transformations": [         {           "id": "calculateField",           "options": {             "alias": "Длительность последнего подключения:",             "mode": "reduceRow",             "reduce": {               "reducer": "sum"             },             "replaceFields": true           }         }       ],       "transparent": true,       "type": "timeseries"     },     {       "collapsed": true,       "gridPos": {         "h": 1,         "w": 24,         "x": 0,         "y": 18       },       "id": 39,       "panels": [         {           "datasource": {             "type": "alexanderzobnin-zabbix-datasource",             "uid": "${DS_ZABBIX}"           },           "description": "",           "fieldConfig": {             "defaults": {               "custom": {                 "align": "auto",                 "displayMode": "auto",                 "filterable": true               },               "mappings": [],               "thresholds": {                 "mode": "absolute",                 "steps": [                   {                     "color": "green",                     "value": null                   },                   {                     "color": "red",                     "value": 80                   }                 ]               }             },             "overrides": [               {                 "matcher": {                   "id": "byName",                   "options": "Last value"                 },                 "properties": [                   {                     "id": "custom.width",                     "value": 200                   }                 ]               }             ]           },           "gridPos": {             "h": 19,             "w": 8,             "x": 0,             "y": 19           },           "id": 41,           "options": {             "footer": {               "fields": "",               "reducer": [                 "sum"               ],               "show": false             },             "showHeader": true,             "sortBy": []           },           "pluginVersion": "8.3.6",           "targets": [             {               "application": {                 "filter": ""               },               "datasource": {                 "type": "alexanderzobnin-zabbix-datasource",                 "uid": "${DS_ZABBIX}"               },               "functions": [],               "group": {                 "filter": "openvpn"               },               "host": {                 "filter": "$host"               },               "item": {                 "filter": "/OpenVPN real ip gotten by.*/"               },               "itemTag": {                 "filter": "Application: OpenVPN"               },               "options": {                 "disableDataAlignment": false,                 "showDisabledItems": false,                 "skipEmptyValues": true,                 "useZabbixValueMapping": false               },               "proxy": {                 "filter": ""               },               "queryType": "2",               "refId": "A",               "resultFormat": "table",               "slaInterval": "none",               "slaProperty": {                 "name": "SLA",                 "property": "sla"               },               "table": {                 "skipEmptyValues": false               },               "tags": {                 "filter": ""               },               "textFilter": "",               "trigger": {                 "filter": ""               },               "triggers": {                 "acknowledged": 2,                 "count": true,                 "minSeverity": 3               }             }           ],           "title": "По внешнему IP",           "transformations": [             {               "id": "organize",               "options": {                 "excludeByName": {                   "Host": true,                   "Key": true                 },                 "indexByName": {                   "All values": 0,                   "Host": 1,                   "Item": 2,                   "Key": 3,                   "Last value": 4                 },                 "renameByName": {                   "Host": "",                   "Item": "Пользователь",                   "Last value": "Внешний IP"                 }               }             }           ],           "transparent": true,           "type": "table"         },         {           "datasource": {             "type": "alexanderzobnin-zabbix-datasource",             "uid": "${DS_ZABBIX}"           },           "description": "",           "fieldConfig": {             "defaults": {               "custom": {                 "align": "auto",                 "displayMode": "auto",                 "filterable": true               },               "mappings": [],               "thresholds": {                 "mode": "absolute",                 "steps": [                   {                     "color": "green",                     "value": null                   },                   {                     "color": "red",                     "value": 80                   }                 ]               }             },             "overrides": [               {                 "matcher": {                   "id": "byName",                   "options": "Last value"                 },                 "properties": [                   {                     "id": "custom.width",                     "value": 200                   }                 ]               }             ]           },           "gridPos": {             "h": 19,             "w": 8,             "x": 8,             "y": 19           },           "id": 42,           "options": {             "footer": {               "fields": "",               "reducer": [                 "sum"               ],               "show": false             },             "showHeader": true,             "sortBy": []           },           "pluginVersion": "8.3.6",           "targets": [             {               "application": {                 "filter": ""               },               "datasource": {                 "type": "alexanderzobnin-zabbix-datasource",                 "uid": "${DS_ZABBIX}"               },               "functions": [],               "group": {                 "filter": "openvpn"               },               "host": {                 "filter": "$host"               },               "item": {                 "filter": "/OpenVPN vpn ip gotten by.*/"               },               "itemTag": {                 "filter": "Application: OpenVPN"               },               "options": {                 "disableDataAlignment": false,                 "showDisabledItems": false,                 "skipEmptyValues": true,                 "useZabbixValueMapping": false               },               "proxy": {                 "filter": ""               },               "queryType": "2",               "refId": "A",               "resultFormat": "table",               "slaInterval": "none",               "slaProperty": {                 "name": "SLA",                 "property": "sla"               },               "table": {                 "skipEmptyValues": false               },               "tags": {                 "filter": ""               },               "textFilter": "",               "trigger": {                 "filter": ""               },               "triggers": {                 "acknowledged": 2,                 "count": true,                 "minSeverity": 3               }             }           ],           "title": "По внутреннему IP",           "transformations": [             {               "id": "organize",               "options": {                 "excludeByName": {                   "Host": true,                   "Key": true                 },                 "indexByName": {                   "All values": 0,                   "Host": 1,                   "Item": 2,                   "Key": 3,                   "Last value": 4                 },                 "renameByName": {                   "Host": "",                   "Item": "Пользователь",                   "Last value": "Внутренний IP"                 }               }             }           ],           "transparent": true,           "type": "table"         },         {           "datasource": {             "type": "alexanderzobnin-zabbix-datasource",             "uid": "${DS_ZABBIX}"           },           "description": "",           "fieldConfig": {             "defaults": {               "custom": {                 "align": "auto",                 "displayMode": "auto",                 "filterable": true               },               "mappings": [],               "thresholds": {                 "mode": "absolute",                 "steps": [                   {                     "color": "green",                     "value": null                   },                   {                     "color": "red",                     "value": 80                   }                 ]               }             },             "overrides": [               {                 "matcher": {                   "id": "byName",                   "options": "Last value"                 },                 "properties": [                   {                     "id": "custom.width",                     "value": 200                   }                 ]               }             ]           },           "gridPos": {             "h": 19,             "w": 8,             "x": 16,             "y": 19           },           "id": 43,           "options": {             "footer": {               "fields": "",               "reducer": [                 "sum"               ],               "show": false             },             "showHeader": true,             "sortBy": []           },           "pluginVersion": "8.3.6",           "targets": [             {               "application": {                 "filter": ""               },               "datasource": {                 "type": "alexanderzobnin-zabbix-datasource",                 "uid": "${DS_ZABBIX}"               },               "functions": [],               "group": {                 "filter": "openvpn"               },               "host": {                 "filter": "$host"               },               "item": {                 "filter": "/OpenVPN department of connection by .*/"               },               "itemTag": {                 "filter": "Application: OpenVPN"               },               "options": {                 "disableDataAlignment": false,                 "showDisabledItems": false,                 "skipEmptyValues": true,                 "useZabbixValueMapping": false               },               "proxy": {                 "filter": ""               },               "queryType": "2",               "refId": "A",               "resultFormat": "table",               "slaInterval": "none",               "slaProperty": {                 "name": "SLA",                 "property": "sla"               },               "table": {                 "skipEmptyValues": false               },               "tags": {                 "filter": ""               },               "textFilter": "",               "trigger": {                 "filter": ""               },               "triggers": {                 "acknowledged": 2,                 "count": true,                 "minSeverity": 3               }             }           ],           "title": "По профилю VPN",           "transformations": [             {               "id": "organize",               "options": {                 "excludeByName": {                   "Host": true,                   "Key": true                 },                 "indexByName": {                   "All values": 0,                   "Host": 1,                   "Item": 2,                   "Key": 3,                   "Last value": 4                 },                 "renameByName": {                   "Host": "",                   "Item": "Пользователь",                   "Last value": "Профиль VPN"                 }               }             }           ],           "transparent": true,           "type": "table"         }       ],       "title": "Поиск пользователя",       "type": "row"     }   ],   "refresh": "",   "schemaVersion": 34,   "style": "dark",   "tags": [],   "templating": {     "list": [       {         "current": {},         "datasource": {           "type": "alexanderzobnin-zabbix-datasource",           "uid": "${DS_ZABBIX}"         },         "definition": "Zabbix - host",         "hide": 0,         "includeAll": false,         "multi": false,         "name": "host",         "options": [],         "query": {           "application": "",           "group": "openvpn",           "host": "/.*/",           "item": "",           "itemTag": "",           "queryType": "host"         },         "refresh": 1,         "regex": "",         "skipUrlSync": false,         "sort": 0,         "tagValuesQuery": "",         "tagsQuery": "",         "type": "query",         "useTags": false       },       {         "current": {},         "datasource": {           "type": "alexanderzobnin-zabbix-datasource",           "uid": "${DS_ZABBIX}"         },         "definition": "Zabbix - itemTag",         "hide": 2,         "includeAll": true,         "multi": false,         "name": "departament",         "options": [],         "query": {           "application": "",           "group": "openvpn",           "host": "$host",           "item": "",           "itemTag": "/Departament/",           "queryType": "itemTag"         },         "refresh": 1,         "regex": "/^Departament:(.*)/",         "skipUrlSync": false,         "sort": 0,         "tagValuesQuery": "",         "tagsQuery": "",         "type": "query",         "useTags": false       },       {         "current": {},         "datasource": {           "type": "alexanderzobnin-zabbix-datasource",           "uid": "${DS_ZABBIX}"         },         "definition": "Zabbix - itemTag",         "hide": 0,         "includeAll": false,         "multi": false,         "name": "username",         "options": [],         "query": {           "application": "",           "group": "openvpn",           "host": "$host",           "item": "",           "itemTag": "/User/",           "queryType": "itemTag"         },         "refresh": 1,         "regex": "/^User:(.*)/",         "skipUrlSync": false,         "sort": 0,         "tagValuesQuery": "",         "tagsQuery": "",         "type": "query",         "useTags": false       }     ]   },   "time": {     "from": "now-24h",     "to": "now"   },   "timepicker": {     "refresh_intervals": [       "5s",       "10s",       "30s",       "1m",       "5m",       "15m",       "30m",       "1h",       "2h",       "1d"     ],     "time_options": [       "5m",       "15m",       "1h",       "6h",       "12h",       "24h",       "2d",       "7d",       "30d"     ]   },   "timezone": "",   "title": "OpenVPN User Stats",   "uid": "ERpfiw9Vz",   "version": 2,   "weekStart": "" }

На этом у меня всё, всем спасибо за внимание, и вступайте в Zabbix Community!


ссылка на оригинал статьи https://habr.com/ru/companies/domclick/articles/744764/


Комментарии

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

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