Почему захотелось
Всегда интересовался DNS и, наконец, захотелось выяснить кто, когда, как и что спрашивает у DNS серверов о домене. Для этой цели был сделан отдельный VDS здесь, собственно поэтому статья размещается здесь.
Требуется
bind9. Как установить — этого полно в интернете. Например, для debian требуется всего одна команда «apt-get install bind9». Запуск\остановка /etc/init.d/bind9 start\stop.
Настройка
Главное, это собирать информацию о принятых запросах. Файл named.conf.
logging { channel query_log { file "/var/log/bind/bind.log"; severity dynamic; print-time yes; }; channel main { file "/var/log/bind/main.log"; severity dynamic; print-time yes; print-category yes; print-severity yes; }; category queries { query_log; }; category xfer-in { main; }; category xfer-out { main; }; category security { main; }; category resolver { main; }; category client { main; }; category unmatched { main; }; category default { main; }; category database { main; }; };
Выше я написал все, что собирает мой DNS сервер. Достаточно будет:
logging { channel query_log { file "/var/log/bind/bind.log"; severity dynamic; print-time yes; }; category queries { query_log; }; };
Сбор статистики
Подготовка
Я использую очень простой механизм хранения логов bind. Для этого создан отдельный пользователь (adduser), для удобного доступа по ftp (демон proftpd). Внутри домашней директории (например /home/net) расположены еще две /home/net/bind — сюда складываются логи DNS сервера, /home/net/stat — сюда будет помещатся интересующая меня статистика. Сбор логов происходит с помощью php скрипта, запускаемого с помощью cron. Статистика собирается за месяц.
Конфигурация cron
# m h dom mon dow command 0 */1 * * * /usr/bin/php /home/net/bind.php > /dev/null 2>&1 1 */1 * * * /usr/bin/php /home/net/stat1.php > /dev/null 2>&1 2 */1 * * * /usr/bin/php /home/net/stat2.php > /dev/null 2>&1 3 */1 * * * /usr/bin/php /home/net/stat3.php > /dev/null 2>&1 4 */1 * * * /usr/bin/php /home/net/stat4.php > /dev/null 2>&1
Первый скрипт, запускаемый каждый час делает остановку DNS сервера, копирование файла с логом и запуск DNS сервера. Интервал можете изменить по своему усмотрению. Мне все-равно необходимо перезапускать DNS сервер каждый час. Если нужно только обновить зоны, то надо «rndc reload». Остальный скрипты создают интересующую меня статистику. Запускаются последовательно, чтобы не нагружать сервер. Многие скрипты можно написать более оптимально, но я предлагаю только основу.
bind.php
Статистика
1. Кто, что именно и сколько раз спрашивал
Файл с информацией вида IP адрес [tab] количество запросов. Пример:
xx.143.5.39 954 xxx.177.96.1 858 xx.111.180.223 378 xxx.92.168.54 373 xxx.122.226.27 247 xxx.23.19.2 204
Файл с информацией о том, какими записями сколько раз интересовались. Пример:
$$.ru 19137 $$$$.ru 2969 $$$$.ru 1523 $$$$.ru 1224 $$$$$$.ru 1119 $$$$$.ru 1055 $$$.ru 1047
Файл с более детальной информацией, указывающей какими именно типами записей интересовались. Пример:
A $$.$$.tj 39 AAAA $$$.$$$$.ru 36 AAAA $$$.$$$.ru 34 A $$$$.ru 32 A $$$.$$$$.ru 31 MX $$$.$$$$.ru 30 A $$$.$$$$$$$.com 30 A $$$$.ru 30 A6 $$$.$$$$.ru 29
PHP-скрипт для создания такой информации:
—mef 16:16, 26 декабря 2008 (MSK)
2. Распределение запросов по времени
Статистика по часам, такого вида:
00 689 3.25% 01 673 3.17% 02 660 3.11% ... 21 878 4.14% 22 816 3.85% 23 836 3.94%
По минутам (почти все тоже самое) Таблица распределения типов запросов от времени и их общее количество.
H\RR| A | MX | AAAA | SRV | ANY | SOA | A6 | TXT | AXFR | IXFR |CNAME | NS |TYPE99| PTR | ----|------|------|------|------|------|------|------|------|------|------|------|------|------|------| 00 | 276| 333| 40| 21| 5| 11| 2| 1| 0| 0| 0| 0| 0| 0| 01 | 246| 338| 44| 20| 4| 10| 4| 1| 0| 0| 0| 5| 1| 0| 02 | 278| 293| 46| 20| 10| 11| 2| 0| 0| 0| 0| 0| 0| 0| 03 | 274| 243| 23| 20| 22| 13| 0| 2| 0| 0| 0| 0| 0| 0| ... 23 | 310| 363| 54| 21| 68| 11| 0| 9| 0| 0| 0| 0| 0| 0| ----|------|------|------|------|------|------|------|------|------|------|------|------|------|------| Sum | 7853| 10664| 1124| 528| 559| 297| 71| 38| 17| 25| 10| 18| 1| 10| ----|------|------|------|------|------|------|------|------|------|------|------|------|------|------|
Скрипт создания такой информации
3. Детально, по домена второго уровня
Такую же табличку распределения запросов хочется сделать для каждого домена, обслуживаемого DNS сервером. Очевидно, что для многих она будет «скромнее», чем общая. Пример:
# $$$$.ru ----|------|------|------|------|------| H\RR| A| SRV| ANY| MX| AAAA| ----|------|------|------|------|------| 00 | 44| 21| | 13| | 01 | 25| 20| | 7| 1| 02 | 54| 20| | 35| | ... 20 | 36| 23| | 31| | 21 | 29| 20| 1| 54| | 22 | 35| 20| 2| 24| | 23 | 29| 21| 8| 18| | ----|------|------|------|------|------| | A| SRV| ANY| MX| AAAA| Sum | 895| 528| 27| 783| 3| ----|------|------|------|------|------|
Скрипт:
Источник http://firstwiki.ru/index.php/%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0_BIND