Fork me on GitHub

The WebDevil

Enjoy development

Наверняка многие видели сообщение об уязвимости в DNS. Во многих дистрибах линукса весьма скоро появились секьюрити-патчи, которые эту уязвимость исправляли. Уязвимость, может, и не слишком уж страшная, но она напомнила мне о PowerDNS, который я с интересом рассматривал в начале 2008го года.

Расматривал я его в основном из-за родной интеграции с MySQL. Мне весьма понравилось как она реализована. Однако у меня были уже рабочие конфиги BIND9, и я просто ленился испытать PowerDNS на собственной шкуре.

А зря боялся, как оказалось. Упомянутая уязвимость не задела PowerDNS, и этим мое внимание было вновь привлечено к нему. И переход таки состоялся.

Что дал переход

Во-первых, я получил возможность использовать найденый вчера poweradmin. Штука оказалась немного неуклюжая, но порадовала меня тем, что не надо более ковыряться в конфигах.

Во-вторых, при изменении/добавлении/удалении записей в зоне маркер (Serial) в SOA меняется сам. Мелочь, но приятно.

В-третьих, теперь можно давать доступ к редактированию зон другим людям.

Вот то, что бросилось мне в глаза. А теперь более подробно о самом переходе.

Процесс перехода

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

Итак, понадобится выполнить следующие действия:

apt-get install pdns-server pdns-recursor pdns-backend-mysql

Желательно во время установки стопнуть bind, потому как dpkg будет ругаться из-за неудачного запуска демона.

После установки можно тушить pdns и стартовать bind до окончания миграции.

В конфиге /etc/powerdns/pdns.conf надо сделать следующие изменения:

...
#allow-recursion=127.0.0.1
...
launch=gmysql
...
local-address=_real_external_ip_here_
...
recursor=127.0.0.1
...

Этим мы будем передавать все неизвестные запросы от основного сервера к recursor’у.
У рекурсора в конфиге стоит local-address=127.0.0.1 по умолчанию, если мне не изменяет память.

В /etc/powerdns/pdns.d/pdns.local вписываем

gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=_username_here_
gmysql-user=_dbname_here_
gmysql-password=_dbpass_here_
gmysql-socket=/var/run/mysqld/mysqld.sock

Проверяем, есть ли нужная БД и пользователь, и может ли он подключиться к базе.

Пример начальной базы есть в /usr/share/doc/pdns-backend-mysql.
Советую туда сразу добавить в конец

ALTER TABLE records ADD CONSTRAINT `records_ibfk_1` FOREIGN KEY (`domain_id`) REFERENCES `domains`
(`id`) ON DELETE CASCADE;

При его тестировании было замечено что работает он бытрее с таблицами InnoDB. Наверное, из-за большого кеша у этого типа таблиц. Я не стал менять таблицы на MyISAM, однако добавил при создании таблиц default collate utf8_general_ci – для надежности.

Потом надо втянуть записи имеющиеся у BIND. Для этого в комплекте есть утилита zone2sql. Рекомендую использовать ее с ключиком --gmysql – так она правильнее работает, создавая записи и в domains и в records.

zone2sql --named-conf=/etc/bind/named.conf --gmysql > import.sql

и вначале выкосил все до основных зон. Потом скормил это mysql’ю. Также можно во всех записях SOA поставить Serial в 0 – так PowerDNS будет вычислять его автоматически.

Пробуем стопнуть bind9 и запустить pdns и pdns-recursor. Если все правильно – все взлетит, и в сислоге будут сообщения о состоянии полета.

Проверить можно набрав

nslookup - dns.yourserver.com

и попробовать ввести что-то существующее на сервере и что-то несуществующее.
У меня основной сервер без recursor’а не хотел отдавать записи типа CNAME при просмотре nslookup’ом. Пришлось установит recursor и настроить их общение.

Ну а установка poweradmin для управления сервером не должна вызвать трудностей вообще.

One Response to “Migration to PowerDNS”

  1. Хороший сервак. Я остановился на MaraDNS – простой и c хорошей секурити хистори.
    Правда мигрировать BIND -> PowerDNS проще и морд к нему больше.

    grinder