Настройка 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
То что две программы висят на одном порту, это нормально?
Они на разных интерфейсах