<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.p3.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0_BIND</id>
	<title>Статистика BIND - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.p3.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0_BIND"/>
	<link rel="alternate" type="text/html" href="https://wiki.p3.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0_BIND&amp;action=history"/>
	<updated>2026-04-15T07:33:03Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.p3.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0_BIND&amp;diff=382&amp;oldid=prev</id>
		<title>TTK: Новая страница: «== Своя статистика BIND == === Почему захотелось === Всегда интересовался DNS и, наконец, захотел…»</title>
		<link rel="alternate" type="text/html" href="https://wiki.p3.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0_BIND&amp;diff=382&amp;oldid=prev"/>
		<updated>2012-08-23T10:58:00Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «== Своя статистика BIND == === Почему захотелось === Всегда интересовался DNS и, наконец, захотел…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Своя статистика BIND ==&lt;br /&gt;
=== Почему захотелось ===&lt;br /&gt;
Всегда интересовался DNS и, наконец, захотелось выяснить кто, когда, как и что спрашивает у DNS серверов о домене. Для этой цели был сделан отдельный VDS здесь, собственно поэтому статья размещается здесь.&lt;br /&gt;
=== Требуется ===&lt;br /&gt;
bind9.&lt;br /&gt;
Как установить - этого полно в интернете. Например, для debian требуется всего одна команда &amp;quot;apt-get install bind9&amp;quot;. Запуск\остановка /etc/init.d/bind9 start\stop.&lt;br /&gt;
=== Настройка ===&lt;br /&gt;
Главное, это собирать информацию о принятых запросах. Файл named.conf.&lt;br /&gt;
 logging {&lt;br /&gt;
     channel query_log {&lt;br /&gt;
         file &amp;quot;/var/log/bind/bind.log&amp;quot;;&lt;br /&gt;
         severity dynamic;&lt;br /&gt;
         print-time yes;&lt;br /&gt;
     };&lt;br /&gt;
     channel main {&lt;br /&gt;
         file &amp;quot;/var/log/bind/main.log&amp;quot;;&lt;br /&gt;
         severity dynamic;&lt;br /&gt;
         print-time yes;&lt;br /&gt;
         print-category yes;&lt;br /&gt;
         print-severity yes;&lt;br /&gt;
     };&lt;br /&gt;
     category queries { query_log; };&lt;br /&gt;
     category xfer-in { main; };&lt;br /&gt;
     category xfer-out { main; };&lt;br /&gt;
     category security { main; };&lt;br /&gt;
     category resolver { main; };&lt;br /&gt;
     category client { main; };&lt;br /&gt;
     category unmatched { main; };&lt;br /&gt;
     category default { main; };&lt;br /&gt;
     category database { main; };&lt;br /&gt;
 };&lt;br /&gt;
