Current time: 04-20-2024, 04:35 PM Hello There, Guest! (LoginRegister)


Post Reply 
 
Thread Rating:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Настройка Secondary DNS сервера на Debian
Author Message
gearbx Offline
Junior Member
*

Posts: 11
Joined: Jan 2011
Reputation: 0
Post: #1
Exclamation Настройка Secondary DNS сервера на Debian
Это перевод данной статьи, только с более точными комментариями и небольшими коррективами. Приступим.
На основном 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: " сразу после него как раз и указан нужный нам ключ вида "Mm3ySWtHkrx90WoY8vAKJY2C9QYcrVmVGe3ze7FyInyEqo8l1weLeXKVw5Km84knc5679v9SIgGAnn7K​VFxKSQ==". Его нужно будет позднее вставить в указанное место в /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 - закончили Smile
Теперь вот что делаем на вторичном 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
Готово. Осталось с замиранием сердца запустить скрипт Smile
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 и они сразу начинают дружить. Если кто знает как это делается - напишите в комментах.
(This post was last modified: 01-14-2011 06:59 PM by gearbx.)
01-13-2011 06:07 AM
Visit this user's website Find all posts by this user Quote this message in a reply
GioMac Offline
Junior Member
*****
Dev Team

Posts: 43
Joined: Mar 2008
Reputation: 0
Post: #2
RE: Настройка Secondary DNS сервера на Debian
Мне что-то вариант дружбы по зон-трансферу не понравилось, написал скрипт, который тупо копировал файлы, проверял конфиг и потом перезапускал вторичный DNS, сразу нашелся минус - bind штука довольно кривая иногда и глохнет, зон-трансфер более стабильный вариант если первая нода не падает...
01-14-2011 06:11 AM
Visit this user's website Find all posts by this user Quote this message in a reply
gearbx Offline
Junior Member
*

Posts: 11
Joined: Jan 2011
Reputation: 0
Post: #3
RE: Настройка Secondary DNS сервера на Debian
Как ни старался, не понял Ваш ответ Smile
Quote:Мне что-то вариант дружбы по зон-трансферу не понравилось
и
Quote:зон-трансфер более стабильный вариант
Мне кажется, Вы противоречите себе.
Или надо понимать так, что несмотря на то, что зон-трансфер Вам не нравится - это все-таки более стабильный вариант?

UPD: Напишите, пожалуйста поподробнее, какой вариант наиболее стабилен.
Как я понимаю этот вариант и вариант trifle.net - это зон-трансфер?
И есть еще вариант с простым копированием всей зоны с одного сервака на другой с помощью скрипта. Так?
(This post was last modified: 01-14-2011 08:49 PM by gearbx.)
01-14-2011 06:52 PM
Visit this user's website Find all posts by this user Quote this message in a reply
GioMac Offline
Junior Member
*****
Dev Team

Posts: 43
Joined: Mar 2008
Reputation: 0
Post: #4
RE: Настройка Secondary DNS сервера на Debian
Именно так, но там еще хуже Smile)
У меня как раз был сегодня разговор по этому поводу, сказали что естъ workaround но только по новой версий, буду дергать - напишу..
01-15-2011 12:29 AM
Visit this user's website Find all posts by this user Quote this message in a reply
Post Reply 


Forum Jump:


User(s) browsing this thread: 1 Guest(s)