(c)http://www.dwolfix.ru/uctanovka-i-nastroyka-dns-servera-powerdns.html
PowerDNS представляет собой высокопроизводительный DNS-сервер, лицензируемый под лицензией GPL
Выбор PowerDNS был обусловлен гибкой архитектурой хранения/доступа к данным, которая может получать DNS информацию с любого источника данных. Это включает в себя файлы, файлы зон BIND, реляционные БД или директории LDAP.
1. Устанавливаем:
# cd /usr/ports/dns/powerdns
# make install clean
Базу доменов держим в MySQL, в диалоге настройки выбираем только его.
2. Создаем БД в MySQL
# mysql -u root -p
CREATE DATABASE powerdns;
GRANT ALL ON powerdns.* TO 'powerdns'@'localhost' IDENTIFIED BY 'mypass';
FLUSH PRIVILEGES;
Стоит отметить, что создание таблиц в БД из прилагаемых скриптов приводит в дальнейшем к неправильному формированию SOA,
в результате чего внешние сервера видят все время одну и ту же версию зоны и не считают нужным обновляться.
После некоторой модификации, с учетом рекомендаций, получаем скрипт:
*****
SET SESSION sql_mode='ANSI';
CREATE TABLE "domains" (
"id" INTEGER NOT NULL AUTO_INCREMENT,
"name" VARCHAR(255) NOT NULL,
"type" VARCHAR(6) NOT NULL,
"master" VARCHAR(40) NOT NULL DEFAULT '',
"account" VARCHAR(40) NOT NULL DEFAULT '',
"last_check" INTEGER DEFAULT NULL,
"notified_serial" INTEGER DEFAULT NULL,
"auto_serial" INTEGER NOT NULL DEFAULT 0,
"status" CHAR(1) NOT NULL DEFAULT 'A',
CONSTRAINT "pdns_pk_domains_id"
PRIMARY KEY ("id"),
CONSTRAINT "pdns_unq_domains_name"
UNIQUE ("name")
) type=InnoDB;
CREATE INDEX "pdns_idx_domains_status_type" ON "domains" ("status","type");
CREATE TABLE "records" (
"id" INTEGER NOT NULL AUTO_INCREMENT,
"domain_id" INTEGER NOT NULL,
"name" VARCHAR(255) NOT NULL,
"type" VARCHAR(6) NOT NULL,
"content" VARCHAR(255) NOT NULL,
"ttl" INTEGER DEFAULT NULL,
"prio" INTEGER DEFAULT NULL,
"change_date" INTEGER(11) DEFAULT NULL,
CONSTRAINT "pdns_pk_records_id"
PRIMARY KEY ("id"),
CONSTRAINT "pdns_fk_records_domainid"
FOREIGN KEY ("domain_id")
REFERENCES "domains" ("id")
ON UPDATE CASCADE
ON DELETE CASCADE
) type=InnoDB;
CREATE INDEX "pdns_idx_records_name_type" ON "records" ("name","type");
CREATE INDEX "pdns_idx_records_type" ON "records" ("type");
CREATE TABLE "supermasters" (
"ip" VARCHAR(40) NOT NULL,
"nameserver" VARCHAR(255) NOT NULL,
"account" VARCHAR(40) NOT NULL DEFAULT ''
);
CREATE INDEX "pdns_idx_smaster_ip_ns" ON "supermasters" ("ip","nameserver");
GRANT SELECT ON "supermasters" TO "powerdns";
GRANT ALL ON "domains" TO "powerdns";
GRANT ALL ON "records" TO "powerdns";
DELIMITER :
CREATE TRIGGER "pdns_trig_records_insert"
AFTER INSERT ON "records"
FOR EACH ROW BEGIN
UPDATE "domains" d SET d."auto_serial" = d."auto_serial" + 1
WHERE d."id" = NEW."domain_id";
END;:
CREATE TRIGGER "pdns_trig_records_update"
AFTER UPDATE ON "records"
FOR EACH ROW BEGIN
UPDATE "domains" d SET d."auto_serial" = d."auto_serial" + 1
WHERE d."id" = NEW."domain_id";
END;:
CREATE TRIGGER "pdns_trig_records_delete"
AFTER DELETE ON "records"
FOR EACH ROW BEGIN
UPDATE "domains" d SET d."auto_serial" = d."auto_serial" + 1
WHERE d."id" = OLD."domain_id";
END;:
DELIMITER ;
3. Переходим к конфигурированию PowerDNS:
# ee /usr/local/etc/pdns/pdns.conf
# Параметры MySQL
gmysql-host=localhost
gmysql-port=3306
gmysql-user=powerdns
gmysql-dbname=powerdns
gmysql-password=mypass
gmysql-socket=/tmp/mysql.sock
# Разрешаем передачу зон только для определенных хостов
allow-axfr-ips= 193.232.130.14, 194.226.96.8
# Рекурсор юзать не будем, поэтому коммент не снимаем
#allow-recursion=0.0.0.0/0
#################################
# allow-recursion-override Set this so that local data fully overrides the recursor
#
# allow-recursion-override=no
#################################
# cache-ttl Seconds to store packets in the PacketCache
#
cache-ttl=20
#################################
# chroot If set, chroot to this directory for more security
#
# chroot=
#################################
# config-dir Location of configuration directory (pdns.conf)
#
config-dir=/usr/local/etc/pdns
#################################
# config-name Name of this virtual configuration - will rename the binary image
#
# config-name=
#################################
# control-console Debugging switch - don't use
#
control-console=no
#################################
# daemon Operate as a daemon
# Переходим в фоновый режим работы
daemon=yes
#################################
# default-soa-name name to insert in the SOA record if none set in the backend
# SOA по-умолчанию
default-soa-name=ns.mydomain.ru
#################################
# default-ttl Seconds a result is valid if not set otherwise
#
default-ttl=3600
#################################
# disable-axfr Disable zonetransfers but do allow TCP queries
#
disable-axfr=no
#################################
# disable-tcp Do not listen to TCP queries
#
# disable-tcp=no
#################################
# distributor-threads Default number of Distributor (backend) threads to start
#
# distributor-threads=3
#################################
# do-ipv6-additional-processing Do AAAA additional processing
#
# do-ipv6-additional-processing=no
#################################
# fancy-records Process URL and MBOXFW records
#
# fancy-records=no
#################################
# guardian Run within a guardian process
#
guardian=no
#################################
# launch Which backends to launch and order to query them in
#
launch=gmysql
#################################
# lazy-recursion Only recurse if question cannot be answered locally
#
# lazy-recursion=yes
#################################
# load-modules Load this module - supply absolute or relative path
#
# load-modules=
#################################
# local-address Local IP addresses to which we bind
# Интерфейс, на котором будут приниматься запросы DNS, можно несколько через запятую
local-address=172.30.30.1
#################################
# local-ipv6 Local IP address to which we bind
#
# local-ipv6=
#################################
# local-port The port on which we listen
#
local-port=53
#################################
# log-dns-details If PDNS should log DNS non-erroneous details
#
# log-dns-details=
#################################
# log-failed-updates If PDNS should log failed update requests
#
# log-failed-updates=
#################################
# logfile Logfile to use (Windows only)
# Логируем
logfile=/var/log/pdns/pdns.log
#################################
# logging-facility Log under a specific facility
#
# logging-facility=
#################################
# loglevel Amount of logging. Higher is more. Do not set below 3
#
loglevel=9
#################################
# master Act as a master
#
master=yes
#################################
# max-queue-length Maximum queuelength before considering situation lost
#
max-queue-length=5000
#################################
# max-tcp-connections Maximum number of TCP connections
#
max-tcp-connections=10
#################################
# module-dir Default directory for modules
#
# module-dir=/usr/local/lib
#################################
# negquery-cache-ttl Seconds to store packets in the PacketCache
#
# negquery-cache-ttl=60
#################################
# no-shuffle Set this to prevent random shuffling of answers - for regression testing
#
# no-shuffle=off
#################################
# out-of-zone-additional-processing Do out of zone additional processing
#
# out-of-zone-additional-processing=yes
#################################
# pipebackend-abi-version Version of the pipe backend ABI
#
# pipebackend-abi-version=1
#################################
# query-cache-ttl Seconds to store packets in the PacketCache
#
# query-cache-ttl=20
#################################
# query-local-address Source IP address for sending queries
#
# query-local-address=
#################################
# query-logging Hint backends that queries should be logged
#
# query-logging=no
#################################
# queue-limit Maximum number of milliseconds to queue a query
#
# queue-limit=1500
#################################
# recursive-cache-ttl Seconds to store packets in the PacketCache
#
# recursive-cache-ttl=10
#################################
# recursor If recursion is desired, IP address of a recursing nameserver
#
#recursor=
#################################
# send-root-referral Send out old-fashioned root-referral instead of ServFail in case of no authority
#
# send-root-referral=no
#################################
# setgid If set, change group id to this gid for more security
#
setgid=pdns
#################################
# setuid If set, change user id to this uid for more security
#
setuid=pdns
#################################
# skip-cname Do not perform CNAME indirection for each query
#
# skip-cname=no
#################################
# slave Act as a slave
#
slave=yes
#################################
# slave-cycle-interval Reschedule failed SOA serial checks once every .. seconds
#
slave-cycle-interval=600
#################################
# smtpredirector Our smtpredir MX host
#
# smtpredirector=a.misconfigured.powerdns.smtp.server
#################################
# soa-expire-default Default SOA expire
#
soa-expire-default=604800
#################################
# soa-minimum-ttl Default SOA mininum ttl
#
soa-minimum-ttl=3600
#################################
# soa-refresh-default Default SOA refresh
#
soa-refresh-default=10800
#################################
# soa-retry-default Default SOA retry
#
soa-retry-default=3600
#################################
# soa-serial-offset Make sure that no SOA serial is less than this number
#
soa-serial-offset=0
#################################
# socket-dir Where the controlsocket will live
#
socket-dir=/var/run
#################################
# strict-rfc-axfrs Perform strictly rfc compliant axfrs (very slow)
#
# strict-rfc-axfrs=no
#################################
# trusted-notification-proxy IP address of incoming notification proxy
#
# trusted-notification-proxy=
#################################
# urlredirector Where we send hosts to that need to be url redirected
#
# urlredirector=127.0.0.1
#################################
# use-logfile Use a log file (Windows only)
#
use-logfile=yes
#################################
# version-string PowerDNS version in packets - full, anonymous, powerdns or custom
#
version-string=powerdns
#################################
# webserver Start a webserver for monitoring
#
webserver=yes
#################################
# webserver-address IP Address of webserver to listen on
#
webserver-address=172.30.30.1
#################################
# webserver-password Password required for accessing the webserver
#
# webserver-password=
#################################
# webserver-port Port of webserver to listen on
#
webserver-port=8081
webserver-allow-from=127.0.0.1, 172.30.30.1, 172.30.30.0/16
#################################
# webserver-print-arguments If the webserver should print arguments
#
#webserver-print-arguments=yes
#################################
# wildcard-url Process URL and MBOXFW records
#
# wildcard-url=no
#################################
# wildcards Honor wildcards in the database
#
# wildcards=
Следует отметить, что PowerDNS во FreeBSD пишет свои логи в /var/log/messages. Чтоб логи писались в /var/log/pdns/pdns.log надо в /etc/syslog.conf внести следующее:
!pdns
*.* /var/log/pdns/pdns.log
и перечитать конфиг syslog'а:
# /etc/rc.d/syslogd reload
3. Запуск
Перед запуском добавим в /etc/rc.conf
pdns_enable="YES"
Проверяем наличие в системе пользователя и группы pdns, создаем, если их нет.
Правим стартовый скрипт PowerDNS /usr/local/etc/rc.d/pdns до такого состояния (отличается от оригинального):
#!/bin/sh
#
# $FreeBSD: ports/dns/powerdns/files/pdns.in,v 1.5 2009/07/15 16:55:41 dougb Exp $
#
# PROVIDE: pdns_server
# REQUIRE: mysql
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf to enable powerdns:
#
# pdns_enable="YES"
# pdns_flags=""
#
# See pdns_server(8) for flags.
#
. /etc/rc.subr
############################
pdns_uid=120
pdns_gid=120
############################
name=pdns
rcvar=`set_rcvar`
command=/usr/local/sbin/pdns_server
# set defaults
pdns_enable=${pdns_enable:-"NO"}
pdns_conf=${pdns_conf:-"/usr/local/etc/pdns/pdns.conf"}
load_rc_config ${name}
required_files=${pdns_conf}
monitor_cmd="${command} --daemon=no --guardian=no --control-console --loglevel=9"
extra_commands="monitor"
run_rc_command "$1"
Запускаем сервер
# /usr/local/etc/rc.d/pdns start
И проверяем
# netstat -an | grep 53
Если видим
tcp4 0 0 172.30.30.1.53 *.* LISTEN
udp4 0 0 172.30.30.1.53 *.*
то все ОК,
Переходим к установке и настройке web-интерфейса PowerAdmin
PowerAdmin - web-инструмент для администрирования PowerDNS. Для его работы нужны установленные Apache и PHP.
1. Установка
# cd /usr/ports/dns/poweradmin/
# make install clean
Но в портах FreeBSD 11 его уже нет, так что скачаем его с официального сайта, и распакуем в /usr/local/www/poweradmin
cd /tmp
wget https://www.poweradmin.org/download/poweradmin-2.1.7.tgz
tar xvfz poweradmin-2.1.7.tgz
mv poweradmin-2.1.7 /usr/local/www/poweradmin
У меня вылезла ошибка.
Error: You have to install PHP mcrypt extension!
Расширение MCrypt предназначено для шифрования/дешифрования данных. Оно по некоторым даным было признано устаревшим, Однако, могут возникнуть ситуации, когда это расширение может понадобится, когда, например, вы работаете с какой-то устаревшей cms или в данной ситуаци, ну что же установим его.
# cd /usr/ports/security/pecl-mcrypt/
# make install clean
# /usr/local/etc/rc.d/apache24 restart
Проверим https://ussr.kiev.ua/phpinfo.php
Так же есть и другие Web-Морды для Power-DNS, но я еще их не юзал.
вот они
- PDNS Admin (http://freshmeat.net/projects/pdns-admin/)
- PowerDNS Administration (http://sourceforge.net/projects/powerdnsadmin/)
- TUPA (http://www.tupa-dns.org/)
- WebDNS (http://freshmeat.net/projects/webdns/)
- ZoneAdmin (http://freshmeat.net/projects/zoneadmin/)
- PowerAdmin (http://www.poweradmin.org/)***
По-умолчанию PowerAdmin собирается с поддержкой MySQL.
Устанавливается PowerAdmin в каталог /usr/local/www/poweradmin. Теперь нужно переопределить владельца файлов PowerAdmin:
# chown -R www:www /usr/local/www/poweradmin
2. Настройка
Создаем недостающие в БД powedns таблицы, используя скрипт /usr/local/www/poweradmin/docs/poweradmin-mysql-db-structure.sql
Редактируем
#ee /usr/local/www/poweradmin/inc/config.inc.php
<?php
// See <https://www.poweradmin.org/trac/wiki/Documentation/ConfigurationFile> for help.
$db_host = "localhost";
$db_user = "powerdns";
$db_pass = "mypass";
$db_name = "powerdns";
$db_type = "mysql";
$iface_lang = "en_EN";
$iface_style = "example";
$iface_rowamount = "50";
$iface_expire = "1800";
$iface_zonelist_serial = "1";
$dns_hostmaster = "hostmaster.mydomain.ru";
$dns_ns1 = "ns.mydomain.ru";
$dns_ns2 = "";
$dns_ttl = "3600";
$dns_fancy = "false";
$dns_strict_tld_check = "1";
?>
Теперь настроим Apache, сделаем такой виртуальный сервер:
ServerName pdns.mydomain.ru
DocumentRoot /usr/local/www/poweradmin
Options Indexes FollowSymlinks MultiViews
AllowOverride AuthConfig
Order deny,allow
Deny from all
Allow from all
Заходим через броузер на pdns.mydomain.ru, логин и пароль - admin, их нужно сменить сразу после первого входа.
С помощью PowerAdmin можно полностью управлять PowerDNS.
При добавлении зоны у меня вылезла ошибка
В одном из форумов говорилось как поправить эту ошибку, короче говоря сразу после W косая w/ w-/
347c347
< if (!preg_match('/^(\*|[\w\-\/]+)$/', $hostname_label)) {
---
> if (!preg_match('/^(\*|[\w-\/]+)$/', $hostname_label)) {
353c353
< if (!preg_match('/^[\w\-\/]+$/', $hostname_label)) {
---
> if (!preg_match('/^[\w-\/]+$/', $hostname_label)) {
744c744
< if (!preg_match('/^_[\w\-]+$/i', $fields[0])) {
---
> if (!preg_match('/^_[\w-]+$/i', $fields[0])) {
Secondary DNS можно настроить на одном из бесплатных ресурсов.
Power DNS recursor
Лишнем не будет, нужен для того чтобы все неизвестные запросы переадресовывал на внешние DNS сервера в инете, но если вам это не надо можете не ставит
# сd /usr/ports/dns/powerdns-recursor
# make install clea
Коментувати