Configurando o Bind9 para modo chroot - HOWTO

Observações:

  • Iremos levar em consideração que você possui uma instalação “limpa” do S.O. Debian GNU/Linux.

Instalando o pacote

root@debian:~# aptitude install bind9 dnsutils -y

Antes de continuarmos, é necessário parar o serviço DNS, caso contrário, poderá ocorrer um erro com a chave rndc-key.

root@debian:~# /etc/init.d/bind9 stop

Criando o ambiente

Em seguida, vamos criar os diretórios necessários para o funcionamento do bind9 em chroot.

root@debian:~# mkdir -p /srv/bind/etc
root@debian:~# mkdir -p /srv/bind/dev
root@debian:~# mkdir -p /srv/bind/var/cache/bind
root@debian:~# mkdir -p /srv/bind/var/log
root@debian:~# mkdir -p /srv/bind/var/run/bind/run
root@debian:~# touch /srv/bind/var/cache/bind/managed-keys.bind

Agora vamos mover a estrutura tradicional para o modo chroot.

root@debian:~# mv /etc/bind /srv/bind/etc

Para evitar problemas com atualização do sistema operacional, crie um link simbólico /etc/bind para /srv/bind/etc/bind.

root@debian:~# ln -s /srv/bind/etc/bind /etc/bind

Em seguida, precisamos criar alguns dispositivos e ajustar algumas permissões.

root@debian:~# mknod /srv/bind/dev/null c 1 3
root@debian:~# mknod /srv/bind/dev/random c 1 8
root@debian:~# chmod 666 /srv/bind/dev/null
root@debian:~# chmod 666 /srv/bind/dev/random
root@debian:~# chown -R nobody:nogroup /srv/bind/var/*
root@debian:~# chown -R nobody:nogroup /srv/bind/etc/bind

Configurando o modo chroot

Agora vamos configurar o bind9 para operar em modo chroot e também configurar o syslog para logar as entradas do bind9 em modo chroot.

Primeiramente precisamos ajustar o chroot.

root@debian:~# vi /etc/default/bind9

# run resolvconf?
RESOLVCONF=yes

# startup options for the server
#OPTIONS="-u bind"
OPTIONS="-u nobody -t /srv/bind"

Onde:

  • -u = especifica o usuário (nobody)
  • -t = especifica o diretório chroot, (/var/lib/named).

Testando seu servidor DNS

Abra um terminal e digite:

root@debian:~# tail -f /var/log/syslog

Esse comando permite monitorar o arquivo de logs do syslog para verificar possíveis problemas.

Em seguida reinicie os serviços sysklogd e bind9.

root@debian:~# /etc/init.d/bind9 stop
root@debian:~# /etc/init.d/bind9 start

Vamos verificar agora se o bind9 está operando em modo chroot. Verifique os logs.

root@debian:~# tail -f /var/log/syslog

Nov  5 09:21:55 www named[5861]: shutting down: flushing changes
Nov  5 09:21:55 www named[5861]: stopping command channel on 127.0.0.1#953
Nov  5 09:21:55 www named[5861]: stopping command channel on ::1#953
Nov  5 09:21:55 www named[5861]: no longer listening on ::#53
Nov  5 09:21:55 www named[5861]: no longer listening on 127.0.0.1#53
Nov  5 09:21:55 www named[5861]: exiting
Nov  5 09:21:58 www named[6606]: starting BIND 9.3.4-P1.1 -u nobody -t /srv/bind
Nov  5 09:21:58 www named[6606]: found 1 CPU, using 1 worker thread
Nov  5 09:21:58 www named[6606]: loading configuration from '/etc/bind/named.conf'
Nov  5 09:21:58 www named[6606]: listening on IPv6 interfaces, port 53
Nov  5 09:21:58 www named[6606]: listening on IPv4 interface lo, 127.0.0.1#53
Nov  5 09:21:58 www named[6606]: command channel listening on 127.0.0.1#953
Nov  5 09:21:58 www named[6606]: command channel listening on ::1#953
Nov  5 09:21:58 www named[6606]: zone 0.in-addr.arpa/IN: loaded serial 1
Nov  5 09:21:58 www named[6606]: zone 127.in-addr.arpa/IN: loaded serial 1
Nov  5 09:21:58 www named[6606]: zone 255.in-addr.arpa/IN: loaded serial 1
Nov  5 09:21:58 www named[6606]: zone localhost/IN: loaded serial 1
Nov  5 09:21:58 www named[6606]: running

NOTE: você sabe que está em modo chroot pois aparece no log as seguintes informações:

starting BIND 9.3.4-P1.1 -u nobody -t /srv/bind

Para testar a resolução de nomes, edite o /etc/resolv.conf e ajuste o IP do servidor DNS.

root@debian:~# vi /etc/resolv.conf

nameserver 127.0.0.1

E em seguida, teste!

root@debian:~# nslookup www.google.com.br
Server:		127.0.0.1
Address:	127.0.0.1#53

