0

Мониторинг bind

На повестке дня мониторинг DNS сервера bind. Постараюсь разобраться как и какие данные можно получить для анализа работоспособности BIND.

Далее речь пойдет о BIND версии 9.8.

Как получить данные

Мне известно 2 варианта как можно получить данные статистики от BIND. Рассмотрим каждый подробнее.

statistic-channel

Данные статистики можно получить с помощью http запроса к серверу. Для этого в named.conf прописываю следующее и перезапускаю DNS сервис:

statistics-channels {
  inet 127.0.0.1 port 8953 allow { 127.0.0.1; };
};

Теперь получаю статистику:
# curl -s http://127.0.0.1:8953
и получаю что-то вида:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/bind9.xsl"?>
<isc version="1.0">
  <bind>
    <statistics version="2.2">
      <views>
        <view>
          <name>_default</name>
          <zones>
            <zone>
              <name>0.in-addr.arpa/IN</name>
              <rdataclass>IN</rdataclass>
              <serial>0</serial>
            </zone>
            <zone>
...

Постараюсь рассказать чуть подробнее..

Сначала идут записи о зонах, которые существуют на данном сервере. Это записи следующего вида. Хочу обратить внимание, что вид записи изменится, если в описание зоны добавить параметр zone-statistics yes;

<zone>
  <name>127.IN-ADDR.ARPA/IN</name>
  <rdataclass>IN</rdataclass>
  <serial>0</serial>
</zone>

Далее идут записи об исходящих запросах (Outgoing Queries) по типу запроса, например:

<rdtype>
  <name>A</name>
  <counter>383310677</counter>
</rdtype>

Указан тип записи и количество запросов.

Записи под тегом означают Resolver Statistics. В этих тегах содержатся значения, связанные с количеством отправленных запросов и полученных ответов. Количество полученных ответов по типам, ошибки, RTT и т.д.

IPv4 queries sent
IPv6 queries sent
IPv4 responses received
IPv6 responses received
NXDOMAIN received
SERVFAIL received
FORMERR received
other errors received
EDNS(0) query failures
truncated responses received
lame delegations received
query retries
query timeouts
IPv4 NS address fetches
IPv6 NS address fetches
IPv4 NS address fetch failed
IPv6 NS address fetch failed
DNSSEC validation attempted
DNSSEC validation succeeded
DNSSEC NX validation succeeded
DNSSEC validation failed
queries with RTT < 10ms
queries with RTT 10-100ms
queries with RTT 100-500ms
queries with RTT 500-800ms
queries with RTT 800-1600ms
queries with RTT > 1600ms

Затем следует статистика по кешированным запросам:

<cache name="_default">
  <rrset>
    <name>A</name>
    <counter>146090</counter>
  </rrset>
  ...
</cache>

Далее все вышеперечисленное, но под тегами

<view>
  <name>_bind</name>
  ...
</view>

После этого идут 2 больших блока socketmgr и taskmgr, про которые мне нечего сказать…

Продолжение не менее интересное. Следующий блок, начинающийся с

<server>
  <boot-time>2015-02-06T20:42:08Z</boot-time>
  <current-time>2015-03-04T19:49:42Z</current-time>
  <requests>

расскажет о работе самого сервиса резолвинга.

Рекомендую ознакомится с протоколом dns. Осторожно, много ссылок на RFC. =)

Здесь по тегом requests находятся входящие запросы, разбитые по opcode
Затем идет блок queries-in. Стоит отметить, что request и query — это разные вещи. Как я понимаю, под request имеется ввиду любой ipv4, ipv6 запрос к серверу, а под query при этом понимается запрос данных о зоне (A,PTR,AAAA…). Тут речь как раз о queries, со статистикой по типу.

После идут теги nsstat, которые подразумевают Name Server Statistics.

IPv4 requests received
requests with EDNS(0) received
requests with TSIG received
requests with invalid signature
TCP requests received
auth queries rejected
recursive queries rejected
transfer requests rejected
responses sent
truncated responses sent
responses with EDNS(0) sent
queries resulted in successful answer
queries resulted in authoritative answer
queries resulted in non authoritative answer
queries resulted in referral answer
queries resulted in nxrrset
queries resulted in SERVFAIL
queries resulted in NXDOMAIN
queries caused recursion
duplicate queries received
queries dropped
other query failures

И несколько других

Далее статистика обслуживания зон (zonestat), сокетов (sockstat) и использования памяти (memory), с которыми я пока не разбирался.

