Importowanie długiej listy domen do konfiguracji serwera DNS Bind
Jak zaimportować długą listę domen do plików konfiguracyjnych serwera DNS Bind
Jakiś czas temu zostałem poproszony o zaimportowania do głównego i podrzędnego serwera DNS kilku domen i stworzenia prostej strony WWW informującej, że domena jest wystawiona na sprzedaż. Oczywiście zgodziłem się bez wahania, jako że to zadanie nie powinno mi zająć więcej jak 1 minutę dla każdej domeny. Niestety kiedy otrzymałem listę okazało się, że kilka oznacza około 50. Przez moment spanikowałem lecz po chwili zdałem sobie sprawę, że nie używam klikanego DNSa Microsoftu ale wyjątkowo dobrze zorganizowaną konfigurację serwera DNS Bind pracującą w chroot pod Gentoo Linuksem. Dzięki temu mogę wprowadzić tą konfiguracje we właściwy, Linuksowy sposób. Spędziłem 5 minut tworząc skrypt, który załatwił całą robotę za mnie. Właśnie za tę oszczędność mojego wysiłku i przede wszystkim czasu cenię sobie Linuksa.
Zanim zaprezentuje skrypt poświęcę chwilę aby wyjaśnić jak wygląda konfiguracja serwera Bind na moich serwerach z Gentoo Linuksem. Chcę mieć pewność, że inne osoby będą mogły zaadaptować ten skrypt do konfiguracji DNS swojej dystrybucji.
Moje serwery Bind są uruchamiane w środowisku chroot ze względów bezpieczeństwa. Konfiguracja DNS jest zlokalizowana w katalogu /chroot/dns. Główny plik konfiguracyjny serwera Bind jest zlokalizowany w ściężce /chroot/dns/etc/bind/named.conf. Ten plik w domyślnej konfiguracji dla serwerów Gentoo Linux jest wykorzystywany tylko do konfiguracji całego serwera. W dolnej jego części umiejscowione są dwie linie:
// Include master domains config file include "/var/bind/conf/master.conf"; // Include slave domains config file include "/var/bind/conf/slave.conf";
Te linie wskazują pliki konfiguracyjne stref głównych i pomocniczych. Powinny one wskazywać lokalizacje plików stref dla każdej strefy. Dla stref głównych przykładowa linia konfiguracji z pliku masters.conf powinna wyglądać w następujący sposób:
zone "kardasa.pl" IN { type master; file "master/kardasa.pl"; };
Jak widzisz plik konfiguracji konkretnej strefy kardasa.pl powinien być zlokalizowany w bezwzględnej ścieżce /chroot/dns/var/bind/master/kardasa.pl. Dla stref podrzędnych (pomocniczych) linia konfiguracji zlokalizowana w slave.conf powinna wyglądać w następujący sposób:
zone "kardasa.pl" IN { type slave; masters{ master_server_ip_address; }; file "slave/kardasa.pl"; };
Bardzo podoba mi się takie podejście do konfiguracji ponieważ ułatwia mi znajdowanie interesujących mnie informacji.
Dla głównej konfiguracji na pierwszym serwerze mój skrypt powinien robić dwie rzeczy, dodawać linię do pliku /chroot/dns/var/bind/conf/master.conf i tworzyć plik konfiguracyjny strefy w katalogu /chroot/dns/var/bind/master. Dla stref podrzędnych (pomocniczych) na drugim serwerze wszystko co skrypt musi zrobić to dodać linię do pliku /chroot/dns/var/bind/conf/slave.conf, wskazującą właściwy serwer nadrzędny. Pliki stref podrzędnych zostaną utworzone przez serwer BIND. Plik dla strefy w serwerze nadrzędnym powinien wyglądać następująco:
$TTL 600 ; kardasa.pl @ IN SOA server_fqdn. hostmaster.kardasa.pl. ( 2010030201 ; serial 12h ; refresh 1h ; retry 2w ; expire 1h ; minimum ) IN NS master_server_name. IN NS slave_server_name. @ IN A server_ip_address ; host records localhost IN A 127.0.0.1 server_name IN A server_ip_address www IN CNAME server_name
Jest to bardzo podstawowa konfiguracja ale dla domen na sprzedaż nie potrzebuje niczego więcej. Na pewno nie potrzebuje rekordu MX, ale jego opcjonalne tworzenie nie stanowi żadnego problemu.
Wyjaśniłem co muszę zrobić, teraz mogę pokazać skrypt. Nazwałem go: bind_zone_config.sh
BIND_DIR=/chroot/dns/var/bind/ MASTER_CONF_FILE=${BIND_DIR}conf/master.conf SLAVE_CONF_FILE=${BIND_DIR}conf/slave.conf SLAVE_DIR=slave MASTER_DIR=master SERIAL=$(date +"%Y%m%y")01 MASTER_SERVER_IP="X.X.X.X" SLAVE_SERVERS_NAMES="nameserver1 nameserver2" HOSTNAME=short_server_name CNAMES="www" MX= MX_IP=X.X.X.X FILE=${2} #Checking the list of parameters if ( [ $# -lt 2 ] ) then echo "To few arguments were passed to script" echo "Usage ./bind_config.sh type zone_list_file" echo "Type can be master | slave" exit 0 fi #Creating the zone files if [ "${1}" = "master" ]; then while read line do echo "zone \"$line\" IN { type master; file \"${MASTER_DIR}/$line\"; };" >> ${MASTER_CONF_FILE} echo "" > ${BIND_DIR}${MASTER_DIR}/$line echo "\$TTL 600" >> ${BIND_DIR}${MASTER_DIR}/$line echo "; $line" >> ${BIND_DIR}${MASTER_DIR}/$line echo "@ IN SOA ${HOSTNAME}.$line. hostmaster.$line. (" >> ${BIND_DIR}${MASTER_DIR}/$line echo " ${SERIAL} ; serial" >> ${BIND_DIR}${MASTER_DIR}/$line echo " 12h ; refresh" >> ${BIND_DIR}${MASTER_DIR}/$line echo " 1h ; retry" >> ${BIND_DIR}${MASTER_DIR}/$line echo " 2w ; expire" >> ${BIND_DIR}${MASTER_DIR}/$line echo " 1h ; minimum" >> ${BIND_DIR}${MASTER_DIR}/$line echo " )" >> ${BIND_DIR}${MASTER_DIR}/$line echo "" >> ${BIND_DIR}${MASTER_DIR}/$line echo " IN NS ${HOSTNAME}.$line." >> ${BIND_DIR}${MASTER_DIR}/$line for server in ${SLAVE_SERVERS_NAMES} do echo " IN NS $server." >> ${BIND_DIR}${MASTER_DIR}/$line done if [ ${MX} ]; then echo " IN MX 10 ${MX}.$line." >> ${BIND_DIR}${MASTER_DIR}/$line fi echo "@ IN A ${MASTER_SERVER_IP}" >> ${BIND_DIR}${MASTER_DIR}/$line echo "" >> ${BIND_DIR}${MASTER_DIR}/$line echo "; host_records" >> ${BIND_DIR}${MASTER_DIR}/$line echo "localhost IN A 127.0.0.1" >> ${BIND_DIR}${MASTER_DIR}/$line echo "${HOSTNAME} IN A ${MASTER_SERVER_IP}" >> ${BIND_DIR}${MASTER_DIR}/$line if [ ${MX} ]; then echo "${MX} IN A ${MASTER_SERVER_IP}" >> ${BIND_DIR}${MASTER_DIR}/$line fi for cname in ${CNAMES} do echo "${cname} IN CNAME ${HOSTNAME}" >> ${BIND_DIR}${MASTER_DIR}/$line done done < ${FILE} elif [ "${1}" = "slave" ]; then while read line do echo "zone \"$line\" IN { type slave; masters{ ${MASTER_SERVER_IP}; }; file \"${SLAVE_DIR}/$line\"; };" >> ${SLAVE_CONF_FILE} done < ${FILE} else echo "Usage ./bind_zone_config.sh type zone_list_file" echo "Type can be master | slave" exit 0 fi
Skrypt pobiera jako parametr plik z listą domen i czyta go linia po linii i dodaje konfigurację do plików a jeśli to konieczne tworzy plik konfiguracyjny strefy. Przykład użycia:
./bind_zone_config.sh master /var/tmp/my_list_of_domains.txt
Wiem, że ten skrypt mógłby być nieco lepszy, mógłby na przykład pobierać obok nazwy domeny adres serwera ale ponieważ potrzebowałem jednakowej konfiguracji dla jednego serwera nadrzędnego i jednego podrzędnego ten skrypt robi dokładnie i tylko to czego mnie było potrzeba.
Mój skrypt jest również dostępny moim serwerze svn, możesz uzyskać do niego dostęp podążając za tym linkiem.
GNU Free Documentation License or Creative Commons Share Alike
Jeśli znalazłeś jakieś błędy w powyższej informacji lub po prostu chcesz wypowiedzieć swoje zdanie na jej temat, będę wdzięczny za pozostawienie komentarza.
Wszystkie komentarze będą pokazywać się na stronie po tym jak zostaną zatwierdzone. Przepraszam za to ale chcę mieć pewność, że moja strona będzie wolna od obraźliwych lub wulgarnych treści. Nie mam nic przeciwko krytyce ale zrób to właściwie dobierając słowa.
Trwa przetwarzanie komentarza.