Jump to content
Калькуляторы

bind9 слишком грузит CPU

Имею локалку, где то с 1000 вечернего онлайна.

Стоит в сети DNS сервер, его задача всего лиш резолвить ДНС имена в локальные IP. Резолв всех остальных ДНС имен нельзя делать.

 

И грузит этот бинд9 CPU на 10-25% + ему на пару столько ко же съедает rsyslogd.

syslog растет со страшной скоростью, содержит примерно вот это

 

Mar 11 22:13:06 web named[2438]: client 172.16.120.98#9522: query (cache) 'www.ristex.jp/A/IN' denied

Mar 11 22:13:06 web named[2438]: client 172.16.112.62#2481: query (cache) 'dnl-04.geo.kaspersky.com/A/IN' denied

Mar 11 22:13:06 web named[2438]: client 172.16.100.74#65028: query (cache) 'dnl-00.geo.kaspersky.com/A/IN' denied

Mar 11 22:13:06 web named[2438]: client 172.16.112.62#2482: query (cache) 'dnl-05.geo.kaspersky.com/A/IN' denied

Mar 11 22:13:06 web named[2438]: client 172.16.112.62#2483: query (cache) 'dnl-06.geo.kaspersky.com/A/IN' denied

Mar 11 22:13:06 web named[2438]: client 172.16.120.98#27119: query (cache) 'avdesk.net.ua/A/IN' denied

 

 

named.conf.options содержит вот это

 

 

options {

directory "/var/cache/bind";

listen-on {172.16.0.1;localhost;};

version "Bind";

allow-query {172.16.0.0/16;localhost;};

allow-recursion {localhost;};

allow-transfer {none;};

 

// from bind 9:

// [fetch-glue] is obsolete. In BIND 8, fetch-glue yes caused the

// server to attempt to fetch glue resource records it didn't have

// when constructing the additional data section of a response.

// This is now considered a bad idea and BIND 9 never does it.

 

//fetch-glue no;

 

// If there is a firewall between you and nameservers you want

// to talk to, you might need to uncomment the query-source

// directive below. Previous versions of BIND always asked

// questions using port 53, but BIND 8.1 and later use an unprivileged

// port by default.

 

// query-source address * port 53;

 

// If your ISP provided one or more IP addresses for stable

// nameservers, you probably want to use them as forwarders.

// Uncomment the following block, and insert the addresses replacing

// the all-0's placeholder.

 

//forwarders {

// 192.168.64.1;

// 212.67.2.2;

// };

// auth-nxdomain no;

};

 

 

ядро Linux version 2.6.26-2-amd64 (Debian 2.6.26-21lenny3) (dannf@debian.org) (gcc version 4.1.3 20080704 (prerelease) (Debian 4.1.2-25))

 

Вот в чем тут фишка? ни за что не поверю, что это норм загрузка CPU

 

И ещё

top

 

top - 23:10:46 up 57 min, 1 user, load average: 0.44, 0.43, 0.31

Tasks: 102 total, 1 running, 101 sleeping, 0 stopped, 0 zombie

Cpu(s): 2.9%us, 2.4%sy, 0.0%ni, 94.3%id, 0.0%wa, 0.3%hi, 0.2%si, 0.0%st

Mem: 4054356k total, 1068836k used, 2985520k free, 28448k buffers

Swap: 11880028k total, 0k used, 11880028k free, 803224k cached

 

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

9169 bind 20 0 183m 11m 2312 S 23 0.3 3:26.36 named

2412 root 20 0 181m 1908 916 S 5 0.0 5:19.02 rsyslogd

1 root 20 0 10312 748 620 S 0 0.0 0:00.64 init

2 root 15 -5 0 0 0 S 0 0.0 0:00.00 kthreadd

3 root RT -5 0 0 0 S 0 0.0 0:00.00 migration/0

4 root 15 -5 0 0 0 S 0 0.0 0:00.02 ksoftirqd/0

5 root RT -5 0 0 0 S 0 0.0 0:00.00 watchdog/0

6 root RT -5 0 0 0 S 0 0.0 0:00.00 migration/1

7 root 15 -5 0 0 0 S 0 0.0 0:00.22 ksoftirqd/1

8 root RT -5 0 0 0 S 0 0.0 0:00.00 watchdog/1

9 root 15 -5 0 0 0 S 0 0.0 0:00.42 events/0

10 root 15 -5 0 0 0 S 0 0.0 0:00.48 events/1

11 root 15 -5 0 0 0 S 0 0.0 0:00.00 khelper

46 root 15 -5 0 0 0 S 0 0.0 0:00.10 kblockd/0

47 root 15 -5 0 0 0 S 0 0.0 0:00.04 kblockd/1

49 root 15 -5 0 0 0 S 0 0.0 0:00.00 kacpid

50 root 15 -5 0 0 0 S 0 0.0 0:00.00 kacpi_notify

131 root 15 -5 0 0 0 S 0 0.0 0:00.00 ksuspend_usbd

137 root 15 -5 0 0 0 S 0 0.0 0:00.00 khubd

140 root 15 -5 0 0 0 S 0 0.0 0:00.00 kseriod

185 root 20 0 0 0 0 S 0 0.0 0:00.00 pdflush

186 root 20 0 0 0 0 S 0 0.0 0:00.56 pdflush

187 root 15 -5 0 0 0 S 0 0.0 0:00.00 kswapd0

188 root 15 -5 0 0 0 S 0 0.0 0:00.00 aio/0

189 root 15 -5 0 0 0 S 0 0.0 0:00.00 aio/1

825 root 15 -5 0 0 0 S 0 0.0 0:00.00 ata/0

826 root 15 -5 0 0 0 S 0 0.0 0:00.00 ata/1

827 root 15 -5 0 0 0 S 0 0.0 0:00.00 ata_aux

837 root 15 -5 0 0 0 S 0 0.0 0:00.00 scsi_eh_0

838 root 15 -5 0 0 0 S 0 0.0 0:00.00 scsi_eh_1

944 root 15 -5 0 0 0 S 0 0.0 0:01.32 kjournald

1020 root 16 -4 16916 1124 484 S 0 0.0 0:00.10 udevd

1566 root 15 -5 0 0 0 S 0 0.0 0:00.00 kpsmoused

1749 root 15 -5 0 0 0 S 0 0.0 0:00.00 kjournald

2423 root 20 0 3796 596 476 S 0 0.0 0:00.00 acpid

2458 root 20 0 48864 1168 664 S 0 0.0 0:00.00 sshd

2498 root 20 0 17312 1444 1156 S 0 0.0 0:00.00 mysqld_safe

2535 mysql 20 0 243m 55m 6160 S 0 1.4 0:38.66 mysqld

2536 root 20 0 3780 596 496 S 0 0.0 0:00.00 logger

2856 Debian-e 20 0 42716 1012 612 S 0 0.0 0:00.00 exim4

2868 ntp 20 0 22380 1420 1016 S 0 0.0 0:00.00 ntpd

2880 proftpd 20 0 99.3m 1940 612 S 0 0.0 0:00.02 proftpd

2900 root 20 0 19832 1048 812 S 0 0.0 0:00.04 cron

2931 root 20 0 3796 580 484 S 0 0.0 0:00.00 getty

2932 root 20 0 3796 580 484 S 0 0.0 0:00.00 getty

2933 root 20 0 3796 580 484 S 0 0.0 0:00.00 getty

2934 root 20 0 3796 576 484 S 0 0.0 0:00.00 getty

2935 root 20 0 3796 580 484 S 0 0.0 0:00.00 getty

2936 root 20 0 3796 580 484 S 0 0.0 0:00.00 getty

2953 root 20 0 66068 3120 2476 S 0 0.1 0:00.78 sshd

3366 root 20 0 18748 1824 1356 S 0 0.0 0:00.00 bash

3372 root 20 0 32288 3384 2024 S 0 0.1 0:04.02 mc

3374 root 20 0 18816 1960 1436 S 0 0.0 0:00.44 bash

 

 