Прежде чем говорить о том, как выдернуть эти данные, расскажу про второй способ.

statistics-file

Данные статистики можно получить с пмощью утилиты rndc, прописав при этом в named.conf в секции options statistics-file "/var/named/data/named_stats.txt";

# rndc stats

пишет данные статистики в /var/named/data/named_stats.txt.
Обращаю внимание, что при повторном вызове файл статистики будет дополнен.

Файл содержит сгруппированные данные описанные выше. Такой парсер xml, получается.

На мой взгляд, предпочтительнее использовать первый способ, т.к. при этом диск надо будет дергать гораздо реже, чем постоянное создание — удаление файла статистики.

Получение данных

При использвания первого способа, для получения нужных данных придется парсить xml. Я использовал python с модулем lxml. Отличная штука!

В качестве бонуса для дочитавших до конца, выложу скрипт на python для ВТОРОГО способа, но не требующего дополнительных библиотек для python.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import os
import re

# get stats
os.system('/usr/sbin/rndc stats')

qtable = {
  '00':'IPv4 requests received',
  '01':'requests with EDNS\(0\) received',
  '02':'requests with TSIG received',
  '03':'requests with invalid signature',
  '04':'TCP requests received',
  '05':'auth queries rejected',
  '06':'recursive queries rejected',
  '07':'transfer requests rejected',
  '08':'update requests rejected',
  '09':'responses sent',
  '0a':'truncated responses sent',
  '0b':'responses with EDNS\(0\) sent',
  '0c':'queries resulted in successful answer',
  '0d':'queries resulted in authoritative answer',
  '0e':'queries resulted in non authoritative answer',
  '0f':'queries resulted in referral answer',
  '10':'queries resulted in nxrrset',
  '11':'queries resulted in SERVFAIL',
  '12':'queries resulted in NXDOMAIN',
  '13':'queries caused recursion',
  '14':'duplicate queries received',
  '15':'queries dropped',
  '16':'other query failures'
}

def  _help():
  print """Help:
    '00':'IPv4 requests received'
    '01':'requests with EDNS(0) received'
    '02':'requests with TSIG received'
    '03':'requests with invalid signature'
    '04':'TCP requests received'
    '05':'auth queries rejected'
    '06':'recursive queries rejected'
    '07':'transfer requests rejected'
    '08':'update requests rejected'
    '09':'responses sent'
    '0a':'truncated responses sent'
    '0b':'responses with EDNS(0) sent'
    '0c':'queries resulted in successful answer'
    '0d':'queries resulted in authoritative answer'
    '0e':'queries resulted in non authoritative answer'
    '0f':'queries resulted in referral answer'
    '10':'queries resulted in nxrrset'
    '11':'queries resulted in SERVFAIL'
    '12':'queries resulted in NXDOMAIN'
    '13':'queries caused recursion'
    '14':'duplicate queries received'
    '15':'queries dropped'
    '16':'other query failures'
  """

with open('/var/named/data/named_stats.txt','r') as statfile:
  data = statfile.read()

if len(sys.argv) == 2:
  TYPE = sys.argv[1]
  QTYPE = sys.argv[1][:sys.argv[1].find('_')]
  STYPE = sys.argv[1][sys.argv[1].find('_')+1:]
  if QTYPE == 'in':
    blockdata = data[data.find('++ Incoming Queries ++'):data.find('++ Outgoing Queries ++')]
    blockdata = re.search(r'([0-9]+) '+STYPE,blockdata)
    print blockdata.group(1)
  elif QTYPE == 'out':
    blockdata = data[data.find('++ Outgoing Queries ++'):data.find('++ Name Server Statistics ++')]
    blockdata = re.search(r'([0-9]+) '+STYPE,blockdata)
    print blockdata.group(1)
  elif TYPE in qtable.keys():
    blockdata = re.search(r'([0-9]+) '+qtable[TYPE],data)
    print blockdata.group(1)
  else:
    _help()
else:
  _help()

# cleanup
os.system('rm -f /var/named/data/named_stats.txt')

Использовние: script.py in_PTR|out_AAAA|0a

Скрипт был написан для zabbix, но после обработки напильником подойдет и для nagios, и для cacti.

На этом все, спасибо за внимание!

Alexey Egorychev

FreeBSD and Linux sysadmin. Know many systems like mailsystems, DB, WWW stack. Automation with salt, ansible. Monitoring with nagios, zabbix.