Instalação e Configuração do Bind Master no Debian Wheezy

E ai galera, aqui eu vou disponibilizar um script para configuração do Bind 9 trabalhando como Master no Debian Wheezy, aqui vocês precisam mudar o domínio e os endereços ips antes de rodar o script.

OBS: A View Externa eu setei os endereços ips como 200.200.200.* caso precise trabalhar com o DNS para a Web mude os ips para os seus ips externos.

#!/bin/sh
#=============================================================================#
# NOTA DE LICENCA                                                             #
#                                                                             #
# Este trabalho esta licenciado sob uma Licenca Creative Commons Atribuicao-  #
# Compartilhamento pela mesma Licenca 3.0 Brasil. Para ver uma copia desta    #
# licenca, visite http://creativecommons.org/licenses/by/3.0/br/              #
# ou envie uma carta para Creative Commons, 171 Second Street, Suite 300,     #
# San Francisco, California 94105, USA.                                       #
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
# Criado por :                                              #
#    Douglas Quintiliano dos Santos | douglas.q.santos@gmail.com 19/05/2013   #
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
#                                                                             #
# Funcao: Script para realizar configuração de servidores DNS MASTER     
# No Debian Wheezy
#                                                                             #
#=============================================================================#
### COMANDOS ##
APTITUDE="/usr/bin/aptitude"
CAT="/bin/cat"
CHMOD="/bin/chmod"
CHOWN="/bin/chown"
DATA="/bin/date"
CP="/bin/cp"
LN="/bin/ln"
MV="/bin/mv"
MKDIR="/bin/mkdir"
MKNOD="/bin/mknod"
SLEEP="/bin/sleep"
CUT="/bin/cut"
CP="/bin/cp"
IP=$(ifconfig eth0 | awk '/inet end/ {print $3}')
PACOTES_BIND="bind9 dnsutils"
PATH_BIND="/var/lib/named"

#MUDAR OS VALORES ABAIXO DE ACORDO COM A SUA NECESSIDADE
#DEFININDO O DOMINIO
DOMINIO="douglas.lan"
#DEFININDO A REDE
REDE="192.168.0.0/24"
#DEFININDO O IP DO NS1
NS1_IP=${IP}
#DEFININDO O IP DO MX
MX_IP=${IP}
#DEFININDO O IP DO WWW
WWW_IP=${IP}
#DEFININDO O IP DO NS2 QUE VAI RECEBER A VIEW INTERNA
NS2_IP=192.168.0.84
#DEFININDO O IP DO NS2 QUE VAI RECEBER A VIEW EXTERNA
NS2_IP2=192.168.0.85

### INSTALACAO DO PACOTE ###
${APTITUDE} update
${APTITUDE} install ${PACOTES_BIND} -y

### Parar o serviço para podermos configurá-lo
/etc/init.d/bind9 stop


### ARVORE DE DIRETORIOS ###
${MKDIR} -p ${PATH_BIND}/etc
${MKDIR} -p ${PATH_BIND}/dev
${MKDIR} -p ${PATH_BIND}/var/log
${MKDIR} -p ${PATH_BIND}/var/cache/bind
${MKDIR} -p ${PATH_BIND}/var/cache/bind/dynamic
${MKDIR} -p ${PATH_BIND}/var/run/bind/run

### CRIANDO OS DISPOSITIVOS NECESSARIOS ###
${MKNOD} ${PATH_BIND}/dev/null c 1 3
${MKNOD} ${PATH_BIND}/dev/random c 1 8
${MKNOD} ${PATH_BIND}/dev/zero c 1 5