Выше я написал все, что собирает мой DNS сервер. Достаточно будет:&lt;br /&gt;
 logging {&lt;br /&gt;
     channel query_log {&lt;br /&gt;
         file &amp;quot;/var/log/bind/bind.log&amp;quot;;&lt;br /&gt;
         severity dynamic;&lt;br /&gt;
         print-time yes;&lt;br /&gt;
     };&lt;br /&gt;
     category queries { query_log; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
== Сбор статистики ==&lt;br /&gt;
=== Подготовка ===&lt;br /&gt;
Я использую очень простой механизм хранения логов bind. Для этого создан отдельный пользователь (adduser), для удобного доступа по ftp (демон proftpd). Внутри домашней директории (например /home/net) расположены еще две /home/net/bind - сюда складываются логи DNS сервера, /home/net/stat - сюда будет помещатся интересующая меня статистика. Сбор логов происходит с помощью php скрипта, запускаемого с помощью cron. Статистика собирается за месяц.&lt;br /&gt;
=== Конфигурация cron ===&lt;br /&gt;
 # m h  dom mon dow   command&lt;br /&gt;
 0 */1 * * * /usr/bin/php /home/net/bind.php &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
 1 */1 * * * /usr/bin/php /home/net/stat1.php &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
 2 */1 * * * /usr/bin/php /home/net/stat2.php &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
 3 */1 * * * /usr/bin/php /home/net/stat3.php &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
 4 */1 * * * /usr/bin/php /home/net/stat4.php &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
Первый скрипт, запускаемый каждый час делает остановку DNS сервера, копирование файла с логом и запуск DNS сервера. Интервал можете изменить по своему усмотрению. Мне все-равно необходимо перезапускать DNS сервер каждый час. Если нужно только обновить зоны, то надо &amp;quot;rndc reload&amp;quot;. Остальный скрипты создают интересующую меня статистику. Запускаются последовательно, чтобы не нагружать сервер. Многие скрипты можно написать более оптимально, но я предлагаю только основу.&lt;br /&gt;
=== bind.php ===&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 	$cfg_src1 = &amp;quot;/var/log/bind/bind.log&amp;quot; ;&lt;br /&gt;
 	$cfg_drop1 = &amp;quot;/home/net/bind/&amp;quot; ;&lt;br /&gt;
 	$f = date(&amp;#039;YmdHis&amp;#039;) ;&lt;br /&gt;
 	$d = date(&amp;#039;Y.m&amp;#039;) ;&lt;br /&gt;
 	if ( !file_exists($cfg_drop1.$d) )&lt;br /&gt;
 		mkdir($cfg_drop1.$d) ;&lt;br /&gt;
 	exec(&amp;#039;/etc/init.d/bind9 stop&amp;#039;) ;&lt;br /&gt;
 	copy( $cfg_src1 , $cfg_drop1.$d.&amp;#039;/&amp;#039;.$f ) ;&lt;br /&gt;
 	exec(&amp;#039;rm &amp;#039;.$cfg_src1) ;&lt;br /&gt;
 	exec(&amp;#039;/etc/init.d/bind9 start&amp;#039;) ;&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
== Статистика ==&lt;br /&gt;
=== 1. Кто, что именно и сколько раз спрашивал ===&lt;br /&gt;
Файл с информацией вида IP адрес [tab] количество запросов.&lt;br /&gt;
Пример:&lt;br /&gt;
 xx.143.5.39             954&lt;br /&gt;
 xxx.177.96.1            858&lt;br /&gt;
 xx.111.180.223          378&lt;br /&gt;
 xxx.92.168.54           373&lt;br /&gt;
 xxx.122.226.27          247&lt;br /&gt;
 xxx.23.19.2             204&lt;br /&gt;
Файл с информацией о том, какими записями сколько раз интересовались.&lt;br /&gt;
Пример:&lt;br /&gt;
 $$.ru         19137&lt;br /&gt;
 $$$$.ru         2969&lt;br /&gt;
 $$$$.ru         1523&lt;br /&gt;
 $$$$.ru         1224&lt;br /&gt;
 $$$$$$.ru               1119&lt;br /&gt;
 $$$$$.ru                1055&lt;br /&gt;
 $$$.ru          1047&lt;br /&gt;
Файл с более детальной информацией, указывающей какими именно типами записей интересовались.&lt;br /&gt;
Пример:&lt;br /&gt;
 A       $$.$$.tj                39&lt;br /&gt;
 AAAA    $$$.$$$$.ru             36&lt;br /&gt;
 AAAA    $$$.$$$.ru              34&lt;br /&gt;
 A       $$$$.ru         32&lt;br /&gt;
 A       $$$.$$$$.ru             31&lt;br /&gt;
 MX      $$$.$$$$.ru             30&lt;br /&gt;
 A       $$$.$$$$$$$.com         30&lt;br /&gt;
 A       $$$$.ru         30&lt;br /&gt;
 A6      $$$.$$$$.ru             29&lt;br /&gt;
PHP-скрипт для создания такой информации:&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 	$cfg_drop = &amp;quot;/home/net/bind/&amp;quot; ;&lt;br /&gt;
 	$cfg_stat = &amp;quot;/home/net/stat/&amp;quot; ;&lt;br /&gt;
 &lt;br /&gt;
 	//$cfg_drop = &amp;quot;D:/Web/bind/bind/&amp;quot; ;&lt;br /&gt;
 	//$cfg_stat = &amp;quot;D:/Web/bind/stat/&amp;quot; ;&lt;br /&gt;
 	&lt;br /&gt;
 	$s_ip = array() ; // IP=&amp;gt;count&lt;br /&gt;
 	$s_host = array() ; //host=&amp;gt;count&lt;br /&gt;
 	$s_query = array() ; //host:RR=&amp;gt;count&lt;br /&gt;
 	&lt;br /&gt;
 	$yy = date(&amp;#039;Y&amp;#039;) ;&lt;br /&gt;
 	$mm = date(&amp;#039;m&amp;#039;) ;&lt;br /&gt;
 	$dd = date(&amp;#039;d&amp;#039;) ;&lt;br /&gt;
 	$cdir = date(&amp;#039;Y.m&amp;#039;) ;&lt;br /&gt;
 	&lt;br /&gt;
 	if ( !file_exists($cfg_drop.$cdir) )&lt;br /&gt;
 		exit ;&lt;br /&gt;
 	$R = scandir($cfg_drop.$cdir) ;&lt;br /&gt;
 	&lt;br /&gt;
 	foreach ( $R as $k=&amp;gt;$v )&lt;br /&gt;
 	{&lt;br /&gt;
 		if ( strlen($v) &amp;lt; 7 ) continue ;&lt;br /&gt;
 		echo &amp;#039;Eval: &amp;#039;.$v.&amp;quot;\r\n&amp;quot; ;&lt;br /&gt;
 		$F = file($cfg_drop.$cdir.&amp;#039;/&amp;#039;.$v) ;&lt;br /&gt;
 		foreach ( $F as $a=&amp;gt;$b )&lt;br /&gt;
 		{&lt;br /&gt;
 			$ps = explode(&amp;#039; &amp;#039;,$b) ;&lt;br /&gt;
 			$tmp = explode(&amp;#039;#&amp;#039;,$ps[3]) ;&lt;br /&gt;
 			$ip = $tmp[0] ;&lt;br /&gt;
 			$host = strtolower($ps[5]) ;&lt;br /&gt;
 			$query = strtoupper($ps[7]).&amp;quot;\t&amp;quot;.$host ;&lt;br /&gt;
 			&lt;br /&gt;
 			if ( isset($s_ip[$ip]) ) $s_ip[$ip]++ ; else $s_ip[$ip] = 1 ;&lt;br /&gt;
 			if ( isset($s_host[$host]) ) $s_host[$host]++ ; else $s_host[$host] = 1 ;&lt;br /&gt;
 			if ( isset($s_query[$query]) ) $s_query[$query]++ ; else $s_query[$query] = 1 ;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	arsort( $s_ip ) ;&lt;br /&gt;
 	arsort( $s_host ) ;&lt;br /&gt;
 	arsort( $s_query ) ;&lt;br /&gt;
 	&lt;br /&gt;
 	$F = @fopen($cfg_stat.$cdir.&amp;#039;.x01.log&amp;#039;,&amp;#039;w+&amp;#039;) ;&lt;br /&gt;
 	if ( $F !== false )&lt;br /&gt;
 	{&lt;br /&gt;
 		foreach ( $s_ip as $a=&amp;gt;$b )&lt;br /&gt;
 			fwrite( $F , $a.&amp;quot;\t\t&amp;quot;.$b.&amp;quot;\n&amp;quot;) ;&lt;br /&gt;
 		fclose( $F ) ;&lt;br /&gt;
 	}&lt;br /&gt;
 	$F = @fopen($cfg_stat.$cdir.&amp;#039;.x02.log&amp;#039;,&amp;#039;w+&amp;#039;) ;&lt;br /&gt;
 	if ( $F !== false )&lt;br /&gt;
 	{&lt;br /&gt;
 		foreach ( $s_host as $a=&amp;gt;$b )&lt;br /&gt;
 			fwrite( $F , $a.&amp;quot;\t\t&amp;quot;.$b.&amp;quot;\n&amp;quot;) ;&lt;br /&gt;
 		fclose( $F ) ;&lt;br /&gt;
 	}&lt;br /&gt;
 	$F = @fopen($cfg_stat.$cdir.&amp;#039;.x03.log&amp;#039;,&amp;#039;w+&amp;#039;) ;&lt;br /&gt;
 	if ( $F !== false )&lt;br /&gt;
 	{&lt;br /&gt;
 		foreach ( $s_query as $a=&amp;gt;$b )&lt;br /&gt;
 			fwrite( $F , $a.&amp;quot;\t\t&amp;quot;.$b.&amp;quot;\n&amp;quot;) ;&lt;br /&gt;
 		fclose( $F ) ;&lt;br /&gt;
 	}&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
--mef 16:16, 26 декабря 2008 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== 2. Распределение запросов по времени ===&lt;br /&gt;
Статистика по часам, такого вида:&lt;br /&gt;
 00      689     3.25%&lt;br /&gt;
 01      673     3.17%&lt;br /&gt;
 02      660     3.11%&lt;br /&gt;
 ...&lt;br /&gt;
 21      878     4.14%&lt;br /&gt;
 22      816     3.85%&lt;br /&gt;
 23      836     3.94%&lt;br /&gt;
По минутам (почти все тоже самое)&lt;br /&gt;
Таблица распределения типов запросов от времени и их общее количество. &lt;br /&gt;
 H\RR|  A   |  MX  | AAAA | SRV  | ANY  | SOA  |  A6  | TXT  | AXFR | IXFR |CNAME |  NS  |TYPE99| PTR  |&lt;br /&gt;
 ----|------|------|------|------|------|------|------|------|------|------|------|------|------|------|&lt;br /&gt;
  00 |   276|   333|    40|    21|     5|    11|     2|     1|     0|     0|     0|     0|     0|     0|&lt;br /&gt;
  01 |   246|   338|    44|    20|     4|    10|     4|     1|     0|     0|     0|     5|     1|     0|&lt;br /&gt;
  02 |   278|   293|    46|    20|    10|    11|     2|     0|     0|     0|     0|     0|     0|     0|&lt;br /&gt;
  03 |   274|   243|    23|    20|    22|    13|     0|     2|     0|     0|     0|     0|     0|     0|&lt;br /&gt;
 ...&lt;br /&gt;
  23 |   310|   363|    54|    21|    68|    11|     0|     9|     0|     0|     0|     0|     0|     0|&lt;br /&gt;
 ----|------|------|------|------|------|------|------|------|------|------|------|------|------|------|&lt;br /&gt;
 Sum |  7853| 10664|  1124|   528|   559|   297|    71|    38|    17|    25|    10|    18|     1|    10|&lt;br /&gt;
 ----|------|------|------|------|------|------|------|------|------|------|------|------|------|------|&lt;br /&gt;
Скрипт создания такой информации&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 	$cfg_drop = &amp;quot;/home/net/bind/&amp;quot; ;&lt;br /&gt;
 	$cfg_stat = &amp;quot;/home/net/stat/&amp;quot; ;&lt;br /&gt;
 	&lt;br /&gt;
 	//$cfg_drop = &amp;quot;D:/Web/bind/bind/&amp;quot; ;&lt;br /&gt;
 	//$cfg_stat = &amp;quot;D:/Web/bind/stat/&amp;quot; ;&lt;br /&gt;
 &lt;br /&gt;
 	function i2 ( $n )&lt;br /&gt;
 	{&lt;br /&gt;
 		$n = (int)$n ;&lt;br /&gt;
 		if ( $n &amp;gt; 9 ) return (string)$n ; else return &amp;#039;0&amp;#039;.$n ;&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	$s_hour = array() ; //hour-&amp;gt;count&lt;br /&gt;
 	for ( $i = 0 ; $i &amp;lt; 24 ; $i++ )&lt;br /&gt;
 		$s_hour[i2($i)] = 0 ;&lt;br /&gt;
 	$s_min = array() ; //HH:MM-&amp;gt;count&lt;br /&gt;
 	for ( $h = 0 ; $h &amp;lt; 24 ; $h++ )&lt;br /&gt;
 		for ( $i = 0 ; $i &amp;lt; 60 ; $i++ )&lt;br /&gt;
 			$s_min[i2($h).&amp;#039;:&amp;#039;.i2($i)] = 0 ;&lt;br /&gt;
 	&lt;br /&gt;
 	$s_rrs = array() ; //Only RR&lt;br /&gt;
 	$s_hrr = array() ; //(HOUR:RR)-&amp;gt;count ;&lt;br /&gt;
 	&lt;br /&gt;
 	$yy = date(&amp;#039;Y&amp;#039;) ;&lt;br /&gt;
 	$mm = date(&amp;#039;m&amp;#039;) ;&lt;br /&gt;
 	$dd = date(&amp;#039;d&amp;#039;) ;&lt;br /&gt;
 	$cdir = date(&amp;#039;Y.m&amp;#039;) ;&lt;br /&gt;
 	&lt;br /&gt;
 	if ( !file_exists($cfg_drop.$cdir) )&lt;br /&gt;
 		exit ;&lt;br /&gt;
 	$R = scandir($cfg_drop.$cdir) ;&lt;br /&gt;
 	&lt;br /&gt;
 	foreach ( $R as $k=&amp;gt;$v )&lt;br /&gt;
 	{&lt;br /&gt;
 		if ( strlen($v) &amp;lt; 7 ) continue ;&lt;br /&gt;
 		echo &amp;#039;Eval: &amp;#039;.$v.&amp;quot;\r\n&amp;quot; ;&lt;br /&gt;
 		$F = file($cfg_drop.$cdir.&amp;#039;/&amp;#039;.$v) ;&lt;br /&gt;
 		foreach ( $F as $a=&amp;gt;$b )&lt;br /&gt;
 		{&lt;br /&gt;
 			$ps = explode(&amp;#039; &amp;#039;,$b) ;&lt;br /&gt;
 			$A1 = substr($ps[1],0,2) ;&lt;br /&gt;
 			$A2 = substr($ps[1],0,5) ;&lt;br /&gt;
 			$s_hour[$A1]++ ;&lt;br /&gt;
 			$s_min[$A2]++ ;&lt;br /&gt;
 			&lt;br /&gt;
 			$RR = strtoupper( $ps[7] ) ;&lt;br /&gt;
 			if ( !isset($s_rrs[$RR]) ) $s_rrs[$RR]=1; else $s_rrs[$RR]++ ;&lt;br /&gt;
 			if ( !isset($s_hrr[$A1.$RR])) $s_hrr[$A1.$RR]=1; else $s_hrr[$A1.$RR]++ ;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	$ALL = 0 ;&lt;br /&gt;
 	for ( $i = 0 ; $i &amp;lt; 24 ; $i++ )&lt;br /&gt;
 		$ALL += $s_hour[i2($i)] ;&lt;br /&gt;
 	if ( $ALL == 0 )&lt;br /&gt;
 		exit ;&lt;br /&gt;
 	&lt;br /&gt;
 	$F = @fopen($cfg_stat.$cdir.&amp;#039;.z01.log&amp;#039;,&amp;#039;w+&amp;#039;) ;&lt;br /&gt;
 	if ( $F !== false )&lt;br /&gt;
 	{&lt;br /&gt;
 		foreach ( $s_hour as $a=&amp;gt;$b )&lt;br /&gt;
 			fwrite( $F , $a.&amp;quot;\t&amp;quot;.$b.&amp;quot;\t&amp;quot;.sprintf(&amp;quot;%2.2f&amp;quot;,100*$b/$ALL).&amp;quot;%\n&amp;quot;) ;&lt;br /&gt;
 		fclose( $F ) ;&lt;br /&gt;
 	}&lt;br /&gt;
 	arsort( $s_min ) ;&lt;br /&gt;
 	$F = @fopen($cfg_stat.$cdir.&amp;#039;.z02.log&amp;#039;,&amp;#039;w+&amp;#039;) ;&lt;br /&gt;
 	if ( $F !== false )&lt;br /&gt;
 	{&lt;br /&gt;
 		foreach ( $s_min as $a=&amp;gt;$b )&lt;br /&gt;
 			fwrite( $F , $a.&amp;quot;\t&amp;quot;.$b.&amp;quot;\t&amp;quot;.sprintf(&amp;quot;%2.4f&amp;quot;,100*$b/$ALL).&amp;quot;%\n&amp;quot;) ;&lt;br /&gt;
 		fclose( $F ) ;&lt;br /&gt;
 	}&lt;br /&gt;
 	$F = @fopen($cfg_stat.$cdir.&amp;#039;.z03.log&amp;#039;,&amp;#039;w+&amp;#039;) ;&lt;br /&gt;
 	if ( $F !== false )&lt;br /&gt;
 	{&lt;br /&gt;
 		fwrite( $F , &amp;quot;H\RR|&amp;quot;) ;&lt;br /&gt;
 		foreach ( $s_rrs as $a=&amp;gt;$b )&lt;br /&gt;
 			fwrite( $F , str_pad($a,6,&amp;quot; &amp;quot;,STR_PAD_BOTH).&amp;quot;|&amp;quot; ) ;&lt;br /&gt;
 		fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 		fwrite( $F , &amp;quot;----|&amp;quot;) ;&lt;br /&gt;
 		foreach ( $s_rrs as $a=&amp;gt;$b )&lt;br /&gt;
 			fwrite( $F , &amp;quot;------|&amp;quot; ) ;&lt;br /&gt;
 		fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 		for ( $i = 0 ; $i &amp;lt; 24 ; $i++ )&lt;br /&gt;
 		{&lt;br /&gt;
 			fwrite( $F , &amp;#039; &amp;#039;.i2($i).&amp;#039; |&amp;#039; ) ;&lt;br /&gt;
 			foreach ( $s_rrs as $a=&amp;gt;$b )&lt;br /&gt;
 			{&lt;br /&gt;
 				if ( isset($s_hrr[i2($i).$a])) $k = $s_hrr[i2($i).$a] ; else $k = 0 ;&lt;br /&gt;
 				fwrite( $F , str_pad($k,6,&amp;quot; &amp;quot;,STR_PAD_LEFT).&amp;quot;|&amp;quot; ) ;&lt;br /&gt;
 			}&lt;br /&gt;
 			fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 		}&lt;br /&gt;
 		fwrite( $F , &amp;quot;----|&amp;quot;) ;&lt;br /&gt;
 		foreach ( $s_rrs as $a=&amp;gt;$b )&lt;br /&gt;
 			fwrite( $F , &amp;quot;------|&amp;quot; ) ;&lt;br /&gt;
 		fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 		fwrite( $F , &amp;quot;Sum |&amp;quot;) ;&lt;br /&gt;
 		foreach ( $s_rrs as $a=&amp;gt;$b )&lt;br /&gt;
 			fwrite( $F , str_pad($b,6,&amp;quot; &amp;quot;,STR_PAD_LEFT).&amp;quot;|&amp;quot; ) ;&lt;br /&gt;
 		fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 		fwrite( $F , &amp;quot;----|&amp;quot;) ;&lt;br /&gt;
 		foreach ( $s_rrs as $a=&amp;gt;$b )&lt;br /&gt;
 			fwrite( $F , &amp;quot;------|&amp;quot; ) ;&lt;br /&gt;
 		fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 		fclose( $F ) ;&lt;br /&gt;
 	}&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
=== 3. Детально, по домена второго уровня ===&lt;br /&gt;
Такую же табличку распределения запросов хочется сделать для каждого домена, обслуживаемого DNS сервером. Очевидно, что для многих она будет &amp;quot;скромнее&amp;quot;, чем общая.&lt;br /&gt;
Пример:&lt;br /&gt;
 # $$$$.ru&lt;br /&gt;
 ----|------|------|------|------|------|&lt;br /&gt;
 H\RR|     A|   SRV|   ANY|    MX|  AAAA|&lt;br /&gt;
 ----|------|------|------|------|------|&lt;br /&gt;
  00 |    44|    21|      |    13|      |&lt;br /&gt;
  01 |    25|    20|      |     7|     1|&lt;br /&gt;
  02 |    54|    20|      |    35|      |&lt;br /&gt;
 ...&lt;br /&gt;
  20 |    36|    23|      |    31|      |&lt;br /&gt;
  21 |    29|    20|     1|    54|      |&lt;br /&gt;
  22 |    35|    20|     2|    24|      |&lt;br /&gt;
  23 |    29|    21|     8|    18|      |&lt;br /&gt;
 ----|------|------|------|------|------|&lt;br /&gt;
     |     A|   SRV|   ANY|    MX|  AAAA|&lt;br /&gt;
 Sum |   895|   528|    27|   783|     3|&lt;br /&gt;
 ----|------|------|------|------|------|&lt;br /&gt;
Скрипт:&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 	$cfg_drop = &amp;quot;/home/net/bind/&amp;quot; ;&lt;br /&gt;
 	$cfg_stat = &amp;quot;/home/net/stat/&amp;quot; ;&lt;br /&gt;
 	&lt;br /&gt;
 	//$cfg_drop = &amp;quot;D:/Web/bind/bind/&amp;quot; ;&lt;br /&gt;
 	//$cfg_stat = &amp;quot;D:/Web/bind/stat/&amp;quot; ;&lt;br /&gt;
 &lt;br /&gt;
 	function i2 ( $n )&lt;br /&gt;
 	{&lt;br /&gt;
 		$n = (int)$n ;&lt;br /&gt;
 		if ( $n &amp;gt; 9 ) return (string)$n ; else return &amp;#039;0&amp;#039;.$n ;&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	$s_2L  = array() ; // Only 2L domains&lt;br /&gt;
 	$s_hrr = array() ; // [2L]-&amp;gt;HOUR:RR-&amp;gt;count ;&lt;br /&gt;
 	$s_rrs = array() ; // [2L]Only RR&lt;br /&gt;
 	&lt;br /&gt;
 	$yy = date(&amp;#039;Y&amp;#039;) ;&lt;br /&gt;
 	$mm = date(&amp;#039;m&amp;#039;) ;&lt;br /&gt;
 	$dd = date(&amp;#039;d&amp;#039;) ;&lt;br /&gt;
 	$cdir = date(&amp;#039;Y.m&amp;#039;) ;&lt;br /&gt;
 	&lt;br /&gt;
 	if ( !file_exists($cfg_drop.$cdir) )&lt;br /&gt;
 		exit ;&lt;br /&gt;
 	$R = scandir($cfg_drop.$cdir) ;&lt;br /&gt;
 	&lt;br /&gt;
 	foreach ( $R as $k=&amp;gt;$v )&lt;br /&gt;
 	{&lt;br /&gt;
 		if ( strlen($v) &amp;lt; 7 ) continue ;&lt;br /&gt;
 		echo &amp;#039;Eval: &amp;#039;.$v.&amp;quot;\r\n&amp;quot; ;&lt;br /&gt;
 		$F = file($cfg_drop.$cdir.&amp;#039;/&amp;#039;.$v) ;&lt;br /&gt;
 		foreach ( $F as $a=&amp;gt;$b )&lt;br /&gt;
 		{&lt;br /&gt;
 			$ps = explode(&amp;#039; &amp;#039;,$b) ;&lt;br /&gt;
 			$A1 = substr($ps[1],0,2) ;&lt;br /&gt;
 			$DOM = explode( &amp;#039;.&amp;#039; , $ps[5] ) ;&lt;br /&gt;
 			$DOMk = count ( $DOM ) ;&lt;br /&gt;
 			if ( $DOMk &amp;lt; 2 )&lt;br /&gt;
 				continue ;&lt;br /&gt;
 			$DOM = strtolower($DOM[$DOMk-2].&amp;#039;.&amp;#039;.$DOM[$DOMk-1]) ;&lt;br /&gt;
 			if ( !isset($s_2L[$DOM] ) )&lt;br /&gt;
 			{&lt;br /&gt;
 				$s_2L[$DOM] = 1 ;&lt;br /&gt;
 				$s_hrr[$DOM] = array() ;&lt;br /&gt;
 				$s_rrs[$DOM] = array() ;&lt;br /&gt;
 			}&lt;br /&gt;
 			else &lt;br /&gt;
 				$s_2L[$DOM]++ ;&lt;br /&gt;
 			$RR = strtoupper( $ps[7] ) ;&lt;br /&gt;
 			if ( !isset($s_rrs[$DOM][$RR]) ) $s_rrs[$DOM][$RR]=1; else $s_rrs[$DOM][$RR]++ ;&lt;br /&gt;
 			if ( !isset($s_hrr[$DOM][$A1.$RR])) $s_hrr[$DOM][$A1.$RR]=1; else $s_hrr[$DOM][$A1.$RR]++ ;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	if ( !file_exists($cfg_stat.$cdir ) )&lt;br /&gt;
 		@mkdir( $cfg_stat.$cdir ) ;&lt;br /&gt;
 	if ( !file_exists($cfg_stat.$cdir ) )&lt;br /&gt;
 		exit ;&lt;br /&gt;
 	&lt;br /&gt;
 	foreach ( $s_2L as $aaa=&amp;gt;$bbb )&lt;br /&gt;
 	{&lt;br /&gt;
 		$F = @fopen($cfg_stat.$cdir.&amp;#039;/&amp;#039;.$aaa.&amp;#039;.log&amp;#039;,&amp;#039;w+&amp;#039;) ;&lt;br /&gt;
 		if ( $F !== false )&lt;br /&gt;
 		{&lt;br /&gt;
 			fwrite( $F , &amp;quot;# $aaa\n&amp;quot; ) ;&lt;br /&gt;
 			fwrite( $F , &amp;quot;----|&amp;quot;) ;&lt;br /&gt;
 			foreach ( $s_rrs[$aaa] as $a=&amp;gt;$b )&lt;br /&gt;
 				fwrite( $F , &amp;quot;------|&amp;quot; ) ;&lt;br /&gt;
 			fwrite( $F , &amp;quot;\n&amp;quot; ) ;			&lt;br /&gt;
 			fwrite( $F , &amp;quot;H\RR|&amp;quot;) ;&lt;br /&gt;
 			foreach ( $s_rrs[$aaa] as $a=&amp;gt;$b )&lt;br /&gt;
 				fwrite( $F , str_pad($a,6,&amp;quot; &amp;quot;,STR_PAD_LEFT).&amp;quot;|&amp;quot; ) ;&lt;br /&gt;
 			fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 			fwrite( $F , &amp;quot;----|&amp;quot;) ;&lt;br /&gt;
 			foreach ( $s_rrs[$aaa] as $a=&amp;gt;$b )&lt;br /&gt;
 				fwrite( $F , &amp;quot;------|&amp;quot; ) ;&lt;br /&gt;
 			fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 			for ( $i = 0 ; $i &amp;lt; 24 ; $i++ )&lt;br /&gt;
 			{&lt;br /&gt;
 				fwrite( $F , &amp;#039; &amp;#039;.i2($i).&amp;#039; |&amp;#039; ) ;&lt;br /&gt;
 				foreach ( $s_rrs[$aaa] as $a=&amp;gt;$b )&lt;br /&gt;
 				{&lt;br /&gt;
 					if ( isset($s_hrr[$aaa][i2($i).$a])) $k = $s_hrr[$aaa][i2($i).$a] ; else $k = &amp;#039;&amp;#039; ;&lt;br /&gt;
 					fwrite( $F , str_pad($k,6,&amp;quot; &amp;quot;,STR_PAD_LEFT).&amp;quot;|&amp;quot; ) ;&lt;br /&gt;
 				}&lt;br /&gt;
 				fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 			}&lt;br /&gt;
 			fwrite( $F , &amp;quot;----|&amp;quot;) ;&lt;br /&gt;
 			foreach ( $s_rrs[$aaa] as $a=&amp;gt;$b )&lt;br /&gt;
 				fwrite( $F , &amp;quot;------|&amp;quot; ) ;&lt;br /&gt;
 			fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 			fwrite( $F , &amp;quot;    |&amp;quot;) ;&lt;br /&gt;
 			foreach ( $s_rrs[$aaa] as $a=&amp;gt;$b )&lt;br /&gt;
 				fwrite( $F , str_pad($a,6,&amp;quot; &amp;quot;,STR_PAD_LEFT).&amp;quot;|&amp;quot; ) ;&lt;br /&gt;
 			fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 			fwrite( $F , &amp;quot;Sum |&amp;quot;) ;&lt;br /&gt;
 			foreach ( $s_rrs[$aaa] as $a=&amp;gt;$b )&lt;br /&gt;
 			fwrite( $F , str_pad($b,6,&amp;quot; &amp;quot;,STR_PAD_LEFT).&amp;quot;|&amp;quot; ) ;&lt;br /&gt;
 			fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 			fwrite( $F , &amp;quot;----|&amp;quot;) ;&lt;br /&gt;
 			foreach ( $s_rrs[$aaa] as $a=&amp;gt;$b )&lt;br /&gt;
 				fwrite( $F , &amp;quot;------|&amp;quot; ) ;&lt;br /&gt;
 			fwrite( $F , &amp;quot;\n&amp;quot; ) ;&lt;br /&gt;
 			fclose( $F ) ;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Сервисы]]&lt;/div&gt;</summary>
		<author><name>TTK</name></author>
	</entry>
</feed>