PowerDNS Server en PowerDNS Admin te installeren op Ubuntu 20.04

PowerDNS is een vrije en open-source gezaghebbende nameserver. Hij is geschreven in C++ en draait op Unix, Linux en macOS besturingssystemen. Het gebruikt MySQL, MariaDB, PostgreSQL en Oracle om zonebestanden en records op te slaan.

PowerDNS Admin is een web-gebaseerd gereedschap dat gebruikt wordt om PowerDNS te beheren. Je kunt DNS zones maken en beheren met de web browser. Het wordt geleverd met een rijke reeks functies. Enkele daarvan staan hieronder opgesomd:

  • IPv4 en IPv6 ondersteuning
  • Statuspagina met nuttige informatie
  • Automatisch aanmaken/bijwerken van omgekeerde PTR records
  • Ondersteuning voor het in bulk aanmaken van domeinen
  • Ondersteuning voor domeinsjablonen
  • Ondersteuning voor DNSSec
  • Ondersteuning van lokale DB, SAML, LDAP, Active Directory gebruikersauthenticatie

In deze handleiding laten we je zien hoe je PowerDNS en PowerDNS admin op Ubuntu 20.04 server installeert.

Vereisten

  • Een server waarop Ubuntu 20.04 draait.
  • Een geldige domeinnaam gericht met je server IP.
  • Een root wachtwoord is op de server geconfigureerd.

Installeer en configureer MariaDB Server

Voor je begint, moet je de MariaDB databaseserver in je systeem installeren. Standaard is de nieuwste versie van MariaDB niet beschikbaar in de Ubuntu 20.04 standaard repository. Je zult dus de MariaDB repository aan je systeem moeten toevoegen.

Installeer eerst de vereiste pakketten met het volgende commando:

apt-get install software-properties-common gnupg2 -y

Als alle pakketten geïnstalleerd zijn, voeg je de MariaDB signeer-sleutel toe met het volgende commando:

apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'

Voeg vervolgens de MariaDB repository toe met het volgende commando:

add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mirrors.ukfast.co.uk/sites/mariadb/repo/10.5/ubuntu focal main'

Installeer vervolgens de MariaDB server door het volgende commando uit te voeren:

apt-get install mariadb-server -y

Eenmaal geïnstalleerd moet je een database en gebruiker voor PowerDNS aanmaken.

Log eerst in op MariaDB met het volgende commando:

mysql

Eenmaal ingelogd, maak je een database en gebruiker met het volgende commando:

MariaDB [(none)]> create database pdns;
MariaDB [(none)]> grant all on pdns.* to [email protected] identified by 'password';

Spoel vervolgens de privileges door en verlaat de MariaDB shell met het volgende commando:

MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit;

Installeer PowerDNS

Eerst moet je de dienst systemd-resolved van je systeem uitschakelen. Je kunt het uitschakelen met het volgende commando:

systemctl disable --now systemd-resolved

Verwijder vervolgens het standaard resolv.conf bestand en maak een nieuw bestand aan:

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

Installeer vervolgens de PowerDNS server met het volgende commando:

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

Als de PowerDNS geïnstalleerd is, kun je verder gaan met de volgende stap.

Configureer PowerDNS

Eerst moet je het PowerDNS databaseschema importeren in de PowerDNS database. Je kunt het importeren met het volgende commando:

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

Vervolgens moet je de verbindingsdetails van de PowerDNS database bepalen. Je kunt dat doen door het bestand pdns.local.gmysql.conf te bewerken:

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

Verander de volgende regels:

# MySQL Configuration
#
# Launch gmysql backend
launch+=gmysql

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

Bewaar en sluit het bestand en geef dan de juiste toestemming aan het bestand pdns.local.gmysql.conf:

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

Stop vervolgens de PowerDNS server en controleer de PowerDNS met het volgende commando:

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

Als alles in orde is, zou je de volgende uitvoer moeten krijgen:

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

Start vervolgens de PowerDNS server met het volgende commando:

systemctl start pdns

Op dit moment is PowerDNS gestart en luistert op poort 53. Je kunt het controleren met het volgende commando:

ss -alnp4 | grep pdns

Je zou de volgende uitvoer moeten krijgen:

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

Installeer PowerDNS Admin

In dit onderdeel laten we je zien hoe je PowerDNS admin met Nginx installeert.

Installeer de vereiste afhankelijkheden

Installeer eerst alle afhankelijkheden die nodig zijn voor PowerDNS admin met het volgende commando:

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 -y

Als alle afhankelijkheden geïnstalleerd zijn, voeg je de Node.js repository toe met het volgende commando:

curl -sL https://deb.nodesource.com/setup_14.x | bash -

Installeer vervolgens de Node.js met het volgende commando:

apt-get install nodejs -y

Voeg vervolgens de yarn repository toe met het volgende commando:

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

Werk vervolgens de repository bij en installeer Yarn met het volgende commando:

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

Op dit punt zijn alle vereiste afhankelijkheden geïnstalleerd, je kunt nu verder met de volgende stap.

Download PowerDNS Admin

Download vervolgens de nieuwste versie van PowerDNS admin uit de Git repository naar de Nginx root directory:

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

Verander vervolgens de directory in de gedownloade directory en maak een Python virtuele omgeving met het volgende commando:

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

Activeer vervolgens de virtuele omgeving en installeer alle Python afhankelijkheden met het volgende commando:

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

Deactiveer vervolgens de virtuele omgeving met het volgende commando:

deactivate

Definieer Database Verbinding

Vervolgens moet je de gegevens van de PowerDNS database verbinding definiëren in het bestand default_config.py:

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

Verander de volgende regels:

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 = 'password'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'pdns'
SQLALCHEMY_TRACK_MODIFICATIONS = True

Bewaar en sluit het bestand en verander dan de directory in de pdns en activeer de virtuele omgeving:

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

Werk vervolgens de database bij met het volgende commando:

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

Deactiveer vervolgens de virtuele omgeving met het volgende commando:

deactivate

Schakel PowerDNS Admin API in

PowerDNS admin gebruikt JSON API voor het lezen van statistieken en het wijzigen van zone-inhoud, metadata en DNSSEC sleutelmateriaal. Je kunt het inschakelen door het bestand pdns.conf te bewerken:

nano /etc/powerdns/pdns.conf

Verander de volgende regels:

api=yes
api-key=yoursecretekey

Bewaar en sluit het bestand en herstart dan de PowerDNS dienst om de veranderingen toe te passen:

systemctl restart pdns

Configureer Nginx voor PowerDNS Admin

Vervolgens moet je Nginx voor PowerDNS admin instellen. Maak daartoe een Nginx virtual host configuratiebestand aan met het volgende commando:

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

Voeg de volgende regels toe:

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;
  }

}

Bewaar en sluit het bestand en controleer dan de Nginx op een syntaxfout met het volgende commando:

nginx -t

Je zou de volgende uitvoer moeten krijgen:

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

Verander vervolgens het eigendom van de pdns in www-data:

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

Herstart tenslotte de Nginx dienst om de veranderingen toe te passen:

systemctl restart nginx

Maak een Systemd Service bestand voor PowerDNS Admin

Vervolgens moet je een systemd dienstbestand maken om de PowerDNS dienst te beheren.

Maak eerst een pdns service bestand aan met het volgende commando:

nano /etc/systemd/system/pdnsadmin.service

Voeg de volgende regels toe:

[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

Bewaar en sluit het bestand dan maak een pdnsadmin sockt bestand aan met het volgende commando:

nano /etc/systemd/system/pdnsadmin.socket

Voeg de volgende regels toe:

[Unit]
Description=PowerDNS-Admin socket

[Socket]
ListenStream=/run/pdnsadmin/socket

[Install]
WantedBy=sockets.target

Sla het bestand op en sluit het af maak dan de vereiste bestanden en mappen aan met het volgende commando:

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/

Herlaad vervolgens de systemd daemon met het volgende commando:

systemctl daemon-reload

Schakel vervolgens de pdnsadmin dienst in om te starten bij het herstarten van het systeem met het volgende commando:

systemctl enable --now pdnsadmin.service pdnsadmin.socket

Controleer vervolgens de status van beide diensten met het volgende commando:

systemctl status pdnsadmin.service pdnsadmin.socket

Je zou de volgende uitvoer moeten krijgen:

? pdnsadmin.service - PowerDNS-Admin
     Loaded: loaded (/etc/systemd/system/pdnsadmin.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-11-02 10:54:19 UTC; 5s ago
TriggeredBy: ? pdnsadmin.socket
   Main PID: 38881 (gunicorn)
      Tasks: 2 (limit: 2353)
     Memory: 62.5M
     CGroup: /system.slice/pdnsadmin.service
             ??38881 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsa>
             ??38898 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsa>

Nov 02 10:54:19 pdnsadmin.example.com systemd[1]: Started PowerDNS-Admin.
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38881]: [2020-11-02 10:54:19 +0000] [38881] [INFO] Starting gunicorn 20.0.4
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38881]: [2020-11-02 10:54:19 +0000] [38881] [INFO] Listening at: unix:/run/pdnsadmin/socket (38881)
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38881]: [2020-11-02 10:54:19 +0000] [38881] [INFO] Using worker: sync
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38898]: [2020-11-02 10:54:19 +0000] [38898] [INFO] Booting worker with pid: 38898

? pdnsadmin.socket - PowerDNS-Admin socket
     Loaded: loaded (/etc/systemd/system/pdnsadmin.socket; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-11-02 10:54:19 UTC; 5s ago
   Triggers: ? pdnsadmin.service
     Listen: /run/pdnsadmin/socket (Stream)
     CGroup: /system.slice/pdnsadmin.socket

Nov 02 10:54:19 pdnsadmin.example.com systemd[1]: Listening on PowerDNS-Admin socket.

Toegang tot PowerDNS Admin Web UI

Open nu je web browser en ga naar de PowerDNS admin webinterface met de URL http://pdnsadmin.example.com. Je wordt doorverwezen naar de volgende pagina:

PowerDNS Admin login

Klik op de knop Maak een account aan. Je zou het volgende scherm moeten zien:

Maak een account aan

Geef je admin gebruikersgegevens op en klik op de Registreer knop om een account te maken. Je zou de PowerDNS admin login pagina moeten zien in het volgende scherm:

Log in

Geef je admin gebruikersnaam en wachtwoord op en klik op de Sign In knop. Je zou de PowerDNS admin webinterface moeten zien in de volgende pagina:

PowerDNS Admin Dashboard

Geef hier de PowerDNS API URL op om verbinding te maken met PowerDNS en het te beheren. Klik dan op de Update knop om de veranderingen op te slaan. Je zou de volgende pagina moeten zien:

PowerDNS API geconfigureerd

Klik op de knop Dashboard. Je zou het PowerDNS admin dashboard in het volgende scherm moeten zien:

Het dashboard van je PowerDNS server

Conclusie

Gefeliciteerd! je hebt PowerDNS en PowerDNS admin met succes geïnstalleerd en ingesteld op Ubuntu 20.04 server. Je kunt nu zones aanmaken en records toevoegen via de PowerDNS admin webinterface.