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