|
Настраиваем superslave dns-сервер Если кто не знает, superslave - это dns-сервер, который по axfr-запросам получает зону и создает у себя ее автоматически. Таким образом не нужно синхронизировать зонные файлы по rsync или каким-либо образом обеспечивать передачу зонных файлов на slave-сервер.
Единственное "но" - пока что нормальная поддержк axfr есть только в bind, поэтому необходимо, чтобы master-зона обслуживалась именно bind-ом. Ставим powerdns: yum install pdns pdns-backend-mysql Маленькое замечание: не пытайтесь использовать для superslave sqlite-бакэнд, так как совместное чтение и запись в sqlite отсутствует, поэтому выбираем mysql. Редактируем pdns.conf, оставляя там только: ==== setuid=pdns # Пользователь pdns setgid=pdns # Группа pdns allow-axfr-ips=11.22.33.44 # Диапазон IP-адресов, откуда мы можем обслуживать axfr-запросы allow-recursion=11.22.33.44 # Диапазон IP-адресов, которым мы являемся forwarder-ом default-soa-name=ns2.hostinghutor.com # SOA NS для нашей slave-зоны. launch=gmysql # mysql-бакенд gmysql-socket=/var/lib/mysql/mysql.sock # Используем unix-сокет, так как tcp медленнее gmysql-user=pdns # Пользователь mysql для pdns gmysql-password=passWorD # Пароль пользователя mysql для pdns gmysql-dbname=pdns # Название БД pdns local-address=55.66.77.77 # IP-адрес нашего dns-сервера recursor=77.77.77.77 # IP-адрес forwarder-а, которому будут передаваться запросы не на наши зоны slave=yes # Включаем поддержку slave dns logging-facility=0 # Канал syslog, в который писать логи pdns ==== Можно, конечно, поднастроить кеши и т.п. но приведенного выше конфига вполне хватит для нормальной работы нашего dns-сервера. Создаем пользователя и базу pdns, для чего выполняем команды: ============ mysql -uroot -p CREATE DATABASE pdns; GRANT ALL ON pdns.* TO 'pdns'@'localhost' IDENTIFIED BY 'passWorD'; FLUSH PRIVILEGES; ============ Далее, создаем нужные нам таблицы: ============ mysql -updns -ppassWorD USE pdns; create table domains ( id INT auto_increment, name VARCHAR(255) NOT NULL, master VARCHAR(128) DEFAULT NULL, last_check INT DEFAULT NULL, type VARCHAR(6) NOT NULL, notified_serial INT DEFAULT NULL, account VARCHAR(40) DEFAULT NULL, primary key (id) )type=InnoDB; CREATE UNIQUE INDEX name_index ON domains(name); CREATE TABLE records ( id INT auto_increment, domain_id INT DEFAULT NULL, name VARCHAR(255) DEFAULT NULL, type VARCHAR(6) DEFAULT NULL, content VARCHAR(255) DEFAULT NULL, ttl INT DEFAULT NULL, prio INT DEFAULT NULL, change_date INT DEFAULT NULL, primary key(id) )type=InnoDB; CREATE INDEX rec_name_index ON records(name); CREATE INDEX nametype_index ON records(name,type); CREATE INDEX domain_id ON records(domain_id); create table supermasters ( ip VARCHAR(25) NOT NULL, nameserver VARCHAR(255) NOT NULL, account VARCHAR(40) DEFAULT NULL ); GRANT SELECT ON supermasters TO pdns; GRANT ALL ON domains TO pdns; GRANT ALL ON records TO pdns; ========= Логи pdns ведем в /var/log/pdns/pdns.log: mkdir -p /var/log/pdns touch /var/log/pdns/pdns.log chown -R pdns:pdns /var/log/pdns echo "local0.* /var/log/pdns/pdns.log" >>/etc/syslog.conf service syslog restart Запускаем и прописываем powerdns в стартовые скрипты: chkconfig pdns on service pdns start Для прописывания supermaster-а в pdns запускаем следующие команды: === mysql -updns -ppassWorD pdns INSERT INTO supermasters ( ip, nameserver, account ) VALUES ( 'IP.IP.IP.IP', 'ns1.example.com', 'example' ); === IP.IP.IP.IP - это IP-адрес нашего supermaster-а ns1.example.com - SOA NS master-сервера example - идентификатор, того, кому принадлежит домен В named.conf bind-а на master-е необходимо добавить наш superslave: allow-transfer { IP.IP.IP.IP; }; IP.IP.IP.IP - это IP-адрес нашего superslave-сервера. Powerdns сам не удаляет домены, которые были удалены с master-а. Для удаления используем скрипт rmzones.sh, который будет запускаться раз в сутки и чистить с базы pdns удаленные с master-сервера зоны: ====== #!/bin/bash for dom in `grep 'produced a NS record' /var/log/pdns/pdns.log |awk '{print $10}' | cut -d\' -f2 | sort | uniq |grep -v NS` do echo "Delete domain $dom" echo "DELETE FROM records WHERE name='$dom';" | mysql -updns -ppassWorD pdns echo "DELETE FROM domains WHERE name='$dom';" | mysql -updns -ppassWorD pdns done echo -n >/var/log/pdns/pdns.log service syslog restart ====== Прописываем его в crontab: crontab -e ===== 0 2 * * * /usr/local/bin/rmzones.sh ===== |