bind9 - автоматизация добавления файлов зон

adddomain-01

Наверняка многие из вас задумывались об автоматизации добавления новых файлов зон на своем DNS-сервере. Кто-то правит руками, кто-то ставит для этого развесистые панели управления, а кто-то просто автоматизирует скриптами рутинные операции, хотя бы по минимуму.

Для начала установим и настроим bind9:

apt-get install bind9

Добавим в ‘/etc/bind/named.conf’ строку:

include "/etc/bind/myzones.conf";

Настроим под свои задачи ‘/etc/bind/named.conf.options’. У меня это кэширующий DNS-сервер, который обращается к вышестоящему (192.168.1.1) DNS на роутере. Не забудьте поправить ACL для своих подсетей.

acl "trusted" {
    ::1;
    127.0.0.1;
    192.168.1.0/24;
};
acl "vpnclients" {
    10.0.0.0/24;
};
options {
    directory "/var/cache/bind";
 forward only;
    forwarders {
        192.168.1.1;
    };
 auth-nxdomain no;    # conform to RFC1035
    listen-on-v6 { any; };
 allow-query {
        trusted;
        vpnclients;
    };
 allow-recursion {
        trusted;
        vpnclients;
    };
};

Создаем в ‘/usr/local/bin’ наш скрипт:

nano /usr/local/bin/adddomain
#!/bin/sh
# --------------------------
# Simple script for bind9
# Written by ZeroChaos
# Version 1.0, 2013-03-06
# Site: https://zerolab.net/
# --------------------------
echo -n "Введите имя домена: "
read DOMAIN_NAME
DOMAIN_NAME=`echo $DOMAIN_NAME | tr '[:upper:]' '[:lower:]'`
echo -n "Введите IP для записи типа 'A': "
read IP_TYPE_A
PTR_1="`echo $IP_TYPE_A | awk -F. '{ print $4 }'`"
PTR_2="`echo $IP_TYPE_A | awk -F. '{ print $3 }'`"
PTR_3="`echo $IP_TYPE_A | awk -F. '{ print $2 }'`"
PTR_4="`echo $IP_TYPE_A | awk -F. '{ print $1 }'`"
echo -n "Введите порядковый номер правки (ГодМесяцДеньНомер): "
read YYYYMMDDXX
echo -n "Добавить в список зон (myzones.conf)? (y/N): "
read ADD_TO_MYZONES
ADD_TO_MYZONES=`echo $ADD_TO_MYZONES | tr '[:upper:]' '[:lower:]'`
echo -n "Перечитать файлы зон? (y/N): "
read RNDC_RELOAD
RNDC_RELOAD=`echo $RNDC_RELOAD | tr '[:upper:]' '[:lower:]'`
if [ "$ADD_TO_MYZONES" = "y" ]; then
cat < >/etc/bind/myzones.conf
zone "$DOMAIN_NAME" {
    type master;
    file "/etc/bind/myzones/$DOMAIN_NAME";
};
EOF
fi
cat < /etc/bind/myzones/$DOMAIN_NAME
; Время жизни до обновления кеша
\$TTL 1h
; Имя домена, которое описывается в директиве zone 'myzones.conf', запись ниже необязательна
\$ORIGIN $DOMAIN_NAME.
; Запись SOA - начальная запись зоны
@                               IN      SOA ns1 root (
                                        $YYYYMMDDXX     ; YYYYMMDDXX (XX порядковый номер правки)
                                        1h              ; Обновление через 1 час
                                        15m             ; Повторение попытки через 15 минут
                                        1w              ; Истечение срока через 1 неделю
                                        1h )            ; Минимальное TTL в 1 час
; ns1 - имя первичного DNS сервера зоны
; root - адрес электронной почты администратора домена
; @ - означает, что запись зоны будет совпадать с именем домена.
;
; Серверы имен (NS)
;
@                               IN          NS      ns1.$DOMAIN_NAME.
;
; Почтовые сервера (MX)
;
;@                              IN          MX  10  mail.$DOMAIN_NAME.
;
; Адреса для канонических имен
;
@                               IN          A       $IP_TYPE_A
www                             IN          A       $IP_TYPE_A
ns1                             IN          A       $IP_TYPE_A
;*.$DOMAIN_NAME.                                CNAME       @
;
; Адреса, указывающие на канонические имена
;
;$PTR_1.$PTR_2.$PTR_3.$PTR_4.in-addr.arpa.      IN          PTR     @
; Проверяем работоспособность:
; dig @ns1.$DOMAIN_NAME $DOMAIN_NAME
EOF
if [ "$RNDC_RELOAD" = "y" ]; then
    rndc reload
fi

Даем права на выполнение:

chmod 755 /usr/local/bin/adddomain

Запускаем и последовательно отвечаем на вопросы:

adddomain

Вот и все, будет создана заготовка для типичной конфигурации.

adddomain-02

При необходимости, правим ее вручную, либо заранее правим шаблон в скрипте под себя.