Posterous theme by Cory Watilo

Migration to PowerDNS

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

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

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

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

PowerDNS состоит из двух компонентов - основной сервер имен и преобразователь имен. Основной сервер имен выдает информацию только о тех записях, которые в нем есть. Преобразователь имен же помогает резолвить то, чего нету непосредственно у данного сервера. Итак, понадобится выполнить следующие действия: [cc lang="text"] apt-get install pdns-server pdns-recursor pdns-backend-mysql [/cc] Желательно во время установки стопнуть bind, потому как dpkg будет ругаться из-за неудачного запуска демона. После установки можно тушить pdns и стартовать bind до окончания миграции. В конфиге /etc/powerdns/pdns.conf надо сделать следующие изменения: [cc lang="text"] ... #allow-recursion=127.0.0.1 ... launch=gmysql ... local-address=_real_external_ip_here_ ... recursor=127.0.0.1 ... [/cc] Этим мы будем передавать все неизвестные запросы от основного сервера к recursor'у. У рекурсора в конфиге стоит local-address=127.0.0.1 по умолчанию, если мне не изменяет память. В /etc/powerdns/pdns.d/pdns.local вписываем [cc lang="text"] 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 [/cc] Проверяем, есть ли нужная БД и пользователь, и может ли он подключиться к базе. Пример начальной базы есть в /usr/share/doc/pdns-backend-mysql. Советую туда сразу добавить в конец [cc lang="sql"] ALTER TABLE records ADD CONSTRAINT `records_ibfk_1` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE; [/cc] При его тестировании было замечено что работает он бытрее с таблицами InnoDB. Наверное, из-за большого кеша у этого типа таблиц. Я не стал менять таблицы на MyISAM, однако добавил при создании таблиц default collate utf8_general_ci - для надежности. Потом надо втянуть записи имеющиеся у BIND. Для этого в комплекте есть утилита zone2sql. Рекомендую использовать ее с ключиком --gmysql - так она правильнее работает, создавая записи и в domains и в records. [cc lang="text"] zone2sql --named-conf=/etc/bind/named.conf --gmysql > import.sql [/cc] и вначале выкосил все до основных зон. Потом скормил это mysql'ю. Также можно во всех записях SOA поставить Serial в 0 - так PowerDNS будет вычислять его автоматически. Пробуем стопнуть bind9 и запустить pdns и pdns-recursor. Если все правильно - все взлетит, и в сислоге будут сообщения о состоянии полета. Проверить можно набрав [cc lang="text"] nslookup - dns.yourserver.com [/cc] и попробовать ввести что-то существующее на сервере и что-то несуществующее. У меня основной сервер без recursor'а не хотел отдавать записи типа CNAME при просмотре nslookup'ом. Пришлось установит recursor и настроить их общение. Ну а установка poweradmin для управления сервером не должна вызвать трудностей вообще.
| Viewed
times
Filed under: