Сен 03 2009

PowerDNS c MySQL, панелью управления PowerAdmin и PowerDNS-recursor.

Самым распространенным сервером является несомненно ISC Bind. Он входит в большую часть дистрибутивов, неплохо держит нагрузку ну и в общем всем хорош. Еще он имеет ряд недоработок, и несколько неприятных ошибок в прошлом, которые делали уязвимой всю систему, на которой он работал в целом.
Я не возьмусь утверждать что PowerDNS не обладает ошибками и не способен привести к взлому, но во всяком случае PowerDNS менее распространен, при атаке на систему вероятность того, что нападающий будет ожидать увидеть там PowerDNS значительно ниже, значит и безопасность несколько возрастет.

PowerDNS присутствует в портах FreeBSD, но начнем мы с установки PowerDNS-recursor.

cd /usr/ports/dns/powerdns-recursor/
make install clean

Перед сборкой появляется диалоговое окно настройки:

┌────────────────────────────────────────────────────────────────────┐
│              Options for powerdns-recursor 3.1.7.1                 │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │             [X] SETUID  Run as pdns_recursor user              │ │
│ │             [ ] LUA     Enable Lua bindings                    │ │
│ │             [X] STATIC  Build static binaries                  │ │
├─└────────────────────────────────────────────────────────────────┘─┤
│                       [  OK  ]       Cancel                        │                            
└────────────────────────────────────────────────────────────────────┘

Конфигурационный файл /usr/local/etc/pdns/recursor.conf выглядит так :

#Принимаем запросы от 127.0.0.1
allow-from=127.0.0.0/8
#Прибиваемся к адресу 127.0.0.1
local-address=127.0.0.1
#Порт 5353 для приема соединений
local-port=5353

В принципе в конфигурационном файле по умолчанию довольно так много настроек, но фактически нам нужно определить адрес на котором будет слушать рекурсор, порт и адреса с которых можно обращаться к рекурсору. Поскольку мы будем работать с PowerDNS, а он уже будет работать, при необходимости, с рекурсором, то оставляет только такой небольшой файл настройки.

Теперь можно перейти к установке самого PowerDNS, ставим естественно из портов:

cd /usr/ports/dns/powerdns
make install clean

и в начале опять небольшой диалог настройки:

┌────────────────────────────────────────────────────────────────────┐
│                  Options for powerdns 2.9.22_2                     │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │                [ ] PGSQL     PostgreSQL backend                │ │
│ │                [X] MYSQL     MySQL backend                     │ │
│ │                [ ] SQLITE    SQLite 2 backend                  │ │
│ │                [ ] SQLITE3   SQLite 3 backend                  │ │
│ │                [ ] OPENDBX   OpenDBX backend                   │ │
│ │                [ ] OPENLDAP  OpenLDAP backend                  │ │
│ │                [ ] GEO       Geo backend                       │ │
│ │                                                                │ │
├─└────────────────────────────────────────────────────────────────┘─┤
│                       [  OK  ]       Cancel                        │
└────────────────────────────────────────────────────────────────────┘

Поскольку мы решили базу доменов держать в MySQL, то в диалоге настройки выберем только его.
После того, как все соберется можно переходить к настройке PowerDNS.
Теперь создадим базу MySQL и пользователя для PowerDNS:

mysql -uroot -p
create database pdns;
grant all on pdns.* to 'pdns'@'localhost' identified by 'pdns-777';

И теперь создадим таблицы в базе:

mysql -uroot -p pdns < /usr/local/share/examples/powerdns/tables-mysql.sql

Теперь можно переходить к настройкам PowerDNS.
Конфигурационный файл /usr/local/etc/pdns/pdns.conf.
У меня он выглядит так:

