Como instalar o PowerDNS e o PowerDNS-Admin no Ubuntu

Como instalar o PowerDNS e o PowerDNS-Admin no Ubuntu

PowerDNS é um servidor de nomes totalmente gratuitos e escrito em C++. Ele oferece suporte a vários bancos de dados, como MySQL, MariaDB, PostgreSQL e Oracle, para armazenar arquivos e registros de zona. Já o PowerDNS Admin é um aplicativo web que serve para gerenciar o PowerDNS. Assim, ao usar o PowerDNS você contará com suporte IPv4, IPv6, DNSSec, AD, LDAP, autenticação SAML e muitos outros recursos. Neste artigo vamos mostrar como instalar o PowerDNS no Ubuntu.

Requisitos do sistema

Para instalar o PowerDNS estaremos utilizando um servidor com as seguintes configurações:

  • Ubuntu 22.04
  • Nome de domínio válido apontado com o IP do seu servidor.
  • Usuário ROOT ou sudo

Sobre a versão do Ubuntu, quanto mais recente melhor, neste caso a versão utilizada é o Ubuntu 22.04, mas as informações aqui prestadas podem ser aplicadas em versões mais recentes.

Nota: Os comandos abaixo devem ser executados como root, se por ventura você não tenha o root ativo no Ubuntu pode executar os comandos com o sudo.

Passo1: Instalando o Banco de dados

Para começar vamos instalar o Banco de dados MariaDB no Ubuntu. Abra o Terminal e execute o comando abaixo como ROOT ou sudo:

sudo apt-get install mariadb-server -y

Agora que já temos o MariaDB instalado vamos criar o banco de dados. Para começar execute o comando abaixo:

mysql

Escolha um nome para o banco de dados, neste exemplo vamos chamar de pdns, mas você pode escolher o nome que desejar:

create database pdns;

Agora precisamos atribuir um nome de usuário, senha e também as permissões. Substitua o nome de usuário pdnsadmin por seu usuário e senha pela senha que você quiser, lembre-se de utilizar uma senha forte, isso evita dor de cabeça no futuro. E sim, há um .* no nome do banco de dados.

grant all on pdns.* to pdnsadmin@localhost identified by 'senha';

Agora precisamos atualizar as permissões, para isso execute o comando abaixo e depois digite o comando da linha 2 para sair do mariadb.

flush privileges;
exit;

Instalando o PowerDNS no Ubuntu

Para instalar o PowerDNS sem erros precisamos desabilitar o serviço systemd-resolved, se deixar ele ativo irá enfrentar erros. Assim, execute o comando abaixo:

systemctl disable --now systemd-resolved

Agora, vamos remover o arquivo resolv.conf, mas não se preocupe, vamos remover apenas o padrão e vamos criar outro.

rm -rf /etc/resolv.conf
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Agora, vamos instalar o PowerDNS com este comando:

apt-get install pdns-server pdns-backend-mysql -y

Agora, o PowerDNS foi instalado no Ubuntu corretamente.

Configurando o PowerDNS

Agora vamos importar o esquema do banco de dados PowerDNS. Lembre-se que você deve trocar o usuário e o nome do banco de dados pelo o que você cirou, execute o comando abaixo prestando muita atenção nas informações:

mysql -u pdnsadmin -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql

Agora, neste passo, vamos criar um arquivo de configuração do PowerDNS, neste momento é preciso inserir os dados de conexão do banco de dados do PowerDNS, lembre-se deles e fique atento a espaços, eles costumam ser invisíveis. Você pode editar usando o nano ou o editor que você mais gostar.

nano /etc/powerdns/pdns.d/pdns.local.gmysql.conf

Com o arquivo de configuração do PowerDNS aberto inclua as seguintes linhas:

# Configuração do MySQL
# 
# Launch gmysql backend 
launch+=gmysql 

# gmysql parameters 
gmysql-host=127.0.0.1 
gmysql-port=3306 
gmysql-dbname=pdns 
gmysql-user=pdnsadmin 
gmysql-password=senha
gmysql-dnssec=yes 
# gmysql-socket =

