Тема: Как передать содержимое named.conf вторичным серверам
Задача очень банальная, есть софт для управления зонами DNSManager, софт не хорогий, не плохой... не о нем речь. Это чудо инженерной мысли стоит и при установке его на все NS сервера красиво все делает сам, но! Возникает встречный вопрос, зачем на NS сервер ставить то что там в принципе не нужно, да еще и жрет ресурсы (и не мало), да еще и стоит денег...
Во общем что мы имеем. 3 NS сервера
ns1.domain.tld 111.111.111.111
ns2.domain.tld 222.222.222.222
ns3.domain.tld 333.333.333.333
и тот самый ns0.domain.tld 000.000.000.000 на котором и стоит сей замечательный продукт. Его мы не показываем наружу. Специфика софта такая что он правит именно named.conf и размещает все во view'вы. Это не хорошо, не плохо, так есть. Один view для доменов, а второй я выделил для arpa.
view "default" {
allow-transfer { 127.0.0.1; 000.000.000.000; 111.111.111.111; 222.222.222.222; 333.333.333.333 };
match-destinations { 000.000.000.111; };
transfer-source 000.000.000.111;
include "/etc/named/zone.delegation";
zone "0.1.1.in-addr.arpa" {
type master;
file "/var/named/0.1.1.in-addr.arpa";
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" {
type master;
file "/var/named/default/0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa";
};
};
view "cp" {
allow-transfer { 127.0.0.1; 000.000.000.000; 111.111.111.111; 222.222.222.222; 333.333.333.333 };
match-destinations { 000.000.000.000; };
transfer-source 000.000.000.000;
zone "domain2.com" {
type master;
file "/var/named/cp/domain2.com";
};
zone "domain1.com" {
type master;
file "/var/named/cp/domain1.com";
};
};
теперь задача, парсить конфиг и из него сделать конфиг пригодный для ns[1-3].domain.tld.
bind_master2slave
#!/usr/bin/awk -f
# Copyright (c) 2014, BSD license, Alan Vezhbitskis, http://www.alan.lt.
# NO LIABILITY ACCEPTED WHATSOEVER. USE AT YOUR OWN RISK.
# Changelog:
# 2014-08-27 - added arpa ipv6 support
BEGIN {
MASTER_DNS_IP="000.000.000.000;"
ARPA_DNS_IP="000.000.000.111;"
SLAVE_TEMPLATE="zone \"_ZONE_\" IN { type slave; file \"/var/named/slaves/_ZONE_\"; masters { _MASTERDNS_ }; };"
print "\n\n// Do not touch!"
print "// Zone's generated from "MASTER_DNS_IP
print "// Last generation time: " strftime("%Y-%m-%d %H:%M:%S") "\n\n"
# Internal variables
COUNTRECORDS=0
TMP_ZONE=0
TMP_SLAVE=0
} # End of BEGIN statement
# MAIN LOOP:
{
#print "DEBUG["COUNTRECORDS"] ZONE-"TMP_ZONE" SLAVE-"TMP_SLAVE" 1: "$1" 2: "$2" 3: "$3
if (tolower($1) == "zone") {
if (TMP_ZONE == 1) print MYTEMPLATE
TMP_SLAVE=0
TMP_ZONE=1
ZONE=tolower($2)
gsub(/"/,"",ZONE)
if (ZONE == "") {
} else {
MYTEMPLATE=SLAVE_TEMPLATE
gsub(/_ZONE_/,ZONE,MYTEMPLATE)
if (ZONE ~ /.in-addr.arpa/ || ZONE ~ /.ip6.arpa/) {
gsub(/_MASTERDNS_/,ARPA_DNS_IP,MYTEMPLATE)
} else {
gsub(/_MASTERDNS_/,MASTER_DNS_IP,MYTEMPLATE)
}
}
}
if (tolower($1) == "type" && tolower($2) == "slave;") TMP_SLAVE=1
if (TMP_SLAVE == 1 && tolower($1) == "masters" && $3 ~ /[0-9].[0-9].[0-9].[0-9]/) {
gsub(MASTER_DNS_IP,$3,MYTEMPLATE)
TMP_SLAVE=0
}
#COUNTRECORDS=COUNTRECORDS+1
} # End of MAIN LOOP
END {
if (TMP_ZONE == 1) print MYTEMPLATE
print "\n"
} # End of END statement
скрипт на выходе дает конфиг:
cat /etc/named.conf | bind_master2slave
zone "1.1.1.in-addr.arpa" IN { type slave; file "/var/named/slaves/1.1.1.in-addr.arpa"; masters { 000.000.000.111; }; };
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { type slave; file "/var/named/slaves/0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa"; masters { 000.000.000.111; }; };
zone "domain1.tld" IN { type slave; file "/var/named/slaves/domain1.tld"; masters { 000.000.000.000; }; };
zone "domain2.tld" IN { type slave; file "/var/named/slaves/domain3.tld"; masters { 000.000.000.000; }; };
осталось правильно подать
# cat /etc/cron.d/ns-update
HOME=/var/named/deploy/
*/9 * * * * root /var/named/deploy/deploy.sh 2>&1 1>/dev/null
# cat /var/named/deploy/deploy.sh
#!/bin/sh
cnf=$(/bin/find /etc/named.conf -type f -mmin -10| grep named.conf)
if [ -s "${cnf}" ]; then
cat /etc/named.conf | /var/named/deploy/bind_master2slave > /var/named/deploy/named.zones
# ns1
echo "ns1 named.zones"
scp -i /var/named/deploy/id_rsa /var/named/deploy/named.zones [email protected]:/etc/named/
ssh -i /var/named/deploy/id_rsa [email protected] "/usr/sbin/rndc reload"
# ns2
echo "ns2 named.zones"
scp -i /var/named/deploy/id_rsa /var/named/deploy/named.zones [email protected]:/etc/named/
ssh -i /var/named/deploy/id_rsa [email protected] "/usr/sbin/rndc reload"
# ns3
echo "ns3 named.zones"
scp -i /var/named/deploy/id_rsa /var/named/deploy/named.zones [email protected]:/etc/named/
ssh -i /var/named/deploy/id_rsa [email protected] "/usr/sbin/rndc reload"
fi
Очень важный момент смотреть, а изменился ли /etc/named.conf, чтобы не дёргать каждый раз named.