### AJUSTANDO AS PERMISSOES ###
${CHMOD} 666 ${PATH_BIND}/dev/null
${CHMOD} 666 ${PATH_BIND}/dev/random
${CHMOD} 666 ${PATH_BIND}/dev/zero
${CHOWN} -R bind:bind ${PATH_BIND}/var/*

### AJUSTANDO A LOCALIZACAO DOS ARQUIVOS
${MV} /etc/bind ${PATH_BIND}/etc
${LN} -sf ${PATH_BIND}/etc/bind /etc/bind
${CP} /etc/localtime ${PATH_BIND}/etc

### AJUSTANDO AS PERMISSOES NOVAMENTE
${CHOWN} -R bind:bind ${PATH_BIND}/etc/bind
${CHOWN} -R bind:bind ${PATH_BIND}/var/cache/bind/dynamic
${CHMOD} -R 775 ${PATH_BIND}/var/cache/bind/dynamic



### AJUSTANDO O ARQUIVO /etc/default/bind9 ###
${CAT} <<EOF > /etc/default/bind9
#/etc/default/bind9
RESOLVCONF=yes
OPTIONS="-u bind -t ${PATH_BIND}"
EOF


### AJUSTANDO O ARQUIVO /etc/resolv.conf ###
${CAT} <<EOF > /etc/resolv.conf
domain ${DOMINIO}
nameserver ${NS1_IP}
EOF

#ESTRAINDO O REVERSO DO NS1
REV3=$(echo ${NS1_IP} | cut -d '.' -f 3)
REV2=$(echo ${NS1_IP} | cut -d '.' -f 2)
REV1=$(echo ${NS1_IP} | cut -d '.' -f 1)
IP_REVERSE=${REV3}.${REV2}.${REV1}


### AJUSTANDO O ARQUIVO /srv/bind/etc/bind/named.conf.options ###
${CP} ${PATH_BIND}/etc/bind/named.conf.options ${PATH_BIND}/etc/bind/named.conf.options.bkp
${CAT} <<EOF > ${PATH_BIND}/etc/bind/named.conf.options
options {
  directory "/var/cache/bind";
  managed-keys-directory "/var/cache/bind/dynamic";
  auth-nxdomain no;
  listen-on-v6 { any; };
  listen-on { 127.0.0.1/32; ${REDE}; };
  allow-query { any; };
  recursion no;
  version "Nao Disponivel";
  ### DNSSEC ###
  dnssec-enable no;
  dnssec-validation no;
  dnssec-lookaside auto;
};

#Controles
include "/etc/bind/rndc.key";
controls {
        inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { rndc-key; };
};

#LOGS
logging {
  channel xfer-log {
  file "/var/log/named.log";
  print-category yes;
  print-severity yes;
  print-time yes;
  severity info;
  };

  category xfer-in { xfer-log; };
  category xfer-out { xfer-log; };
  category notify { xfer-log; };

  channel update-debug {
  file "/var/log/named-update-debug.log";
  severity  debug 3;
  print-category yes;
  print-severity yes;
  print-time      yes;
  };

  channel security-info    {
  file "/var/log/named-auth-info.log";
  severity  info;
  print-category yes;
  print-severity yes;
  print-time      yes;
  };

  category update { update-debug; };
  category security { security-info; };
};

#Controle de ancoras de DNSSEC
include "/etc/bind/bind.keys";
EOF

### AJUSTANDO O ARQUIVO ${PATH_BIND}/etc/bind/named.conf.local ###
${CP} ${PATH_BIND}/etc/bind/named.conf ${PATH_BIND}/etc/bind/named.conf.bkp
${CAT} <<EOF > ${PATH_BIND}/etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.internal-zones";
include "/etc/bind/named.conf.external-zones";
EOF



### AJUSTANDO O ARQUIVO DE ZONAS INTERNAS ###
${CAT} << EOF > ${PATH_BIND}/etc/bind/named.conf.internal-zones
#Definindo quem vão ser os nossos hosts internos, ex: a nossa rede e a maquina local
acl "internal_hosts" {
 ${REDE};
 127.0.0.1/32;
};

#Definindo qual vai ser o ip do servidor slave que vai poder receber a replicação da view internal
acl "internal_slave" {
 ${NS2_IP};
};

#Definição da View interna
view "internal" {

#Definindo quais clientes vão poder consultar essa view
 match-clients {
 !${NS2_IP2};
 internal_hosts;
 };

#O nossos clientes da view interna vão poder efetuar consultas recursivas
 recursion yes;

#Para qual servidor vai ser liberado a transferencia dessa view.
 allow-transfer {
 internal_slave;
 };

#Quem o bind vai notificar em caso de alterações de zona.
 also-notify {
 ${NS2_IP};
 };

#Zonas hint aonde temos as definições dos root masters
 zone "." {
 type hint;
 file "/etc/bind/db.root";
 };

#Zonas internas
 zone "localhost" {
 type master;
 file "/etc/bind/db.local";
 };

zone "127.in-addr.arpa" {
 type master;
 file "/etc/bind/db.127";
 };

 zone "0.in-addr.arpa" {
 type master;
 file "/etc/bind/db.0";
 };

 zone "255.in-addr.arpa" {
 type master;
 file "/etc/bind/db.255";
 };

### CONFIGURAÇÕES DO DOMINIO INTERNO
 zone "${DOMINIO}" {
 type master;
 file "db.${DOMINIO}.internal";
 };

 zone "${IP_REVERSE}.in-addr.arpa" {
 type master;
 file "db.${IP_REVERSE}";
 };

};
EOF

### AJUSTANDO O ARQUIVO DE ZONAS EXTERNAS ###
${CAT} << EOF > ${PATH_BIND}/etc/bind/named.conf.external-zones
#Definindo os clientes locais o nome dessa acl tem que ser diferente da acl da view interna
acl "rede_local" {
 ${REDE};
 127.0.0.1/32;
};

#Defindo o ip do servidor slave para a view externa
acl "external_slave" {
 ${NS2_IP2};
};

#Definição da View externa
view "external" {

 #Definição dos clientes que vão poder consultar essa view
 match-clients {
 external_slave;
 !rede_local;
 any;
 };

 #Os clientes dessa view não vão poder efetuar consultas recursivas
 recursion no;

 #Para qual servidor vai ser liberada a transferencia dessa view
 allow-transfer {
 external_slave;
 };

 #Quem o bind vai notificar quando for efetuada alguma alteração nas zonas
 also-notify {
 ${NS2_IP2};
 };

 #A minha zona de teste.
 zone "${DOMINIO}" {
 type master;
 file "db.${DOMINIO}.external";
 };
};
EOF



### AJUSTANDO O ARQUIVO DE ZONA INTERNA
${CAT} <<EOF > ${PATH_BIND}/var/cache/bind/db.${DOMINIO}.internal
`echo '$TTL 86400'`
@ IN SOA  dns.${DOMINIO}. root.dns.${DOMINIO}. (
                        `date +%Y%m%d`01  ; Serial
                        3600       ; Refresh
                        1800        ; Retry
                        1209600      ; Expire
                        3600 )     ; Minimum

;
@   IN  NS   ${DOMINIO}.
${DOMINIO}. IN TXT "v=spf1 a mx ip4:${REDE} -all"
mail.${DOMINIO} IN TXT "v=spf1 a -all"

@               IN  NS   ns1.${DOMINIO}.
@               IN  NS   ns2.${DOMINIO}.
@               IN  MX   0 mail.${DOMINIO}.

;NAME SERVERS
@               IN  A    ${NS1_IP}
ns1             IN  A    ${NS1_IP}
ns2             IN  A    ${NS2_IP}
dns             IN  A    ${NS1_IP}

;MAIL SERVERS
mail            IN  A    ${MX_IP}
imap            IN  CNAME mail
pop             IN  CNAME mail
smtp            IN  CNAME mail
webmail         IN  CNAME mail

;WEB SERVERS
www             IN  A    ${WWW_IP}
ftp             IN  CNAME www
mailadmin       IN  CNAME www
EOF


#Retirando os endereços finais para  o arquivo reverso------------------------
REV_NS1=$(echo ${NS1_IP} | cut -d '.' -f 4)
REV_NS2=$(echo ${NS2_IP} | cut -d '.' -f 4)
REV_MX=$(echo ${MX_IP} | cut -d '.' -f 4)
REV_WWW=$(echo ${WWW_IP} | cut -d '.' -f 4)



### AJUSTANDO O ARQUIVO /var/lib/named/var/cache/bind/db.0.168.192###
${CAT} <<EOF > ${PATH_BIND}/var/cache/bind/db.${IP_REVERSE}
`echo '$TTL 86400'`
@ IN SOA  dns.${DOMINIO}. root.dns.${DOMINIO}. (
                        `date +%Y%m%d`01  ; Serial
                        3600       ; Refresh
                        1800        ; Retry
                        604800      ; Expire
                        3600 )     ; Minimum

;
@   IN  NS   ${DOMINIO}.
@               IN  NS   ns1.${DOMINIO}.
@               IN  NS   ns2.${DOMINIO}.
@               IN  MX   0 mail.${DOMINIO}.

;NAME SERVERS
${REV_NS1}      IN  PTR    ${DOMINIO}.
${REV_NS1}      IN  PTR    ns1.${DOMINIO}.
${REV_NS2}      IN  PTR    ns2.${DOMINIO}.
${REV_NS1}      IN  PTR    dns.${DOMINIO}.

;MAIL SERVERS
${REV_MX}       IN  PTR    mail.${DOMINIO}.

;WEB SERVERS
${REV_WWW}      IN  PTR    adm.${DOMINIO}.
${REV_WWW}      IN  PTR    www.${DOMINIO}.
EOF


### AJUSTANDO O ARQUIVO DE ZONA INTERNA
${CAT} <<EOF > ${PATH_BIND}/var/cache/bind/db.${DOMINIO}.external
`echo '$TTL 86400'`
@ IN SOA  dns.${DOMINIO}. root.dns.${DOMINIO}. (
                        `date +%Y%m%d`01  ; Serial
                        3600       ; Refresh
                        1800        ; Retry
                        1209600      ; Expire
                        3600 )     ; Minimum

;
@   IN  NS   ${DOMINIO}.
${DOMINIO}. IN TXT "v=spf1 a mx ip4:${REDE} -all"
mail.${DOMINIO} IN TXT "v=spf1 a -all"

@               IN  NS   ns1.${DOMINIO}.
@               IN  NS   ns2.${DOMINIO}.
@               IN  MX   0 mail.${DOMINIO}.

;NAME SERVERS
@               IN  A    200.200.200.1
ns1             IN  A    200.200.200.1
ns2             IN  A    200.200.200.2
dns             IN  A    200.200.200.1

;MAIL SERVERS
mail            IN  A    200.200.200.3
imap            IN  CNAME mail
pop             IN  CNAME mail
smtp            IN  CNAME mail
webmail         IN  CNAME mail

;WEB SERVERS
www             IN  A    200.200.200.4
ftp             IN  CNAME www
mailadmin       IN  CNAME www
EOF



### REINCIANDO O BIND9 ###
/etc/init.d/bind9 start