Что то тут не правильно, а что?

Share this post


Link to post
Share on other sites

Mar 11 22:13:06 web named[2438]: client 172.16.120.98#9522: query (cache) 'www.ristex.jp/A/IN' denied

Попробуйте отключить логирование и посмотреть, как это повлияет на загрузку.

Share this post


Link to post
Share on other sites

А каков великий смысл запрещать рекурсию, если, судя по потоку запросов, он указан как ресолвер у клиентов ? А если так и надо, то оторвите ему легирование данной ситуации. Кстати, при таком конфиге, если в кеше уже есть A запись для nl-04.geo.kaspersky.com, то 172.16.0.0/16 ее получат из кеша. Вы им запретите тогда и кеш. Ну и вообще поднимите зону . с

* IN A 127.0.0.1 унутре И прицепите ее во вью, отдающуюся 172.16.0.0/16

Share this post


Link to post
Share on other sites
Mar 11 22:13:06 web named[2438]: client 172.16.120.98#9522: query (cache) 'www.ristex.jp/A/IN' denied
Попробуйте отключить логирование и посмотреть, как это повлияет на загрузку.

Погасил rsyslogd, да, он более не грузит CPU )))

а named по прежнему 20% (

 

Как в конфиге bind9 выключить лог? или хотя бы сделать его кратким.

Share this post


Link to post
Share on other sites
А каков великий смысл запрещать рекурсию, если, судя по потоку запросов, он указан как ресолвер у клиентов ? А если так и надо, то оторвите ему легирование данной ситуации. Кстати, при таком конфиге, если в кеше уже есть A запись для nl-04.geo.kaspersky.com, то 172.16.0.0/16 ее получат из кеша. Вы им запретите тогда и кеш. Ну и вообще поднимите зону . с

* IN A 127.0.0.1 унутре И прицепите ее во вью, отдающуюся 172.16.0.0/16

Великий смысл в том, что инет ходит по пппое, а этот как локальный ДНС, ну чтоб оф. сайт работал, чат, торрент и прочее.

Как ему "легирование данной ситуации" ?

Как кеш запретить?

 

named.conf

 

 

// This is the primary configuration file for the BIND DNS server named.

//

// Please read /usr/share/doc/bind/README.Debian for information on the

// structure of BIND configuration files in Debian for BIND versions 8.2.1

// and later, *BEFORE* you customize this configuration file.

//

 

include "/etc/bind/named.conf.options";

 

// reduce log verbosity on issues outside our control

//logging {

// category lame-servers { null; };

// category cname { null; };

//};

 

// prime the server with knowledge of the root servers

//zone "." {

// type hint;

// file "/etc/bind/db.root";

//};

 

// be authoritative for the localhost forward and reverse zones, and for

// broadcast zones as per RFC 1912

 

zone "localhost" {

type master;

file "/etc/bind/db.local";

};

 

zone "127.in-addr.arpa" {

type master;

file "/etc/bind/db.127";

};

 

zone "0.in-addr.arpa" {

type master;

file "/etc/bind/db.0";

};

 

zone "255.in-addr.arpa" {

type master;

file "/etc/bind/db.255";

};

 

Ну и другие зоны удалёны, мало ли кто тут ходит...

 

include "/etc/bind/named.conf.local";

 

 

содержание db.127

 

 

;

; BIND reverse data file for local loopback interface

;

$TTL 604800

@ IN SOA localhost. root.localhost. (

2 ; Serial

604800 ; Refresh

86400 ; Retry

2419200 ; Expire

604800 ) ; Negative Cache TTL

;

@ IN NS localhost.

1.0.0 IN PTR localhost.

 

 

Вот.

 

Yaten, здесь посмотрите: http://www.zytrax.com/books/dns/ch7/logging.html

Ок, спасибо. гугль что то мне не показал эту статью.... наверно не так искал.

Share this post


Link to post
Share on other sites

Добавил в named.conf.options

 

logging{

channel null {

file "/var/log/named/bind.log" versions 3 size 5m;

severity 0;

print-time no;

print-severity no;

print-category no;

};

category default{

null;

};

};

 

syslog так и растет, теми же записями.

Ниче не пойму.

Share this post


Link to post
Share on other sites

Поставьте nsd, там ни рекурсии ни кеша вообще нет и по производительности он хорош.

 

 

PS:Уберите channel null и

 

category queries { null; };
category config { null; };
category database { null;};
category default { null;};
category general {null;};
category notify { null;};

Edited by 2c2i

Share this post


Link to post
Share on other sites

Получилось

logging{

category default{null; };

category queries { null; };

category config { null; };

category database { null;};

category default { null;};

category general {null;};

category notify { null;};

};

 

Ничего не изменилось

Share this post


Link to post
Share on other sites

Включение/выключение логирования запросов делается командой rndc querylog. Включите/выключите и посмотрите загрузку. rsyslog убивать не правильно

Edited by s.lobanov

Share this post


Link to post
Share on other sites

named.conf.options

 

options {

directory "/var/cache/bind";

listen-on {172.16.0.1;localhost;};

version "Bind";

//allow-transfer {none;};

allow-query {172.16.0.0/16;localhost;};

allow-recursion {localhost;};

allow-transfer {none;};

allow-query-cache{localhost;};

 

 

// from bind 9:

// [fetch-glue] is obsolete. In BIND 8, fetch-glue yes caused the

// server to attempt to fetch glue resource records it didn't have

// when constructing the additional data section of a response.

// This is now considered a bad idea and BIND 9 never does it.

 

//fetch-glue no;

 

// If there is a firewall between you and nameservers you want

// to talk to, you might need to uncomment the query-source

// directive below. Previous versions of BIND always asked

// questions using port 53, but BIND 8.1 and later use an unprivileged

// port by default.

 

// query-source address * port 53;

 

// If your ISP provided one or more IP addresses for stable

// nameservers, you probably want to use them as forwarders.

// Uncomment the following block, and insert the addresses replacing

// the all-0's placeholder.

 

//forwarders {

// 192.168.64.1;

// 212.67.2.2;

// };

// auth-nxdomain no;

};

 

logging{

category default{null; };

category queries { null; };

category config { null; };

category database { null;};

category default { null;};

category general {null;};

category notify { null;};

category security { null; };

};

 

 

 

 

В результате имею rsyslogd систему более не грузит, лог не растет, что уже не плохо.

но named по прежнему грузит до 50% CPU.

 

У кого, какие идеи ещё будут?

Share this post


Link to post
Share on other sites

Просто отключать логи глупо, т.к. нужно устранять причины. Должно быть allow-recursion {172.16.0.0/16; localhost;}; Либо разрешите рекурсию на этом сервере (нужен белый IP), либо делайте forwarding на DNS вышестоящего провайдера. Еще стоит убедиться, что на сервере resolv.conf настроен на разрешение через себя, т.е. должно быть nameserver 127.0.0.1.

Edited by photon

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Но клиенты по факту долбят ваш DNS именно запросами, требующими рекурсии (разрешение имен серверов из других сетей). Она у вас запрещена, клиенты продолжают делать запросы, и вы имеете мусор в логах. Нужно резать сами запросы на разрешение любых внешних имен, а не просто запрещать рекурсию.

Edited by photon

Share this post


Link to post
Share on other sites

Повторяю ещё раз. этот ДНС сидит в локальной сети, и раздаётся всем по ДХЦП. Он нужен для резолва локальных ДНС имен в локальные ip адреса. Резолвить интернетовские ДНС имена он не должен, в противном случае получается дыра в системе безопастности, а именно появляется возможность установки DNS тунеля.

 

Клиенты ходят в интернет по ПППоЕ, и у тех, у кого в данный момент интернет не подключен - ясен пень ломятся запросами на локальный. И этот локальный должен дать отлуп всем запросам кроме pupkin.ru и всем ДНС именам 3го уровня из этого домена например.

 

Нужно резать сами запросы на разрешение любых внешних имен, а не просто запрещать рекурсию.
Резать и запрещать в моём понимание - тождественно и этим должен заниматься bind.

Share this post


Link to post
Share on other sites
Резолвить интернетовские ДНС имена он не должен, в противном случае получается дыра в системе безопастности, а именно появляется возможность установки DNS тунеля.
Странная причина. И много у вас клиентов, желающих ходить в Интернет через DNS-туннели? Много ли вообще знающих что такое DNS и туннели?

 

Нужно резать сами запросы на разрешение любых внешних имен, а не просто запрещать рекурсию.
Резать и запрещать в моём понимание - тождественно и этим должен заниматься bind.

Судя по логам в понимании авторов bind это не так. Вы запрещаете рекурсивное разрешение запросов, а не говорите bind-у, что нужно отбрасывать любые запросы на разрешение внешних имен. Поищите в документации какие-то другие ACL на эту тему. Если таких нет, то сервер можно настроить так, чтобы все внешние домены разрешались на какой-то тупой адрес вроде 127.0.0.1. В конце концов можно резать запросы с помощью iptables и модуля string.
Edited by photon

Share this post


Link to post
Share on other sites

В понимании бинда есть blackhole. Но автору оно не подойдет. Бинд вообще будет игнорировать запросы оттуда. А автору нужно туда отвечать на свои зоны. Можно попробовать сделать вью, где описать зону рут - пустую и свои зоны, запретить рекурсию итд. И ее привязать в 172 сети. Скорее всего нагрузку снизит. но чтобы до 0, врядли. Скорее всего искать DNS полегче надо. Который вообще не умеет рекурсию.

 

А сколько вообще запросов ? С кажем в минуту ? (еще неплохо бы проверить что за запросы, если 99% от 1% абонентов и это запросы MXов, то их нужно как то лечить...)

Share this post


Link to post
Share on other sites
сервер можно настроить так, чтобы все внешние домены разрешались на какой-то тупой адрес вроде 127.0.0.1

Расскажите поподробнее, как это сделать в бинде

Share this post


Link to post
Share on other sites

а нафига запрещать рекурсию??? вы боитесь мегаумного хомяка прочитавшего http://xgu.ru/wiki/DNS-tunneling к чему всё это, зачем усложнять?

Share this post


Link to post
Share on other sites

Расскажите поподробнее, как это сделать в бинде

Сейчас попробовал создать фейковую зону "." с соответствующими записями -- не получилось. Лучше действительно поднять вместо bind какой-то простой authoritative-only nameserver, типа tinydns, который в принципе не умеет делать рекурсию.

Edited by photon

Share this post


Link to post
Share on other sites

попробывал iptables-om

 

iptables -A INPUT -i eth0 -p udp --dport 53 -m string --algo kmp --string '1.0.16.172.in-addr.arpa' -j RETURN

iptables -A INPUT -i eth0 -p udp --dport 53 -m string --algo kmp --string 'pupkin.ru' -j RETURN

iptables -A INPUT -i eth0 -p udp --dport 53 -j DROP

 

он все ДНС порезал. наверно строку не правильно вписал... кто как думает? --algo пробывал bm и kmp, одинаково все.

 

Share this post


Link to post
Share on other sites

посмотрел счетчики, под правила

iptables -A INPUT -i eth0 -p udp --dport 53 -m string --algo kmp --string '1.0.16.172.in-addr.arpa' -j RETURN

iptables -A INPUT -i eth0 -p udp --dport 53 -m string --algo kmp --string 'pupkin.ru' -j RETURN

 

пакеты не попадают

Share this post


Link to post
Share on other sites

глюк найден, в адресе pupkin.ru точка не обрабатывается. удалил её и правило начало срабатывать

 

iptables -A INPUT -i eth0 -p udp --dport 53 -m string --algo kmp --string 'in-addr' -j ACCEPT

iptables -A INPUT -i eth0 -p udp --dport 53 -m string --algo kmp --string 'pupkin' -j ACCEPT

iptables -A INPUT -i eth0 -p udp --dport 53 -j DROP

 

И все левые запросы порезаны.

Загрузка CPU bind-ом 0-2%

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this