Anleitung - PowerDNS
von Alec Höfler, 2/28/2022, 6:46:54 PMSelfhosted DNS Nameserver installieren
PowerDNS ist ein kostenloser, open-source, in C++ programmierter Authoritative Nameserver. Um ihn in einem Cluster bereitzustellen, wird Galera, ein Loadbalancer und Clustering-Service für MariaDB/Mysql verwendet. Zusätzlich wird noch das Web-Frontend PowerDNS-Admin installiert, um PowerDNS bequem über ein Webinterface zu verwalten.
Als Basissystem wird Debian 11 (KVM VM) verwendet. Bis auf einen OpenSSH-Server wurde nichts Weiteres installiert. Es werden folgende öffentliche Ports benötigt:
- 3306/tcp (MariaDB)
- 53/tcp (PowerDNS)
- 4567/tcp (Galera)
- 8081/tcp (PowerDNS API)
- 80/tcp (nginx)
Base-Tools installieren
1apt update 2apt install curl wget sudo unzip git -y
MariaDB Galera Cluster installieren
Als Erstes wird ein Galera Cluster aufgesetzt. Galera ist das Synchronisations- und Clustering-System für MariaDB/MySql, und wird als Datenbank-Backend für PowerDNS benutzt.
1apt install mariadb-server -y
Nun ist der Server installiert. Um ihn abzusichern, jetzt mysql_secure_installation
ausführen.
- Enter current password for root (enter for none): ENTER
- Switch to unix_socket authentication [Y/n] n
- Change the root password? [Y/n] y
- New password: Ky4@bt9dwGxRGA6!ZpaCqqhgUW3LA$fU3^LWtAoY
- Re-enter new password: Ky4@bt9dwGxRGA6!ZpaCqqhgUW3LA$fU3^LWtAoY
- alle weiteren Fragen mit y beantworten
Nun den Bind des MySQL Servers von jeder IP erlauben. Dazu in der /etc/mysql/mariadb.conf.d/50-server.cnf
per nano die Zeile
1bind-address = 127.0.0.1
zu
1bind-address = 0.0.0.0
abändern und die Datei speichern.
Konfiguration von Galera
Nur auf Node01:
1wget -O /etc/mysql/conf.d/galera.cnf https://transfer.itbyhf.xyz/1Lf7Chn/pdns_galera_01.conf 2nano /etc/mysql/conf.d/galera.cnf
In Zeile 11 nun die IPs der Server (getrennt durch einen Beistrich) eintragen. In Zeile 17 jetzt die IP-Adresse von node01 eintragen, in Zeile 18 den Hostname von node01 angeben.
Nur auf Node02:
1wget -O /etc/mysql/conf.d/galera.cnf https://transfer.itbyhf.xyz/1Lf7Chn/pdns_galera_01.conf 2nano /etc/mysql/conf.d/galera.cnf
In Zeile 11 nun die IPs der Server (getrennt durch einen Beistrich) eintragen. In Zeile 17 jetzt die IP-Adresse von node02 eintragen, in Zeile 18 den Hostname von node02 angeben.
Nun auf allen Nodes MySql stoppen:
1systemctl stop mysql
Nur auf node01 folgende Befehle ausführen:
1galera_new_cluster 2service mysql start
Datenbank erstellen
Nun auf einem beliebigen Node folgende Befehle ausführen, um die Datenbank zu erstellen.
1wget -O /tmp/pdns.sql https://transfer.itbyhf.xyz/1xiOG1m/pdns4.3_sql-schema.sql 2mysql 3# Dann folgendes eingeben: 4 MariaDB [(none)]> CREATE DATABASE powerdns; 5 Query OK, 1 row affected (0.015 sec) 6 MariaDB [(none)]> USE powerdns; 7 Database changed 8 MariaDB [powerdns]> source /tmp/pdns.sql 9 MariaDB [powerdns]> exit
PowerDNS installieren
Nun wird PowerDNS installiert. Dazu folgende Befehle ausführen:
1echo "deb [arch=amd64] https://repo.powerdns.com/debian $(lsb_release -sc)-auth-45 main" > /etc/apt/sources.list.d/pdns.list 2wget -qO- https://repo.powerdns.com/FD380FBB-pub.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/pdns.gpg 3sudo systemctl disable systemd-resolved 4sudo systemctl stop systemd-resolved 5ls -lh /etc/resolv.conf 6rm /etc/resolv.conf 7echo "nameserver 1.1.1.1" | tee /etc/resolv.conf 8sudo apt update 9sudo apt install pdns-server pdns-backend-mysql -y 10wget -O /etc/powerdns/pdns.d/pdns.local.gmysql.conf https://transfer.itbyhf.xyz/1ckv7qG/pdns_gmysql.conf
Nun per nano die Datei /etc/powerdns/pdns.d/pdns.local.gmysql.conf
öffnen, und die Datenbank-Verbindungsinformationen anpassen. Anschließend PowerDNS starten.
1sudo systemctl restart pdns 2sudo systemctl enable pdns
Nun sollte PowerDNS installier sein, und per CLI verfügbar sein.
PowerDNS-Admin installieren
Um PowerDNS nun bequem über ein Webinterface verwalten zu können, ist es ratsam, PowerDNS-Admin zu installieren. Dies ist optional und kann auf jedem Node installiert werden.
Grundsoftware installieren
1apt install python3-dev -y 2apt install -y libmariadb-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential 3curl -sL https://deb.nodesource.com/setup_10.x | bash - 4apt update 5apt install -y nodejs 6curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - 7echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list 8apt update 9apt install -y yarn
Nun kann es schon an die Installation von PowerDNS-Admin gehen.
1git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /opt/web/powerdns-admin 2cd /opt/web/powerdns-admin 3virtualenv -p python3 flask 4source ./flask/bin/activate 5pip install -r requirements.txt 6pip install itsdangerous==2.0.1
Anschließend per nano die powerdnsadmin/default_config.py
öffnen, und die Datenbank-Section bearbeiten. Beispiel:
1### DATABASE CONFIG 2SQLA_DB_USER = 'root' 3SQLA_DB_PASSWORD = 'Ky4@bt9dwGxRGA6!ZpaCqqhgUW3LA$fU3^LWtAoY' 4SQLA_DB_HOST = '127.0.0.1' 5SQLA_DB_NAME = 'powerdns' 6SQLALCHEMY_TRACK_MODIFICATIONS = True 7 8### DATABASE - MySQL 9SQLALCHEMY_DATABASE_URI = 'mysql://'+SQLA_DB_USER+':'+SQLA_DB_PASSWORD+'@'+SQLA_DB_HOST+'/'+SQLA_DB_NAME
Nun gehts ans Vorbereiten der Datenbank. Hierzu folgende Befehle:
1export FLASK_APP=powerdnsadmin/__init__.py 2flask db upgrade 3flask db migrate -m "Init DB"
Anschließend das frontend compilen/bauen:
1yarn install --pure-lockfile 2flask assets build
SystemD und Socket konfigurieren:
1wget -O /etc/systemd/system/powerdns-admin.service https://transfer.itbyhf.xyz/13v5Dvx/pdns_admin_systemd.service 2wget -O /etc/systemd/system/powerdns-admin.socket https://transfer.itbyhf.xyz/gRvA/pdns_admin_systemd.socket 3echo "d /run/powerdns-admin 0755 pdns pdns -" > /etc/tmpfiles.d/powerdns-admin.conf 4sudo systemctl daemon-reload 5sudo systemctl start powerdns-admin 6sudo systemctl enable powerdns-admin 7sudo chown -R pdns:pdns /run/powerdns-admin 8sudo chown -R pdns:pdns /opt/web/powerdns-admin 9sudo systemctl restart powerdns-admin
Reverse Proxy: Um nun aus dem Socket auch ne Website zu basteln, wird nun nginx als Reverse-Proxy eingesetzt.
1apt install nginx -y 2rm /etc/nginx/sites-enabled/* 3wget -O /etc/nginx/sites-enabled/default https://transfer.itbyhf.xyz/1SBNGBM/pdns-admin_nginx_default.conf 4service nginx restart
Anschließend noch die PowerDNS API aktivieren:
1echo "webserver-port=8081 2 api=yes 3 api-key=f5ee4390-6542-48c9-a2a0-e5d0bd399490" >> /etc/powerdns/pdns.conf 4systemctl restart pdns
Nun im Webinterface unter Settings -> PDNS
PowerDNS konfigurieren.
PDNS-API-URL: http://127.0.0.1:80
PDNS-API-KEY aus vorherigen Befehl
PDNS-Version per pdnsutil --version
auslesen(z.B..: 4.7.0-alpha0.210.master.gd7c28d19c ist API Version 4.7.0)