Уcтановка и настройка DNS-сервера PowerDNS в FreeBSD

(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

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.

При добавлении зоны у меня вылезла ошибка

Error: You have invalid characters in your hostname.
Error: local failed - Invalid hostname.

В одном из форумов говорилось как поправить эту ошибку, короче говоря сразу после 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

Коментувати

Простий текст

  • Не дозволено жодних HTML теґів.
  • Рядки й абзаци переносяться автоматично.
  • Адреси вебсторінок та адреси електронної пошти автоматично перетворюються у посилання.