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
- Aqui nesta tela podemos selecionar o idioma e selecionar Go to step 2.
- Aqui nesta tela so precisamos selecionar Go to step 3.
- Aqui nesta tela precisamos informar os dados para conexão no banco de dados da seguinte forma:
- Username: pdns
- Password: senha
- Database type: MySQL
- Hostname: 127.0.0.1
- DB Port: 3306
- Database: pdns
- Poweradmin administrator password: senha
- Agora vamos selecionar Go to step 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:
- Username: pdns
- Password: senha
- Hostmaster: hostmaster.douglasqsantos.com.br
- Primary nameserver: ns1.douglasqsantos.com.br
- Secondary nameserver: ns2.douglasqsantos.com.br
- Agora vamos selecionar Go to step 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.
- 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.
- 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.
- Aqui informe o usuário sendo admin e a senha sendo senha e selecione Login.
- Após logar vamos ter a tela principal de gerenciamento
- Vamos agora redefinir a senha do nosso admin então selecione Change password.
- Aqui temos que informar a senha admin e informar uma nova senha e confirmar ela e selecionar Change password.
- Após isso vamos ser redireciondos para página de login novamente.
- Informe o usuário admin e a senha que você definiu.
- Agora vamos criar uma zona de teste.
- Na tela de gerenciamento principal selecione Add master zone
- Aqui precisamos informar o nome da nossa zona: douglasqsantos.com.br
- Em Owner vamos deixar o Administrator
- Em Type vamos deixar master
- Agora vamos selecionar Add zone
- Agora vamos em List zones o link no topo da tela.
- Como pode ser notado conseguimos criar o domínio com sucesso.
- Agora selecione o icone de bloco de notas com lápiz.
- Agora precisamos criar algumas entradas padrões pelo menos
- Em cima do botão Add record temos que informar o nosso registro da seguinte forma:
- Em name não informe nada
- Em type selecione A
- Em Content informe o ip do servidor: 192.168.1.30
- Agora selecione Add record
- Agora selecione o link com fundo verde que apareceu
- Em name informe poweradmin
- Em type selecione A
- Em Content informe o ip do servidor: 192.168.1.30
- Agora selecione Add record
- Agora selecione o link com fundo verde que apareceu
- Em name informe ns1
- Em type selecione A
- Em Content informe o ip do servidor: 192.168.1.30
- Agora selecione Add record
- Agora selecione o link com fundo verde que apareceu
- Voltamos para a tela de inserção de registros, precisamos agora informar para o dns o nosso registro ns da seguinte forma
- Em name não informe nada
- Em type selecione NS
- Em Content informe ns1.douglasqsantos.com.br
- Agora selecione Add record
- Agora selecione o link com fundo verde que apareceu
- Voltamos para a tela de inserção de registros, precisamos agora informar um registro para o nosso servidor de email da seguinte forma
- Em name informe mail
- Em type selecione A
- Em Content informe o ip do servidor: 192.168.1.30
- Agora selecione Add record
- Agora selecione o link com fundo verde que apareceu
- Voltamos para a tela de inserção de registros, precisamos agora informar para o email o nosso registro mx da seguinte forma
- Em name não informe nada
- Em type selecione MX
- Em Content informe mail.douglasqsantos.com.br
- Em Priority informe: 10
- Agora selecione Add record
- Agora selecione o link com fundo verde que apareceu
- Voltamos para a tela de inserção de registros, precisamos agora informar um registro para o nosso servidor de web da seguinte forma
- Em name informe www
- Em type selecione A
- Em Content informe o ip do servidor: 192.168.1.30
- Agora selecione Add record
- Agora selecione o link com fundo verde que apareceu
- Voltamos para a tela de inserção de registros, agora vamos criar um cname para o registro do mail da seguinte forma
- Em name informe smtp
- Em type selecione CNAME
- Em Content informe : mail.douglasqsantos.com.br
- Agora selecione Add record
- 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.