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