Перейти до вмісту
Блог › Налаштування ПЗ › Моніторимо BIND у Zabbix: два прості способи

Моніторимо BIND у Zabbix: два прості способи

0. Передумови

  • Zabbix Server 7.0+
  • Zabbix Agent (класичний або agent2) на DNS-хості
  • Утиліти: curl і одна з XML-тулз: xmllint (пакет libxml2) або xmlstarlet
    • Alma/RHEL 9/10:
dnf install -y curl libxml2 xmlstarlet
  • Debian/Ubuntu:
apt-get install -y curl libxml2-utils xmlstarlet

На AlmaLinux 10 пакета xml2 зазвичай немає — використовуйте xmllint або xmlstarlet.

1. Увімкнути статистику в BIND і захистити доступ

Додайте у named.conf (поза view, або всередині потрібного view, якщо ви їх використовуєте):

// Статистика через HTTP (XML/JSON, залежно від версії BIND)
statistics-channels {
    inet 127.0.0.1 port 8053 allow { 127.0.0.1; <IP_ZABBIX_SERVER>; };
};

// Рекомендації для авторитативного NS
options {
    directory "/var/named";         // або /var/cache/bind у Debian
    recursion no;                   // на авторитативних
    allow-query { any; };           // або ваш ACL
    // ... ваші інші опції ...
};


Перевірте й перезапустіть:

named-checkconf -z
systemctl reload named   # або named-chroot/named-pkcs11, залежно від пакета


Переконайтесь, що статистика працює:

curl -fsS http://127.0.0.1:8053/ | head

Якщо BIND за reverse-proxy й ви бачите 307 Temporary Redirect, вимкніть редирект для 127.0.0.1 або ходіть напряму на порт 8053.



2. Варіант А (швидкий): готовий шаблон «BIND9 statistics by HTTP»

  1. Імпортуйте community-шаблон Template Bind9-stat by HTTP (Zabbix 7.0) у Zabbix UI (та, що читає статистику по HTTP).
  2. На хості з BIND:
    • Переконайтеся, що стоїть curl і або xmllint, або xmlstarlet.
    • У zabbix_agentd.conf приберіть застаріле:
# EnableRemoteCommands=1  <-- застаріло

і додайте дозвіл лише для потрібного ключа:

AllowKey=system.run[*]

Перезапустіть агента:

systemctl restart zabbix-agent
  1. Прив’яжіть шаблон до вашого хоста. Якщо шаблон просить макрос із URL статистики — задайте http://127.0.0.1:8053/.
  2. Перевірка з фронтенду: Latest data → фільтр за хостом → з’являться лічильники запитів за типами (A/AAAA/NS/…).

Якщо імпорт падає — переконайтесь, що берете версію під 7.0 (у 7.0 інший синтаксис YAML-експорту).

3. Варіант B (мінімальний кастом): 3 метрики через UserParameter

Це запасний, «свій» варіант на базі xmllint/xmlstarlet. Створимо простий скрипт і ключі агента.

3.1 Скрипт парсингу

/usr/local/bin/bindstat.sh:

#!/bin/bash
set -euo pipefail

# URL статистики BIND
URL="${BINDSTAT_URL:-http://127.0.0.1:8053/}"
WHAT="${1:-queries-in}"   # queries-in | queries-out | counter
QTYPE="${2:-A}"           # наприклад A, AAAA, MX ...

DATA="$(curl -fsS "$URL")"

# Спроба через xmllint, далі fallback на xmlstarlet, далі grep/sed
extract_rdtype() {
  local dir="$1" q="$2"
  if command -v xmllint >/dev/null; then
    xmllint --xpath "string(//${dir}/rdtype[@name='${q}'])" - 2>/dev/null || true
  elif command -v xmlstarlet >/dev/null; then
    xmlstarlet sel -t -v "//${dir}/rdtype[@name='${q}']" 2>/dev/null || true
  else
    grep -oP "<${dir}[^>]*>.*?<rdtype name=[\"']${q}[\"']>([0-9]+)</rdtype>.*?</${dir}>" -m1 \
      | grep -oP "(?<=<rdtype name=[\"']${q}[\"']>)[0-9]+"
  fi
}

case "$WHAT" in
  queries-in)
    echo "$DATA" | extract_rdtype "queries-in" "$QTYPE"
    ;;
  queries-out)
    echo "$DATA" | extract_rdtype "queries-out" "$QTYPE"
    ;;
  counter)
    # приклад: counter server/nsstat/Requestv4 (під себе)
    # echo "$DATA" | xmllint --xpath 'string(//server/counters[@type="nsstat"]/counter[@name="Requestv4"])' -
    ;;
  *)
    echo "Unsupported" >&2; exit 1
    ;;
esac
chmod +x /usr/local/bin/bindstat.sh

3.2 UserParameter для агента

/etc/zabbix/zabbix_agentd.d/bind.conf:

# Дозоконтролюйте в zabbix_agentd.conf: AllowKey=system.run[*]

# Вхідні запити по QTYPE (A, AAAA, MX...)
UserParameter=bind.queries.in[*],/usr/local/bin/bindstat.sh queries-in "$1"

# Вихідні (реkursивні/forward) по QTYPE — зазвичай 0 на авторитативних
UserParameter=bind.queries.out[*],/usr/local/bin/bindstat.sh queries-out "$1"

Перезапуск агента:

systemctl restart zabbix-agent

Тест із Zabbix-сервера:

zabbix_get -s <IP_DNS> -k "bind.queries.in[A]"

Створіть у Zabbix власний «міні-шаблон» з двома Items:

  • bind.queries.in[A] (type: Zabbix agent, value type: Numeric (unsigned), update: 60s)
  • bind.queries.in[AAAA] … і так далі (або зробіть LLD за списком типів)

Та прості тригери, наприклад «немає запитів 10 хв» або «аномально багато NXDOMAIN».

4. Поради з безпеки

  • Тримайте statistics-channels на 127.0.0.1 і опитуйте його локально агентом.
  • Якщо треба віддалено — відкрийте порт тільки для Zabbix Server IP + firewall, або підніміть nginx-реверс-проксі з базовою аутентифікацією.
  • SELinux: для каталогу зон (якщо ви трекаєте ще й slave/master файли) — контекст named_zone_t; для статистики зазвичай не потрібно нічого додаткового.

5. Типові помилки та як їх ловити

  • 404 або 307 Temporary Redirect — ви стукаєте не туди (reverse-proxy, інший префікс). Перевіряйте curl http://127.0.0.1:8053/.
  • xml2: command not found — ставте libxml2 (дасть xmllint) або xmlstarlet, і використовуйте варіант B/оновлений шаблон.
  • Zabbix агент лається на EnableRemoteCommands — в 7.0 він deprecated. Використовуйте AllowKey=system.run[*] / DenyKey=….
  • Немає даних у Latest data — дивіться journalctl -u zabbix-agent -n 100, перевіряйте ручним zabbix_get.

6. Що саме моніторити

  • Queries in, by QTYPE: A/AAAA/MX/NS/SOA – поведінка трафіку.
  • SERVFAIL/FORMERR/NXDOMAIN (якщо тягнете counters) — помилки резолву.
  • Zone transfers (IXFR/AXFR лічильники) — для авторитативних кластерів.
  • Відповіді recursion/forward — на рекурсивних.

Підсумок

Найпростіше — увімкнути statistics-channels у BIND, імпортувати готовий шаблон «Bind9 statistics by HTTP» під Zabbix 7.0 і переконатися, що на сервері є curl + xmllint/xmlstarlet. Якщо ж потрібен контроль і мінімалізм — 2–3 UserParameter з маленьким скриптом дадуть вам ключові графіки за 10 хвилин.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *