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.