02 czerwiec 2010

Importowanie długiej listy domen do konfiguracji serwera DNS Bind

Kategorie:  Server  Gentoo  Linux

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:

  1. $TTL 600
  2. ; kardasa.pl
  3. @ IN SOA server_fqdn. hostmaster.kardasa.pl. (
  4. 2010030201 ; serial
  5. 12h ; refresh
  6. 1h ; retry
  7. 2w ; expire
  8. 1h ; minimum
  9. )
  10.  
  11. IN NS master_server_name.
  12. IN NS slave_server_name.
  13. @ IN A server_ip_address
  14.  
  15. ; host records
  16. localhost IN A 127.0.0.1
  17. server_name IN A server_ip_address
  18. 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

Wyświetl źródło skryptu
  1. BIND_DIR=/chroot/dns/var/bind/
  2. MASTER_CONF_FILE=${BIND_DIR}conf/master.conf
  3. SLAVE_CONF_FILE=${BIND_DIR}conf/slave.conf
  4. SLAVE_DIR=slave
  5. MASTER_DIR=master
  6. SERIAL=$(date +"%Y%m%y")01
  7. MASTER_SERVER_IP="X.X.X.X"
  8. SLAVE_SERVERS_NAMES="nameserver1 nameserver2"
  9. HOSTNAME=short_server_name
  10. CNAMES="www"
  11. MX=
  12. MX_IP=X.X.X.X
  13. FILE=${2}
  14.  
  15. #Checking the list of parameters
  16.  
  17. if ( [ $# -lt 2 ] ) then
  18.  
  19. echo "To few arguments were passed to script"
  20. echo "Usage ./bind_config.sh type zone_list_file"
  21. echo "Type can be master | slave"
  22.  
  23. exit 0
  24. fi
  25.  
  26. #Creating the zone files
  27.  
  28. if [ "${1}" = "master" ]; then
  29.  
  30. while read line
  31. do
  32. echo "zone \"$line\" IN { type master; file \"${MASTER_DIR}/$line\"; };" >> ${MASTER_CONF_FILE}
  33. echo "" > ${BIND_DIR}${MASTER_DIR}/$line
  34. echo "\$TTL 600" >> ${BIND_DIR}${MASTER_DIR}/$line
  35. echo "; $line" >> ${BIND_DIR}${MASTER_DIR}/$line
  36. echo "@ IN SOA ${HOSTNAME}.$line. hostmaster.$line. (" >> ${BIND_DIR}${MASTER_DIR}/$line
  37. echo " ${SERIAL} ; serial" >> ${BIND_DIR}${MASTER_DIR}/$line
  38. echo " 12h ; refresh" >> ${BIND_DIR}${MASTER_DIR}/$line
  39. echo " 1h ; retry" >> ${BIND_DIR}${MASTER_DIR}/$line
  40. echo " 2w ; expire" >> ${BIND_DIR}${MASTER_DIR}/$line
  41. echo " 1h ; minimum" >> ${BIND_DIR}${MASTER_DIR}/$line
  42. echo " )" >> ${BIND_DIR}${MASTER_DIR}/$line
  43. echo "" >> ${BIND_DIR}${MASTER_DIR}/$line
  44. echo " IN NS ${HOSTNAME}.$line." >> ${BIND_DIR}${MASTER_DIR}/$line
  45. for server in ${SLAVE_SERVERS_NAMES}
  46. do
  47. echo " IN NS $server." >> ${BIND_DIR}${MASTER_DIR}/$line
  48. done
  49. if [ ${MX} ]; then
  50. echo " IN MX 10 ${MX}.$line." >> ${BIND_DIR}${MASTER_DIR}/$line
  51. fi
  52. echo "@ IN A ${MASTER_SERVER_IP}" >> ${BIND_DIR}${MASTER_DIR}/$line
  53. echo "" >> ${BIND_DIR}${MASTER_DIR}/$line
  54. echo "; host_records" >> ${BIND_DIR}${MASTER_DIR}/$line
  55. echo "localhost IN A 127.0.0.1" >> ${BIND_DIR}${MASTER_DIR}/$line
  56. echo "${HOSTNAME} IN A ${MASTER_SERVER_IP}" >> ${BIND_DIR}${MASTER_DIR}/$line
  57. if [ ${MX} ]; then
  58. echo "${MX} IN A ${MASTER_SERVER_IP}" >> ${BIND_DIR}${MASTER_DIR}/$line
  59. fi
  60. for cname in ${CNAMES}
  61. do
  62. echo "${cname} IN CNAME ${HOSTNAME}" >> ${BIND_DIR}${MASTER_DIR}/$line
  63. done
  64. done < ${FILE}
  65.  
  66. elif [ "${1}" = "slave" ]; then
  67.  
  68. while read line
  69. do
  70. echo "zone \"$line\" IN { type slave; masters{ ${MASTER_SERVER_IP}; }; file \"${SLAVE_DIR}/$line\"; };" >> ${SLAVE_CONF_FILE}
  71. done < ${FILE}
  72.  
  73. else
  74. echo "Usage ./bind_zone_config.sh type zone_list_file"
  75. echo "Type can be master | slave"
  76. exit 0
  77. 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.




Komentarze

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.

Pozostaw komentarz