Instação e configuração do PowerDNS + MySQL + Poweradmin no Debian Squeeze

O PowerDNS é um dos muitos softwares de DNS, ele é muito poderoso, pode fazer milhares de resoluções por segundo, e o que mais me chamou atenção, pode-se comunicar com vários backends, includindo MySQL, PostgreSQL, LDAP, Oracle e outros.

Para se ter uma ideia, existem grandes implementações feitas com ele, incluindo register.com e tucows.com, e, segundo o site oficial, existem aproximadamente 4000 servidores em serviços secundários ativos na internet, que servem aproximadamente 10 milhões de zonas e um imenso número de domínios. Testes no primeiro nível do domínios .EU demonstraram que o PowerDNs pode prover 50.000 resoluções por segundo num único servidor, com um hardware simples. No Google encontrei relatos de testes feitos inclusive pelo registro.br para utilização do mesmo.

A única desvantagem evidente é que o PowerDNS ainda não prevê uma implementação completa do DNSSEC. (O que para muitos é irrelevante, visto que poucos são aqueles que implementaram DNSSEC em seus servidores)

Utilizar o PowerDNS inclusive como cache de DNS é uma ótima pedida devido a sua excelente performance.

Vamos agora atualizar os repositórios e instalar os pacotes necessários.

Prepare o seu sistema com o seguinte script Easy-Debian para que não falte nenhum pacote ou configuração.

O que vou utilizar

  • Ip do servidor: 192.168.1.30
  • Faixa de rede dos clientes: 192.168.1.0/24
  • Domínio: douglasqsantos.com.br

Os pacotes que precisamos instalar.

aptitude update -y && aptitude dist-upgrade -y && aptitude install pdns-recursor pdns-backend-mysql pdns-doc mysql-server mysql-client -y

Agora vamos configurar a base de dados para o powerdns

mysql -u root -p
Enter password: senha
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 40
Server version: 5.1.49-3 (Debian)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE pdns;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL ON pdns.* TO 'pdns'@'localhost' IDENTIFIED BY 'senha';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> exit;
Bye

Agora vamos importar a estrutura do bando do PowerDNS

mysql -h localhost -u root -p pdns < /usr/share/doc/pdns-backend-mysql/mysql.sql
Enter password: SenhaRootMySQL

Agora vamos configurar o arquivo para a conexão do powerDNS com o MySQL

cp /usr/share/doc/pdns-backend-mysql/examples/pdns.local.gmysql /etc/powerdns/pdns.d/

Vamos Acertar a configuração

vim /etc/powerdns/pdns.d/pdns.local.gmysql
# MySQL Configuration
#
gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=senha

Vamos acertar agora a configuração do powerdns

vim /etc/powerdns/pdns.conf
[...]
#Aqui estamos liberando quem vai poder fazer consultas recursivas nesse servidor então a maquina local e a minha rede local
allow-recursion=127.0.0.0/8,192.168.1.0/24
launch=bind,gmysql
recursor=127.0.0.1:2525

Agora vamos acertar o arquivo de configuração que controla as consultas recursivas

vim /etc/powerdns/recursor.conf
[...]
local-port=2525

Vamos acertar agora o /etc/resolv.conf

vim /etc/resolv.conf
domain douglasqsantos.com.br
nameserver 127.0.0.1

Agora vamos reiniciar o serviço do powerDNS

/etc/init.d/pdns-recursor restart && /etc/init.d/pdns restart

Agora vamos verificar se o serviço esta funcionando

/etc/init.d/pdns monitor
already running

Agora vamos analisar os logs.

tail -f /var/log/syslog
Nov 14 18:09:19 debian pdns[2594]: PowerDNS 2.9.22 (C) 2001-2009 PowerDNS.COM BV (Jan  5 2012, 19:09:34, gcc 4.4.5) starting up
Nov 14 18:09:19 debian pdns[2594]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
Nov 14 18:09:19 debian pdns[2594]: DNS Proxy launched, local port 43459, remote 127.0.0.1:2525
Nov 14 18:09:19 debian pdns[2594]: Creating backend connection for TCP
Nov 14 18:09:19 debian pdns[2594]: gmysql Connection succesful
Nov 14 18:09:19 debian pdns[2594]: About to create 3 backend threads for UDP
Nov 14 18:09:19 debian pdns[2594]: gmysql Connection succesful
Nov 14 18:09:20 debian pdns[2594]: gmysql Connection succesful
Nov 14 18:09:20 debian pdns[2594]: gmysql Connection succesful
Nov 14 18:09:20 debian pdns[2594]: Done launching threads, ready to distribute questions

Vamos fazer um teste agora de consulta

nslookup www.terra.com.br

Server:         127.0.0.1
Address:        127.0.0.1#53

Non-authoritative answer:
Name:   www.terra.com.br
Address: 200.154.56.80

Agora vamos instalar o gerenciador web para o nosso powerdns

aptitude install apache2 libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd  -y
aptitude install php-pear php5-imap php5-mcrypt php5-mhash php5-ming php5-mysql php5-xmlrpc gettext  -y

Vamos fazer um acerto no php

O arquivo tem que ficar como abaixo

vim /etc/php5/cli/conf.d/ming.ini
; configuration for php MING module
extension=ming.so

Agora vamos instalar alguns pacotes pear que precisamos.

pear install MDB2
pear install pear/MDB2#mysql

Agora vamos baixar o nosso powerdns e configurar ele.

cd /var/www
wget -c http://wiki.douglasqsantos.com.br/Downloads/misc/poweradmin-2.1.6.tgz
tar -xzvf poweradmin-2.1.6.tgz
mv poweradmin-2.1.6/ poweradmin
touch /var/www/poweradmin/inc/config.inc.php
chown -R www-data:www-data /var/www/poweradmin/

Agora vamos reiniciar o serviço do Apache.

/etc/init.d/apache2 restart

Agora vamos a configuração da nossa tela de gerenciamento acesse em http://ip_servidor/poweradmin/install

  1. Aqui nesta tela podemos selecionar o idioma e selecionar Go to step 2.
  2. Aqui nesta tela so precisamos selecionar Go to step 3.
  3. Aqui nesta tela precisamos informar os dados para conexão no banco de dados da seguinte forma:
    1. Username: pdns
    2. Password: senha
    3. Database type: MySQL
    4. Hostname: 127.0.0.1
    5. DB Port: 3306
    6. Database: pdns
    7. Poweradmin administrator password: senha
    8. Agora vamos selecionar Go to step 4
  4. Aqui nesta tela temos que informar os dados do usuário que vai ter acesso para criar e efetuar a manutenção do pdns vamos configurar da seguinte forma:
    1. Username: pdns
    2. Password: senha
    3. Hostmaster: hostmaster.douglasqsantos.com.br
    4. Primary nameserver: ns1.douglasqsantos.com.br
    5. Secondary nameserver: ns2.douglasqsantos.com.br
    6. Agora vamos selecionar Go to step 5.
  5. Aqui na próxima tela temos um aviso sobre os privilégios que precisamos adicionar ao usuário, como definimos na criação do banco que o dono é o pdns não precisamos fazer aqueles ajustes, aqui temos que selecionar Go to step 6.
  6. Aqui nesta tela temos a informação que as informações foram gravadas nos arquivo config.inc.php aqui precisamos selecionar Go to step 7.
  7. Agora recebemos a informação que a instalação terminou e precisamos remover o diretório install vamos fazer isso
rm -rf /var/www/poweradmin/install

Agora vamos fazer mais alguns ajustes no arquivo de zonas por padrão ele não deixa adicionar zonas não válidas ex: douglas.lan ou douglas.intranet e em alguns casos precisamos disto.

vim /var/www/poweradmin/inc/config.inc.php
<?php

$db_host                = '127.0.0.1';
$db_user                = 'pdns';
$db_pass                = 'senha';
$db_name                = 'pdns';
$db_port                = '3306';
$db_type                = 'mysql';
$db_layer               = 'MDB2';

$session_key            = '(1p1g160*QCnROb%x08kTJbWjqet]l!q_L&7Y}qKAX(Nm3';

$iface_lang             = 'en_EN';

//Opções de dns que não vem por padrão
$dns_fancy              = false;
$dns_strict_tld_check   = false;

//controle de logs que não vem por padrão 
$syslog_use = true;
$syslog_ident = 'poweradmin';
$syslog_facility = LOG_USER;

$dns_hostmaster         = 'hostmaster.douglasqsantos.com.br';
$dns_ns1                = 'ns1.douglasqsantos.com.br';
$dns_ns2                = 'ns2.douglasqsantos.com.br';

?>

Agora vamos mandar reiniciar o pdns

/etc/init.d/pdns restart && /etc/init.d/pdns-recursor restart

Agora já podemos ir para a página inicial para logar no sistema.

