Наверняка многие видели
сообщение об уязвимости в 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 для управления сервером не должна вызвать трудностей вообще.