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»
- Імпортуйте community-шаблон Template Bind9-stat by HTTP (Zabbix 7.0) у Zabbix UI (та, що читає статистику по HTTP).
- На хості з BIND:
- Переконайтеся, що стоїть curl і або xmllint, або xmlstarlet.
- У zabbix_agentd.conf приберіть застаріле:
# EnableRemoteCommands=1 <-- застаріло
і додайте дозвіл лише для потрібного ключа:
AllowKey=system.run[*]
Перезапустіть агента:
systemctl restart zabbix-agent
- Прив’яжіть шаблон до вашого хоста. Якщо шаблон просить макрос із URL статистики — задайте http://127.0.0.1:8053/.
- Перевірка з фронтенду: 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
;;
esacchmod +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 хвилин.
