Настройка DNS-сервера PowerDNS

Часть 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

2 Comments

Leave a Reply