Настройка DNS-сервера PowerDNS
Рубрика: DNS | Дата: 29 Авг 2009
Часть 0. Зачем?
Недостатков у BIND’a много – большое число уязвимостей, которые в нем регулярно находят (многие из них критические), неудобное хранение зон и просто некоторая глюкавость.
Что же мы имеем в случае PowerDNS? Работу с SQL(MySQL, PgSQL), Oracle, несколько удобных веб-шеллов.
Часть 1. Установка
Устанавливаем из портов:
snake-hostel5# make search name="powerdns"
Port: powerdns-2.9.21
Path: /usr/ports/dns/powerdns
Info: An advanced DNS server with multiple backends including SQL
Maint: tremere@cainites.net
B-deps: boost-1.34.1 gettext-0.16.1_3 gmake-3.81_2 libiconv-1.11_1 libtool-1.5.24 postgresql-client-8.1.10
R-deps: gettext-0.16.1_3 libiconv-1.11_1 postgresql-client-8.1.10
WWW: http://www.powerdns.com/
Port: powerdns-recursor-3.1.4_6
Path: /usr/ports/dns/powerdns-recursor
Info: An advanced DNS recursor
Maint: sten@blinkenlights.nl
B-deps: boost-1.34.1 gettext-0.16.1_3 gmake-3.81_2 libiconv-1.11_1
R-deps:
WWW: http://www.powerdns.com
Первое – сам сервер, второе – резольвер.
Часть 2. Настройка
Конфиг находится тут: /usr/local/etc/pdns/pdns.conf
Нам важны следующие строки:
# Разрешить трансфер зон для
allow-axfr-ips=0.0.0.0/0
# Разрешить запросы с
allow-recursion=0.0.0.0/0
# Сколько секунд хранить записи в кеше PacketCache
cache-ttl=20
# Директория с конфигурационными файлами
config-dir=/usr/local/etc
# Консоль для отладки
control-console=no
# Режим демона (везде советуют отключать)
daemon=no
# SOA запись по умолчанию. Используется, если иное не указано в параметрах зоны.
default-soa-name=ns1.hostel5.ru
# TTL по умолчанию. Используется, если иное не указано в параметрах зоны.
default-ttl=3600
# Отключить TCP запросы.
disable-tcp=no
# Включить guardian, подробности: http://doc.powerdns.com/guardian.html
guardian=no
# Тип используемой базы данных и параметры для подключения
launch=gmysql
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-user=powerdns
gmysql-dbname=powerdns
gmysql-password=mypass
# Интерфейс, на котором будет висеть сервер.
local-address= 10.12.51.11
# Порт, на котором будет висеть сервер.
local-port=53
#Настройки логирования:
# Расширенное логирование.
log-dns-details=/var/log/pdns/pdns-details.log
# Логировать неудачные апдейты зон.
log-failed-updates=/var/log/pdns/pdns-fail.log
# Файл, куда писать лог
logfile=/var/log/pdns/pdns.log
# log-facility для логирования через syslog
# logging-facility=
# Уровень логирования от 0 до 9 (0 - не логировать ничего, 9 - логировать всё).
loglevel=9
# Логировать все приходящие запросы
query-logging=yes
# Логировать в лог файл, указанный в директиве logfile (только для Windows систем)
use-logfile=yes
# Работать в качестве master сервера
# master=yes
# Максимальное количества запросов в очереди.
max-queue-length=5000
# Максимальное количество одновременных TCP соединений
max-tcp-connections=10
# Сколько (максимально) миллисекунд держать запрос в очереди
queue-limit=1500
# Сколько секунд хранить в кеше рекурсивные запросы
recursive-cache-ttl=10
# Если включено - рекурсивные запросы будут передваться на обработку рекурсору.
recursor=127.0.0.1
# В качестве рекурсора можно указать сервера провайдера, тогда рекурсивные запросы поуйдут через них
# Запускать сервер от определенной группы
setgid=pdns
# Запускать сервер от определенного пользователя(нужно создать вручную)
setuid=pdns
# Разрешить использование slave-серверов
# slave=no
# Интервал для проверки обновлений в зонах,
# подробности: http://doc.powerdns.com/generic-mypgsql-backends.html#AEN5779
# slave-cycle-interval=60
# SOA expire по умолчанию. Используется, если иное не указано в параметрах зоны.
soa-expire-default=604800
# SOA minimum TTL по умолчанию. Используется, если иное не указано в параметрах зоны.
soa-minimum-ttl=3600
# SOA refresh по умолчанию. Используется, если иное не указано в параметрах зоны.
soa-refresh-default=10800
# SOA retry по умолчанию. Используется, если иное не указано в параметрах зоны.
soa-retry-default=3600
# Директория с сокетом
socket-dir=/var/run
# Сообщать версию сервера клиентам (full - сообщать полную версию, anonymous - не сообщать, powerdns - сообщать “served by PowerDNS” без указания версии, custom - свой вариант)
version-string=powerdns
# Включить встроенный вебсервер, подробности: http://doc.powerdns.com/monitoring.html
webserver=yes
# Может оказаться полезным для просмотра статистики
# IP адрес на котором будет слушать встроенный вебсервер
webserver-address=10.12.51.11
# Пароль для доступа к вебсерверу
# webserver-password=
# Порт на котором будет слушать встроенный вебсервер
webserver-port=8081
# Показывать дополнительную информацию в мониторинге
webserver-print-arguments=yes
Настраиваем резольвер: (/usr/local/etc/pdns/recursor.conf)
allow-from=127.0.0.0/8, 10.0.0.0/8 (только своя локальная сеть)
# Hint файл, его можно взять из BIND /var/named/etc/namedb /named.root,
# или ftp://ftp.rs.internic.net/domain/root.zone.gz
hint-file=/usr/local/etc/pdns/root.zone
# Адрес который надо слушать указываем только 127.0.0.1, и ничего лишнего
local-address=127.0.0.1
# Порт который надо слушать, по умолчанию 53
local-port=53
max-tcp-clients=128
# Не забудьте создать юзера pdns_recursor в группе pdns
setgid=pdns
setuid=pdns_recursor
socket-dir=/var/run/
version-string=
PowerDNS Recursor 3.1.7 $Id: pdns_recursor.cc 1200 2008-06-14 21:11:33Z ahu $
Теперь нужно создать базу в MySQL:
mysql -u root -p
#Создаем базу и привелегии
CREATE DATABASE powerdns;
GRANT ALL ON powerdns.* TO 'powerdns'@'localhost' IDENTIFIED BY 'mypass';
GRANT ALL ON powerdns.* TO 'powerdns'@'localhost.localdomain' IDENTIFIED BY 'mypass';
FLUSH PRIVILEGES;
USE powerdns;
#Таблица для доменов
CREATE TABLE domains (
id INT auto_increment,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
primary key (id)
);
#Создаем индекс для таблицы
CREATE UNIQUE INDEX name_index ON domains(name);
#Таблица записей
CREATE TABLE records (
id INT auto_increment,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(6) DEFAULT NULL,
content VARCHAR(255) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
primary key(id)
);
#Создаем индексы для таблицы
CREATE INDEX rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
#Таблица мастера зон
CREATE TABLE supermasters (
ip VARCHAR(25) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) DEFAULT NULL
);
quit;
Часть 3. Запуск
Скрипт для запуска лучше немного поправить (спасибо salimk):
#!/bin/sh
#
# PROVIDE: pdns
# REQUIRE: LOGIN
. /etc/rc.subr
# set defaults
pdns_enable=${pdns_enable:-"NO"}
#UID и GID pdns из ВАШЕГО /etc/passwd
pdns_uid=1007
pdns_gid=1007
name=pdns
rcvar=`set_rcvar`
start_cmd="pdns_start"
stop_cmd="pdns_stop"
load_rc_config ${name}
pdns_start ()
{
echo "Starting PowerDNS server"
/usr/local/sbin/pdns_server --setgid=${pdns_gid} \
--setuid=${pdns_gid} --daemon=no --guardian=no \
--control-console --loglevel=9 > /dev/null &
}
pdns_stop ()
{
echo "Stopping PowerDNS server"
pidfile=/var/run/pdns.pid
kill `cat $pidfile`
}
run_rc_command "$1"
Часть 4. Управление
Удобней всего через веб-админку. Например через PowerAdmin. Найти можно в портах. Находим, ставим – админка готова к работе. (пароль/пользователь по умолчанию admin/admin). В ней добавляем прямые и обратные зоны и радуемся жизни.
P.S. Небольшая информация, “чтобы не забыть”
В PowerDNS есть такое понятие как supermaster. В общем случае нужно прописывать зону на мастере и слейве. Когда слейв получит от мастера notify, он запросит у мастера записи из этой зоны. Но если сервер, от которого пришел notify, будет обнаружен в списке supermasters, и такой зоны на слейве не будет описано, она создастся автоматически. И потом в нее будут добавлены записи с мастера. Это приятно упрощает жизнь В табличке запись довольно простая – ip мастера, имя слейва (ns2.example.org), имя аккаунта (на работу никак не влияет – просто будет фигурировать в описании зоны; удобно для указания клиента, например). (с) The WebDevil
20 сентября 2009 в 1:40
Весьма навороченно получается. У меня наверное не найдется задач на такое.
20 сентября 2009 в 7:15
На самом деле не так уж все плохо
таблицы можно сделать заранее, и потом просто скормить через тот же phpmyadmin. В качестве резольвера можно использовать сервера провайдера. Ну и плюс ко всему удобная веб-админка
28 сентября 2009 в 14:59
Что то я никак общий язык с этим powerdns найти не могу. Установил и базу и pdns и админку к нему. Не ставил только резольвер (recursor.conf). Но я никак до них добится не могу (( по netstat -an вижу что слушается порт, но только с 127.0.0.1, хотя в iptables открыл 53 порт по tcp и udp.
Суть вопроса в том.. как делегировать домены на сервера? И как назначить ns1 на один ip, а ns2 на второй =)
28 сентября 2009 в 16:23
и по-моему у Вас ошибка, так как pdns и pdns_recursor не могут одновременно слушать 53 порт
28 сентября 2009 в 16:43
recursor висит только на localhost, pdns его и не слушает
Соответственно, если слушается только он, значит что-то у вас не так. Посмотрите в процессах, запущен ли pdns. pdns кстати не запускается при работающем recursor
28 сентября 2009 в 16:50
Ага, ошибку нашёл.
я указывал в конфиге pdns: local-address=127.0.0.1, в связи с этим у меня ничего корректно из вне и не работало, поменял на ip адрес сервера и вроде как всё заработало =)
Кстати у меня ещё один вопрос, может быть Вы в курсе..
DNS сервера должны быть в разных сетях класса “C”, так как корректно настраивать конфиг если оба ip висят на одной машине? И оба ns хочу разместить на одном сервере.
28 сентября 2009 в 17:43
Позвольте, а зачем? Вы хотите иметь две копии powerdns на одной машине? или чтобы машина имела два имени ns1 и ns2
28 сентября 2009 в 20:51
Хочу что бы на одной машине был ns1.domain.ru и ns2.domain.ru =) И пока не совсем понимаю как это реализовать =)
30 сентября 2009 в 5:18
Пропишите машине две NS записи, в чем проблема?
5 октября 2009 в 11:44
всё-таки я запутлася ) сделал так, на одном сервере поднял pdns + precursor(по идее ns1), на втором pdns (по идее ns2)
Юзаю одну базу на 1ом сервер, но как сказать второму серверу (ns2) тянуть записи с 1ого сервера =)
5 октября 2009 в 13:40
упс.. сори, базы у каждого своя.
5 октября 2009 в 15:33
ура ) разобрался ) все спасибо )
11 августа 2010 в 18:42
а есть манулаы по настройке powerdns под win? ссыль обязательна