http://ip_servidor/poweradmin

  1. Aqui informe o usuário sendo admin e a senha sendo senha e selecione Login.
  2. Após logar vamos ter a tela principal de gerenciamento
  3. Vamos agora redefinir a senha do nosso admin então selecione Change password.
  4. Aqui temos que informar a senha admin e informar uma nova senha e confirmar ela e selecionar Change password.
  5. Após isso vamos ser redireciondos para página de login novamente.
  6. Informe o usuário admin e a senha que você definiu.
  7. Agora vamos criar uma zona de teste.
  8. Na tela de gerenciamento principal selecione Add master zone
    1. Aqui precisamos informar o nome da nossa zona: douglasqsantos.com.br
    2. Em Owner vamos deixar o Administrator
    3. Em Type vamos deixar master
    4. Agora vamos selecionar Add zone
  9. Agora vamos em List zones o link no topo da tela.
  10. Como pode ser notado conseguimos criar o domínio com sucesso.
  11. Agora selecione o icone de bloco de notas com lápiz.
  12. Agora precisamos criar algumas entradas padrões pelo menos
    1. Em cima do botão Add record temos que informar o nosso registro da seguinte forma:
      1. Em name não informe nada
      2. Em type selecione A
      3. Em Content informe o ip do servidor: 192.168.1.30
      4. Agora selecione Add record
    2. Agora selecione o link com fundo verde que apareceu
      1. Em name informe poweradmin
      2. Em type selecione A
      3. Em Content informe o ip do servidor: 192.168.1.30
      4. Agora selecione Add record
    3. Agora selecione o link com fundo verde que apareceu
      1. Em name informe ns1
      2. Em type selecione A
      3. Em Content informe o ip do servidor: 192.168.1.30
      4. Agora selecione Add record
    4. Agora selecione o link com fundo verde que apareceu
    5. Voltamos para a tela de inserção de registros, precisamos agora informar para o dns o nosso registro ns da seguinte forma
      1. Em name não informe nada
      2. Em type selecione NS
      3. Em Content informe ns1.douglasqsantos.com.br
      4. Agora selecione Add record
    6. Agora selecione o link com fundo verde que apareceu
    7. Voltamos para a tela de inserção de registros, precisamos agora informar um registro para o nosso servidor de email da seguinte forma
      1. Em name informe mail
      2. Em type selecione A
      3. Em Content informe o ip do servidor: 192.168.1.30
      4. Agora selecione Add record
    8. Agora selecione o link com fundo verde que apareceu
    9. Voltamos para a tela de inserção de registros, precisamos agora informar para o email o nosso registro mx da seguinte forma
      1. Em name não informe nada
      2. Em type selecione MX
      3. Em Content informe mail.douglasqsantos.com.br
      4. Em Priority informe: 10
      5. Agora selecione Add record
    10. Agora selecione o link com fundo verde que apareceu
    11. Voltamos para a tela de inserção de registros, precisamos agora informar um registro para o nosso servidor de web da seguinte forma
      1. Em name informe www
      2. Em type selecione A
      3. Em Content informe o ip do servidor: 192.168.1.30
      4. Agora selecione Add record
    12. Agora selecione o link com fundo verde que apareceu
    13. Voltamos para a tela de inserção de registros, agora vamos criar um cname para o registro do mail da seguinte forma
      1. Em name informe smtp
      2. Em type selecione CNAME
      3. Em Content informe : mail.douglasqsantos.com.br
      4. Agora selecione Add record
  13. Vamos fazer alguns testes no servidor.

Vamos constar o nosso douglasqsantos.com.br

nslookup douglasqsantos.com.br
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   douglasqsantos.com.br
Address: 192.168.1.30

Agora vamos consultar o host ns1.douglasqsantos.com.br

nslookup ns1.douglasqsantos.com.br
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   ns1.douglasqsantos.com.br
Address: 192.168.1.30

Agora já temos a resposta que precisamos.

Agora vamos efetuar uma pesquisa com o dig sobre os registro do tipo ns.

dig -t NS douglasqsantos.com.br

; <<>> DiG 9.7.3 <<>> -t NS douglasqsantos.com.br
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37534
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;douglasqsantos.com.br.       IN  NS

;; ANSWER SECTION:
douglasqsantos.com.br.    86400   IN  NS  ns1.douglasqsantos.com.br.

;; ADDITIONAL SECTION:
ns1.douglasqsantos.com.br.    86400   IN  A   192.168.1.30

;; Query time: 4 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Nov 14 11:52:37 2012
;; MSG SIZE  rcvd: 67

Agora vamos consultar o nosso cname

nslookup smtp.douglasqsantos.com.br
Server:     127.0.0.1
Address:    127.0.0.1#53

smtp.douglasqsantos.com.br    canonical name = mail.douglasqsantos.com.br.
Name:   mail.douglasqsantos.com.br
Address: 192.168.1.30

Agora vamos fazer uma pesquisa sobre qualquer tipo de registro do nosso domínio

dig -t ANY douglasqsantos.com.br

; <<>> DiG 9.7.3 <<>> -t ANY douglasqsantos.com.br
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 988
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 2

;; QUESTION SECTION:
;douglasqsantos.com.br.       IN  ANY