Non-authoritative answer:
www.google.com.br	canonical name = www.google.com.
www.google.com	canonical name = www.l.google.com.
Name:	www.l.google.com
Address: 209.85.193.99
Name:	www.l.google.com
Address: 209.85.193.104

Também podemos testar com ping.

root@debian:~# ping www.google.com.br
PING www.l.google.com (209.85.193.104) 56(84) bytes of data.
64 bytes from br-in-f104.google.com (209.85.193.104): icmp_seq=1 ttl=247 time=7.12 ms
64 bytes from br-in-f104.google.com (209.85.193.104): icmp_seq=2 ttl=247 time=7.79 ms
64 bytes from br-in-f104.google.com (209.85.193.104): icmp_seq=3 ttl=247 time=8.21 ms
64 bytes from br-in-f104.google.com (209.85.193.104): icmp_seq=4 ttl=247 time=7.05 ms

--- www.l.google.com ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7004ms
rtt min/avg/max/mdev = 6.931/7.953/11.367/1.355 ms

Com isso, nosso servidor de DNS está configurado em modo cache, e pronto para ser utilizado desta forma.

Configurando o Bind

A primeira etapa é configurar os arquivos do servidor bind9.

root@debian:~# cd /srv/bind/etc/bind/

O primeiro arquivo a se ajustar é o named.conf. Verifique as entradas necessárias para alteração no exemplo a seguir:

root@debian:/srv/bind/etc/bind# vi named.conf

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.log";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

Em seguida, vamos ajustar o named.conf.options.

root@debian:/srv/bind/etc/bind# vi named.conf.options

options {
        directory "/var/cache/bind";

        // forwarders {
        //      0.0.0.0;
        // };

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { no; };

        listen-on { 127.0.0.1/32; 72.233.78.144/29; };
        allow-query { any; };
        allow-recursion { 127.0.0.1/32; };
        allow-transfer { none; };

        version "Não Disponível";
};

E por fim, vamos criar o named.conf.log.

root@debian:/srv/bind/etc/bind# vi named.conf.log

logging {
        channel update_debug {
                file "/var/log/update_debug.log" versions 3 size 100k;
                severity debug;
                print-severity  yes;
                print-time      yes;
        };
        channel security_info {
                file "/var/log/security_info.log" versions 1 size 100k;
                severity info;
                print-severity  yes;
                print-time      yes;
        };
        channel bind_log {
                file "/var/log/bind.log" versions 3 size 1m;
                severity info;
                print-category  yes;
                print-severity  yes;
                print-time      yes;
        };

        category default { bind_log; };
        category lame-servers { null; };
        category update { update_debug; };
        category update-security { update_debug; };
        category security { security_info; };
};

Como este é um arquivo novo, precisamos ajustar a permissão dele.

root@debian:/srv/bind/etc/bind# chown nobody.nogroup named.conf.log

Configurando um domínio no Bind

Agora vamos editar o arquivo named.conf.local e adicionar nosso domínio no servidor bind9.

root@debian:/srv/bind/etc/bind# vi named.conf.local

//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

zone "dominio.com.br" {
        type master;
        file "db.dominio.com.br";
};

Agora precisamos adicionar as entradas de domínio. Para isso, vamos alterar o diretório de armazenamento para mantermos a árvore chroot.

root@debian:/srv/bind/etc/bind# cd /srv/bind/var/cache/bind/

E em seguida, criar o arquivo.

root@debian:/srv/bind/var/cache/bind# vi db.dominio.com.br 

$TTL 86400
@               IN SOA  dns.dominio.com.br. root.dns.dominio.com.br. (
                                      2007050701  ; Serial
                                      10800       ; Refresh
                                      3600        ; Retry
                                      604800      ; Expire
                                      86400 )     ; Minimum
; NS
@               IN NS   ns1.dominio.com.br.
@               IN NS   ns2.dominio.com.br.
@               IN MX   0 mail.dominio.com.br.

; NAME SERVERS
@               IN A    200.1.1.1
dns             IN A    200.1.1.1
ns1             IN A    200.1.1.1
ns2             IN A    200.1.1.2

; MAIL
mail            IN A    200.1.1.2
smtp            IN CNAME mail
pop             IN CNAME mail
webmail         IN CNAME mail

; WEB
www             IN A    200.1.1.3
ftp             IN CNAME www

; SPF
dominio.com.br. IN TXT "v=spf1 a mx ip4:200.1.1.0/29 ~all"

Um modelo deste arquivo pode ser obtido em: http://downloads.fabriciovc.eti.br/bind/.

Com isso, já podemos reiniciar o serviço bind9 e testar.

root@debian:~# /etc/init.d/bind9 stop
root@debian:~# /etc/init.d/bind9 start

E para finalizar, vamos testar

root@debian:~# nslookup www.dominio.com.br
Server:		127.0.0.1
Address:	127.0.0.1#53

Non-authoritative answer:
Name:	www.dominio.com.br
Address: 200.1.1.3

Voltar

linux/artigos/bind_chroot.txt · Última modificação: 13/01/2015 10:44 (edição externa)