Наверняка многие видели сообщение об уязвимости в DNS. Во многих дистрибах линукса весьма скоро появились секьюрити-патчи, которые эту уязвимость исправляли. Уязвимость, может, и не слишком уж страшная, но она напомнила мне о PowerDNS, который я с интересом рассматривал в начале 2008го года.
Расматривал я его в основном из-за родной интеграции с MySQL. Мне весьма понравилось как она реализована. Однако у меня были уже рабочие конфиги BIND9, и я просто ленился испытать PowerDNS на собственной шкуре.
А зря боялся, как оказалось. Упомянутая уязвимость не задела PowerDNS, и этим мое внимание было вновь привлечено к нему. И переход таки состоялся.
Что дал переход
Во-первых, я получил возможность использовать найденый вчера poweradmin. Штука оказалась немного неуклюжая, но порадовала меня тем, что не надо более ковыряться в конфигах.
Во-вторых, при изменении/добавлении/удалении записей в зоне маркер (Serial) в SOA меняется сам. Мелочь, но приятно.
В-третьих, теперь можно давать доступ к редактированию зон другим людям.
Вот то, что бросилось мне в глаза. А теперь более подробно о самом переходе.
Процесс перехода
PowerDNS состоит из двух компонентов – основной сервер имен и преобразователь имен. Основной сервер имен выдает информацию только о тех записях, которые в нем есть. Преобразователь имен же помогает резолвить то, чего нету непосредственно у данного сервера.
Итак, понадобится выполнить следующие действия:
Желательно во время установки стопнуть 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-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.
Советую туда сразу добавить в конец
(`id`) ON DELETE CASCADE;
При его тестировании было замечено что работает он бытрее с таблицами InnoDB. Наверное, из-за большого кеша у этого типа таблиц. Я не стал менять таблицы на MyISAM, однако добавил при создании таблиц default collate utf8_general_ci – для надежности.
Потом надо втянуть записи имеющиеся у BIND. Для этого в комплекте есть утилита zone2sql. Рекомендую использовать ее с ключиком --gmysql – так она правильнее работает, создавая записи и в domains и в records.
и вначале выкосил все до основных зон. Потом скормил это mysql’ю. Также можно во всех записях SOA поставить Serial в 0 – так PowerDNS будет вычислять его автоматически.
Пробуем стопнуть bind9 и запустить pdns и pdns-recursor. Если все правильно – все взлетит, и в сислоге будут сообщения о состоянии полета.
Проверить можно набрав
и попробовать ввести что-то существующее на сервере и что-то несуществующее.
У меня основной сервер без recursor’а не хотел отдавать записи типа CNAME при просмотре nslookup’ом. Пришлось установит recursor и настроить их общение.
Ну а установка poweradmin для управления сервером не должна вызвать трудностей вообще.
Хороший сервак. Я остановился на MaraDNS – простой и c хорошей секурити хистори.
Правда мигрировать BIND -> PowerDNS проще и морд к нему больше.
grinder
January 4th, 2009