;; ANSWER SECTION:
douglasqsantos.com.br.    86400   IN  NS  ns1.douglasqsantos.com.br.
douglasqsantos.com.br.    86400   IN  A   192.168.1.30
douglasqsantos.com.br.    86400   IN  MX  10 mail.douglasqsantos.com.br.
douglasqsantos.com.br.    86400   IN  SOA ns1.douglasqsantos.com.br. hostmaster.douglasqsantos.com.br. 2012111406 28800 7200 604800 86400

;; ADDITIONAL SECTION:
ns1.douglasqsantos.com.br.    86400   IN  A   192.168.1.30
mail.douglasqsantos.com.br.   86400   IN  A   192.168.1.30

;; Query time: 13 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Nov 14 11:53:09 2012
;; MSG SIZE  rcvd: 167

Habilitando o poweradmin trabalhar com https

Vamos gerar a key para o https

Preparando o diretório que vai armazenar os nosso certificados

mkdir -p /etc/ssl/apache
cd /etc/ssl/apache

Gerando a key

openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
....................++++++
...........++++++
e is 65537 (0x10001)
Enter pass phrase for server.key: senha
Verifying - Enter pass phrase for server.key: senha

Vamos gerar agora a requisição de assinatura para o certificado

openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key: senha
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Douglas
Organizational Unit Name (eg, section) []:Douglas
Common Name (eg, YOUR name) []:poweradmin.douglasqsantos.com.br
Email Address []:douglas@douglasqsantos.com.br

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Douglas

Agora vamos auto assinar o nosso certificado

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=Douglas/CN=poweradmin.douglasqsantos.com.br/emailAddress=douglas@douglasqsantos.com.br
Getting Private key
Enter pass phrase for server.key: senha

Agora vamos acertar as permissões das chaves

chmod 0400 server.*
 cp server.key server.key.orig

Agora vamos tirar a senha do certificado assinado para que o apache não fique pedindo senha a cada vez que for inicializar

openssl rsa -in server.key.orig -out server.key
 Enter pass phrase for server.key.orig: senha
 writing RSA key

Vamos acertar as permissões de todas as chaves

chmod 0400 /etc/ssl/apache/* 

Vamos agora configurar o host virtual com o acesso via https para o nosso poweradmin

Aqui estamos redirecionando qualquer acesso ao site via http para https para forçar o cliente utilizar criptografia na conexão

vim /etc/apache2/sites-available/poweradmin
<VirtualHost *:80> 
  ServerName poweradmin.douglasqsantos.com.br
  Redirect / https://poweradmin.douglasqsantos.com.br/ 
</VirtualHost> 
 
<VirtualHost *:443> 
        ServerAdmin webmaster@douglasqsantos.com.br 
        ServerName poweradmin.douglasqsantos.com.br
    DocumentRoot "/var/www/poweradmin"
     <Directory "/var/www/poweradmin">
         Options -Indexes +FollowSymLinks +MultiViews
         AllowOverride All
         Order Allow,deny
         Allow From All
     </Directory>
        

     <IfModule mod_php5.c>
     AddType application/x-httpd-php .php
         php_flag expose_php Off
         php_flag allow_url_fopen Off
         php_flag allow_url_include Off
         php_flag magic_quotes_gpc Off
         php_flag register_globals Off
         php_flag disable_functions show_source
         php_flag disable_functions system
         php_flag disable_functions shell_exec
         php_flag disable_functions passthru
         php_flag disable_functions exec
         php_flag disable_functions popen
         php_flag disable_functions proc_open
         php_flag disable_functions symlink
     </IfModule>
        CustomLog /var/log/apache2/poweradmin.access.log combined 
        ErrorLog /var/log/apache2/poweradmin.error.log 
        LogLevel warn 
    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile "/etc/ssl/apache/server.crt"
    SSLCertificateKeyFile "/etc/ssl/apache/server.key"
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
         SSLOptions +StdEnvVars
    </FilesMatch>
         BrowserMatch ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
    ServerSignature Off
</VirtualHost>

Configurando a porta que o nosso host Virtual vai estar escutando.

vim /etc/apache2/ports.conf
[...]
NameVirtualHost *:443

Vamos carregar o módulo ssl para o apache.

a2enmod ssl

Vamos acertar as permissões do diretório

chown -R www-data:www-data /var/www/poweradmin/

Vamos carregar o nosso host Virtual

a2ensite poweradmin

Agora vamos desabilitar os virtuais hosts defaults

a2dissite default
a2dissite default-ssl

Agora é sé reiniciar o apache

/etc/init.d/apache2 restart

Agora ajuste o cliente que vai acessar o poweradmin para utilizar o endereço de servidor dns com o ip do poweradmin

Agora já podemos acessar o nosso poweradmin pelo seguinte endereço:

Agora é só ir administrando.

Referências