#Разрешаем передачу доменов с адресов 192.168.0.0/24, можно указывать
# несколько адресов или сетей через запятую
allow-axfr-ips=192.168.0.0/24
#Рекурсивные запросы разрешаем обрабатывать из локальной сети и с локального адреса
allow-recursion=192.168.0.0/24, 127.0.0.1
#Время жизни кеша
cache-ttl=20
#Переходим в фоновый режим работы
daemon=yes
#SOA запись по умолчанию
default-soa-name=ns.hilik.org.ua
#Количество подпроцессов для обработки запросов
distributor-threads=3
#При включенном guardian при падении PowerDNS будет автоматически стартовать
guardian=yes
#Хранилище для доменов будет база MySQL
launch=gmysql
#адрес MySQL сервера
gmysql-host=127.0.0.1
#Пользователь для соендинения с базой
gmysql-user=pdns
#Пароль
gmysql-password=pdns-777
#Имя базы MySQL
gmysql-dbname=pdns
#Разрешаем рекурсию при отсутствии информации о домене
lazy-recursion=yes
#Порт на котором принимаем запросы
local-port=53
#PowerDNS в режиме мастера
master=yes
max-tcp-connections=10
#Адрес рекурсивного сервера - ему будут передаваться рекурсивные запросы
#в нашем случае адрес PowerDNS-recursor
recursor=127.0.0.1:5353

Теперь нам нужно запустить и PowerDNS-recursor и PowerDNS. Сначала разрешим, а затем и запустим PowerDNS-recursor:

echo 'pdns_recursor_enable="YES"' >> /etc/rc.conf

и запустим:

/usr/local/etc/rc.d/pdns-recursor start

Теперь разрешим запуск PowerDNS:

echo 'pdns_enable="YES"' >> /etc/rc.conf

и запустим:

/usr/local/etc/rc.d/pdns start

Теперь проверим. Проверять будем с помощью dig:

dig @localhost ya.ru

и если увидим:

; <<>> DiG 9.4.2-P2 <<>> @localhost ya.ru
; (2 servers found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35106
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;ya.ru.                         IN      A
 
;; ANSWER SECTION:
ya.ru.                  7049    IN      A       213.180.204.8
ya.ru.                  7049    IN      A       77.88.21.8
ya.ru.                  7049    IN      A       93.158.134.8
 
;; Query time: 43 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Aug 21 23:10:35 2009
;; MSG SIZE  rcvd: 71

Рекурсия работает. Можно переходить к настройке доменов.
Для работы PowerAdmin нужен установленный Apache с PHP. Либо любой другой вебсервер с PHP.
Если все это есть, устанавливаем PowerAdmin:

cd /usr/ports/dns/poweradmin/
make install clean

В начале будет диалог настройки, выбирать там ничего не надо. По умолчанию PowerAdmin собирается с поддержкой MySQL по умолчанию.
Устанавливается PowerAdmin в каталог /usr/local/www/poweradmin. Теперь нужно переопределить владельца файлов PowerAdmin:

chown -R www:www /usr/local/www/poweradmin

далее создадим недостающие для работы PowerAdmin таблицы:

mysql -uroot -p pdns </usr/local/www/poweradmin/docs/poweradmin-mysql-db-structure.sql

и теперь настроим доступ к базе MySQL, настраивается доступ в файле /usr/local/www/poweradmin/inc/config.inc.php.
Определяем такие параметры:

$db_host                = "localhost";
$db_user                = "pdns";
$db_pass                = "pdns-777";
$db_name                = "pdns";
$db_type                = "mysql";

Теперь настроим Apache, сделаем такой виртуальный сервер:

<VirtualHost *:80>
ServerAdmin webmaster@hilik.org.ua
DocumentRoot /usr/local/www/poweradmin
ServerName poweradmin.hilik.org.ua
</VirtualHost>

После того как апачь будет перенастроен, можно подключиться к PowerAdmin браузером. Пароль и логин для доступа admin. Лучше всего его конечно сменить. С помощью PowerAdmin можно полностью управлять DNS сервером. Создавать и удалять записи и домены. На этом настройка окончена.


Украинская Баннерная Сеть