Agora, se você utilizou o nano, pressione Ctrl + X, pressione Y para salvar. Em seguida execute o comando abaixo para definir as permissões corretas do arquivo de configuração.

chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf
chown pdns:pdns /etc/powerdns/pdns.d/pdns.local.gmysql.conf

Neste passo vamos parar o servidor PowerDNS e vamos seguir com alguns testes, os comandos estão nesta ordem:

systemctl stop pdns
pdns_server --daemon=no --guardian=no --loglevel=9

Se as configurações estiverem corretas, você verá algo como:

Aug 18 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Aug 18 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Aug 18 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Aug 18 10:43:47 Done launching threads, ready to distribute questions

Agora vamos iniciar o serviço e conferir o status do PowerDNS com os comandos abaixo:

systemctl start pdns
systemctl status pdns

Se o resultado por algo parecido com as saídas abaixo, o seu PowerDNS foi configurado corretamente:

? pdns.service - PowerDNS Authoritative Server
     Loaded: loaded (/lib/systemd/system/pdns.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-08-18 10:37:28 UTC; 8s ago
       Docs: man:pdns_server(1)
             man:pdns_control(1)
             https://doc.powerdns.com
   Main PID: 93982 (pdns_server)
      Tasks: 8 (limit: 2242)
     Memory: 43.1M
        CPU: 166ms
     CGroup: /system.slice/pdns.service
             ??93982 /usr/sbin/pdns_server --guardian=no --daemon=no --disable-syslog --log-timestamp=no --write-pid=no

Aug 18 10:37:28 ubuntu2204 pdns_server[93982]: UDP server bound to [::]:53
Aug 18 10:37:28 ubuntu2204 pdns_server[93982]: TCP server bound to 0.0.0.0:53
Aug 18 10:37:28 ubuntu2204 pdns_server[93982]: TCP server bound to [::]:53
Aug 18 10:37:28 ubuntu2204 pdns_server[93982]: PowerDNS Authoritative Server 4.5.3 (C) 2001-2021 PowerDNS.COM BV
Aug 18 10:37:28 ubuntu2204 pdns_server[93982]: Using 64-bits mode. Built using gcc 11.2.0.
Aug 18 10:37:28 ubuntu2204 pdns_server[93982]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redi>
Aug 18 10:37:28 ubuntu2204 pdns_server[93982]: Creating backend connection for TCP
Aug 18 10:37:28 ubuntu2204 systemd[1]: Started PowerDNS Authoritative Server.
Aug 18 10:37:28 ubuntu2204 pdns_server[93982]: About to create 3 backend threads for UDP
Aug 18 10:37:29 ubuntu2204 pdns_server[93982]: Done launching threads, ready to distribute questions

Agora vamos refinar o nosso teste, precisamos testar se a porta 53 está iniciada corretamente:

ss -alnp4 | grep pdns

Você deve ver algo como as saídas abaixo:

udp   UNCONN 0      0             0.0.0.0:53         0.0.0.0:*    users:(("pdns_server",pid=93982,fd=5))
tcp   LISTEN 0      128           0.0.0.0:53         0.0.0.0:*    users:(("pdns_server",pid=93982,fd=7))

Instalando o PowerDNS Admin no Ubuntu 22.04

Agora, vamos instalar o PowerDNS no Ubuntu 22.04, vamos utilizar o Nginx:

apt-get install nginx python3-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential libmariadb-dev git python3-flask libpq-dev -y

Em seguida, vamos adicionar o repositório nodejs e também instalar o pacote:

curl -sL https://deb.nodesource.com/setup_16.x | bash -
apt-get install nodejs -y

Neste passo vamos adicionar o repositório chamado de yarn com o comando abaixo:

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

Ao adicionar um repositório vamos precisar atualizar a nossa lista de repositórios, para isso execute o comando abaixo:

apt-get update -y 
apt-get install yarn -y

Agora, já saiba que tudo o que precisamos para o Power DNS Admin foi instalado.

Instalando o PowerDNS Admin

Vamos agora baixar o PowerDNS admin para o diretório do Nginx:

git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /var/www/html/pdns

Agora vamos alterar o diretório e criar um ambiente novo:

cd /var/www/html/pdns/
virtualenv -p python3 flask

Agora vamos ativar o nosso ambiente:

source ./flask/bin/activate
pip install -r requirements.txt

Agora que já configuramos vamos desativar o ambiente virtual que criamos, execute o comando abaixo:

deactivate

Configurando a conexão com a base de dados do PowerDNS

Para começar vamos editar o arquivo de configuração. Neste tutorial vamos utilizar o nano, pois estamos mais familiarizados, mas você pode utilizar o editor que desejar:

nano /var/www/html/pdns/powerdnsadmin/default_config.py

Agora, lembre-se de inserir os dados do seu banco de dados que criamos no começo do tutorial:

SALT = 'yoursecretekey'
SECRET_KEY = 'yoursecretekey'
BIND_ADDRESS = '0.0.0.0'
PORT = 9191
HSTS_ENABLED = False
OFFLINE_MODE = False

SQLA_DB_USER = 'pdnsadmin'
SQLA_DB_PASSWORD = 'senha'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'pdns'
SQLALCHEMY_TRACK_MODIFICATIONS = True

Se estiver usando o nano, pressione Ctrl + X para sair e logo em seguida Y para salvar as alterações. Agora vamos ativar o ambiente virtual que criamos anteriormente:

cd /var/www/html/pdns/
source ./flask/bin/activate

Neste passo, execute o comando abaixo para atualizar nossa base dados:

export FLASK_APP=powerdnsadmin/__init__.py
flask db upgrade
yarn install --pure-lockfile
flask assets build

Em seguida, desative o ambiente novamente, estamos quase prontos, tenha paciência:

deactivate

Habilitando a API PowerDNS Admin

O PowerDNS Admin precisa da API JSON para poder ler as estatísticas e modificar o conteúdo das zonas, metadados e DNSSEC. Vamos habilitar a API editando o arquivo abaixo:

nano /etc/powerdns/pdns.conf

Altere apenas as seguintes linhas:

api=yes
api-key=yoursecretekey

Se estiver usando o nano, pressione Ctrl + X para sair e logo em seguida Y para salvar as alterações. Agora vamos reiniciar o PowerDNS:

systemctl restart pdns

Configurando o NGINX como proxy reverso com o PowerDNS Admin

Agora, supondo que você já tem o Nginx instalado, vamos configurar o Nginx como proxy reverso. Vamos editar o arquivo:

nano /etc/nginx/conf.d/pdns-admin.conf

Agora adicione as linhas abaixo:

server {
  listen	*:80;
  server_name               pdnsadmin.example.com;

  index                     index.html index.htm index.php;
  root                      /var/www/html/pdns;
  access_log                /var/log/nginx/pdnsadmin_access.log combined;
  error_log                 /var/log/nginx/pdnsadmin_error.log;

  client_max_body_size              10m;
  client_body_buffer_size           128k;
  proxy_redirect                    off;
  proxy_connect_timeout             90;
  proxy_send_timeout                90;
  proxy_read_timeout                90;
  proxy_buffers                     32 4k;
  proxy_buffer_size                 8k;
  proxy_set_header                  Host $host;
  proxy_set_header                  X-Real-IP $remote_addr;
  proxy_set_header                  X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_headers_hash_bucket_size    64;

  location ~ ^/static/  {
    include  /etc/nginx/mime.types;
    root /var/www/html/pdns/powerdnsadmin;

    location ~*  \.(jpg|jpeg|png|gif)$ {
      expires 365d;
    }

    location ~* ^.+.(css|js)$ {
      expires 7d;
    }
  }

  location / {
    proxy_pass            http://unix:/run/pdnsadmin/socket;
    proxy_read_timeout    120;
    proxy_connect_timeout 120;
    proxy_redirect        off;
  }

}

Agora vamos carregar as informações para o Nginx, inclusive é neste comando que você terá a certeza que o Nginx estará funcionando corretamente, o comando é:

nginx -t

A mensagem quando tudo está correto é semelhante a abaixo:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Se a mensagem for diferente, algo está errado com o Nginx, revise as suas configurações. Espaços podem influenciar em erros.

Agora vamos seguir alterando a propriedade dos pdns, o usuário padrão é www-data, mas se você fez a troca ou não criou um usuário, utilize o seu usuário padrão, lembre-se que deve ser o mesmo usuário que você criou e configurou o Nginx.

chown -R www-data:www-data /var/www/html/pdns

Reinicie o Nginx:

systemctl restart nginx

Criando um arquivo para o systemD para o PowerDNS Admin

Se há um serviço criado, saiba que ele precisa ser gerenciado. Assim, vamos criar um arquivo de configuração:

nano /etc/systemd/system/pdnsadmin.service

Agora adicione as seguintes linhas ao arquivo recém-criado:

[Unit]
Description=PowerDNS-Admin
Requires=pdnsadmin.socket
After=network.target

[Service]
PIDFile=/run/pdnsadmin/pid
User=pdns
Group=pdns
WorkingDirectory=/var/www/html/pdns
ExecStart=/var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsadmin/socket 'powerdnsadmin:create_app()'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Se estiver usando o nano, pressione Ctrl + X para sair e logo em seguida Y para salvar as alterações. Em seguida vamos criar o arquivo pdnsadmin:

nano /etc/systemd/system/pdnsadmin.socket

Adicione as linhas abaixo ao pdnsadmin.socket:

[Unit]
Description=PowerDNS-Admin socket

[Socket]
ListenStream=/run/pdnsadmin/socket

[Install]
WantedBy=sockets.target

Se estiver usando o nano, pressione Ctrl + X para sair e logo em seguida Y para salvar as alterações. Vamos criar mais alguns arquivos, execute os comandos abaixo, um por linha:

echo "d /run/pdnsadmin 0755 pdns pdns -" >> /etc/tmpfiles.d/pdnsadmin.conf
mkdir /run/pdnsadmin/
chown -R pdns: /run/pdnsadmin/
chown -R pdns: /var/www/html/pdns/powerdnsadmin/

Vamos recarregar o daemon systemctl com o comando abaixo:

systemctl daemon-reload

Agora vamos habilitar o pdnsadmin e iniciá-lo e o segundo comando vai checar o status:

systemctl enable --now pdnsadmin.service pdnsadmin.socket
systemctl status pdnsadmin.service pdnsadmin.socket

Você deve ver algo como as saídas abaixo:

? pdnsadmin.service - PowerDNS-Admin
     Loaded: loaded (/etc/systemd/system/pdnsadmin.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-08-18 10:52:44 UTC; 9s ago
TriggeredBy: ? pdnsadmin.socket
   Main PID: 98696 (gunicorn)
      Tasks: 2 (limit: 2242)
     Memory: 63.1M
        CPU: 913ms
     CGroup: /system.slice/pdnsadmin.service
             ??98696 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdns>
             ??98697 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdns>

Aug 18 10:52:44 ubuntu2204 systemd[1]: Started PowerDNS-Admin.
Aug 18 10:52:44 ubuntu2204 gunicorn[98696]: [2022-08-06 10:52:44 +0000] [98696] [INFO] Starting gunicorn 20.0.4
Aug 18 10:52:44 ubuntu2204 gunicorn[98696]: [2022-08-06 10:52:44 +0000] [98696] [INFO] Listening at: unix:/run/pdnsadmin/socket (98696)
Aug 18 10:52:44 ubuntu2204 gunicorn[98696]: [2022-08-06 10:52:44 +0000] [98696] [INFO] Using worker: sync
Aug 18 10:52:44 ubuntu2204 gunicorn[98697]: [2022-08-06 10:52:44 +0000] [98697] [INFO] Booting worker with pid: 98697

? pdnsadmin.socket - PowerDNS-Admin socket
     Loaded: loaded (/etc/systemd/system/pdnsadmin.socket; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-08-18 10:52:44 UTC; 9s ago
   Triggers: ? pdnsadmin.service
     Listen: /run/pdnsadmin/socket (Stream)
     CGroup: /system.slice/pdnsadmin.socket

Aug 18 10:52:44 ubuntu2204 systemd[1]: Listening on PowerDNS-Admin socket.

Agora só você acessar o PowerDNS Admin com o domínio, subdomínio ou IP que você criou no Nginx. Lembre-se de conferir se editou corretamente os endereços no seu DNS.