Это перевод
данной статьи, только с более точными комментариями и небольшими коррективами. Приступим.
На основном DNS сервере
NS1 (у меня это сервер, где установлена панель).
Нам нужно сгенерировать специальный ключ - для безопасного обмена зонами между серваками.
В командной строке на сервере пишем (вместо [YOUR.NS1.FQDN] подставьте FQDN этого сервака без "[" и "]"):
Code:
# dnssec-keygen -a hmac-md5 -b 512 -n host [YOUR.NS1.FQDN]
Эту команду нужно выполнить лишь один раз и только на
NS1.
После выполнения этой команды, в директории /etc/bind/ появятся два файла вида Кполноеимядомена+цифры+ещецифры.key и Кполноеимядомена+цифры+ещецифры.private
Просмотрите содержимое *.private файла (выполните в ком. строке: # cat /etc/bind/Кполноеимядомена+цифры+ещецифры.private)
На третьей строчке - есть слово "Key: " сразу после него как раз и указан нужный нам ключ вида "Mm3ySWtHkrx90WoY8vAKJY2C9QYcrVmVGe3ze7FyInyEqo8l1weLeXKVw5Km84knc5679v9SIgGAnn7KVFxKSQ==". Его нужно будет позднее вставить в указанное место в /etc/bind/named.conf и на основном
NS1 и на дополнительном
NS2 DNS серверах.
Сперва делаем бэкап конфига в файл с именем named.conf.backup:
Code:
# cp /etc/bind/named.conf{,.backup}
Правим /etc/bind/named.conf - сразу после вступительных комментариев вставляем:
Code:
options {
directory "/var/cache/bind";
//Здесь можно указать адреса DNS серверов вашего провайдера.
//В этом случае при попытке ресолвинга DNS имени, ваш DNS сервер
//будет сначала обращаться к кэшу на сервере провайдера.
//Т.к. не пользуюсь - закомментировано.
//forwarders {
// 109.234.ххх.100;};
auth-nxdomain no;
dnssec-enable yes;
};
key "TRANSFER" {
algorithm hmac-md5;
secret "Вставляем сюда (внутрь кавычек, вместо этого текста) секретную строчку из .private файла";
};
//после слова server указываем IP адрес Вашего вторичного (secondary) DNS сервера
server 192.168.1.20 {
keys {
TRANSFER;
};
};
//Эту строчку необходимо закомментировать или удалить, т.к. секция options у нас уже есть, а двух быть не должно
//include "/etc/bind/named.conf.options";
Тоже самое нужно проделать с файлом /etc/ispcp/bind/named.conf - чтобы панель ничего не поменяла.
Сперва бэкап:
Code:
# cp /etc/ispcp/bind/working/named.conf{,.backup}
Затем правим файл. Можно ручками, а можно так:
Code:
#cp /etc/bind/named.conf /etc/ispcp/bind/working/named.conf
Перезапускаем bind:
Code:
# /etc/init.d/bind9 restart
Теперь редактируем кофиг апача (/etc/apache2/sites-enabled/00_master.conf).
Я у себя добавил в конец секции <VirtualHost> - сразу пред </VirtualHost>, но думаю должно работать в любом ее месте:
Code:
Alias /named /etc/bind
<Directory /etc/bind>
Order Deny,Allow
Deny from all
# Вместо [YOUR.NS2.IP] - вставляем IP secondary DNS сервера
# Т.е. разрешаем доступ только с одного определенного IP
Allow from [YOUR.NS2.IP]
</Directory>
Тоже самое проделываем с /etc/ispcp/apache/00_master.conf
В конце концов рестартим apache:
Code:
# /etc/init.d/apache2 restart
С сервером
NS1 - закончили
Теперь вот что делаем на вторичном DNS сервере
NS2.
Если начинать с нуля, то на свежеустановленном серваке для начала укажем FQDN этого сервера (как обычно, правим файлы /etc/hosts и /etc/hostname и в конце не забываем про /etc/init.d/hostname stop && /etc/init.d/hostname start) а затем установим сам DNS сервер.
Как обычно обновим систему:
Code:
# aptitude update
# aptitude safe-upgrade
Потом поставим bind9 и wget (тоже пригодится):
Code:
# aptitude install bind9 dnsutils wget
Если установка прошла без ошибок - правим кофиг нашего DNS сервера (/etc/bind/named.conf). В конечном итоге получаем такое:
Code:
options {
directory "/var/cache/bind";
//Аналогично настройкам основного DNS сервера
//Т.к. не пользуюсь - закомментировано.
//forwarders {
// 109.234.ххх.100;};
auth-nxdomain no;
dnssec-enable yes;
};
key "TRANSFER" {
algorithm hmac-md5;
secret "Сюда вставляем (copy-paste) секретный ключ, который сгенерировали на основном DNS серваке";
};
//Указываем IP адрес основного (master) DNS сервера - того, на котором стоит панель.
server 192.168.1.10 {
keys {
TRANSFER;
};
};
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
Перезапускаем bind:
Code:
# /etc/init.d/bind9 restart
Осталось дело за малым - создать скрипт для обновления зон.
К чему и приступаем nano -w /bin/dnsupdate.sh (я поместил этот скрипт в /bin, Вы можете в любое другое место, везде будет работать):
Code:
#!/bin/sh
NAMED="/etc/bind/named.conf.local"
TMPNAMED="/tmp/zns-441246.temp" #Имя от балды
TMPZONEFILE="/tmp/zones.txt"
#TMP="/tmp/zns-733.temp" #В оригинале есть, но нам не понадобится
ZONELOCATION="/var/cache/bind"
echo -n "Checking for new named.conf... "
#В оригинале указана такая строка
#wget -q https://[YOUR.NS1.IP]:10801/named/named.conf -O $TMPNAMED
#Работать не будет потому, что мы не настраивали выдачу на нестандартном порту
#и при том еще по https. У нас-то все гораздо проще
wget -q http://[IP основного сервака]/named/named.conf -O $TMPNAMED
if [ -e $TMPNAMED ]
then
echo "done."
else
echo "no new data!"
exit
fi
echo -n "Generating zone names... "
#В оригинале было так:
#cat $TMPNAMED |grep zone |cut -d" " -f"2" |cut -d"\"" -f2 > $TMPZONEFILE
#Но здесь не учтено, что слово "zone" может попасться в
#комментариях или в инклудах
#Поэтому я немного подправил эту строчку
cat $TMPNAMED |grep zone |grep -v // |grep -v include |cut -d" " -f"2" |cut -d"\"" -f2 > $TMPZONEFILE
#Потом в оригинале идут две строки, которые все портят :)
#sed '1,5d' $TMPZONEFILE > $TMP
#mv $TMP $TMPZONEFILE
#Что они делали? Тупо (без проверок) удаляли с первой по пятую
#строки из нашего "отгрепеного" файла. Зачем? Загадка, однако:)
#Посему - удаляем.
echo "done. ("$TMPZONEFILE")"
echo "Generating zone info... "
cat $TMPZONEFILE | while read ZONE; do
if [ -e $ZONELOCATION/$ZONE.db ]
then
echo "Zone $ZONE already available."
else
echo -n "New zone available ($ZONE)... "
#Дополняем /etc/bind/named.conf.local новыми зонами
echo "zone \"$ZONE\" {
type slave;
file \"$ZONELOCATION/$ZONE.db\";
#Вместо [IP Вашего NS1 сервера] впишите IP адрес без "[" и "]"
masters { [IP Вашего NS1 сервера]; };
allow-notify { [IP Вашего NS1 сервера]; };
};" >> $NAMED
echo "added."
echo "Restarting Bind"
/etc/init.d/bind9 restart
#Сразу после рестарта bind обнаружит новые зоны в
#/etc/bind/named.conf.local, выкачает информацию о них с основного
#сервера и сгенерит /var/cache/bind/your.zone.name.tld.db файлы
fi
done
rm $TMPZONEFILE
rm $TMPNAMED
Готово. Осталось с замиранием сердца запустить скрипт
Code:
# sh /path/to/script/dnsupdate.sh
Рекомендую сделать скрипт исполняемым и кинуть в /etc/cron.hourly или создать для него задание в crontab (# crontab -e). Удачи.
UPD: Немного не так написал. Если файл dnsupdate.sh кинуть в /etc/cron.hourly - работать не будет. Cron очень не любит всякие ">>" в скриптах. Поэтому в /etc/cron.hourly надо кинуть скрипт, который вызывает dnsupdate.sh - так будет Ок.
К примеру у меня в /etc/cron.hourly лежит исполняемый скрипт run_dnsupdate.sh такого содержания:
Code:
#!/bin/sh
sh /path/to/script/dnsupdate.sh
P.S. На мой взгляд - это не самое лучшее решение, но оно простое и оно работает.
В идеале мне бы хотелось настроить так, как сделано у
http://ns2.trifle.net/. Т.е. на Secondary нужно указать FQDN и IP главного DNS, а на основном указать IP вторичного DNS и они сразу начинают дружить. Если кто знает как это делается - напишите в комментах.