PowerDNS auf einem autoritativem Nameserver installieren
PowerDNS ist in den meisten Paketmanagern verbreiteter Distributionen vorhanden, allerdings nicht notwendigerweise in der aktuellsten Version. Es ist daher zu empfehlen die PowerDNS Repositories, die auf der Entwicklerseite zur Verfügung gestellt werden, einzubinden und dann nach einem Update der Pakete die neueste stabile Version (4.1.3) zu installieren. Diese unterstützt auch nahezu alle gängigen DNSSEC-Algorithmen.
Auf Homepage findet sich auch eine umfangreiche Dokumentation für den Betrieb als autoritativer Nameserver, unsere Seite soll aber den schnellen Einstieg und den Betrieb mit DNSSEC darlegen.
- Repositories einbinden
- Pakete installieren
- Datenbank anpassen
- PowerDNS konfigurieren
- Firewall konfigurieren
- DNSSEC aktivieren
- Testen
Backend
PowerDNS unterstützt eine Vielzahl von Backends für die Speicherung der Zonendaten. In unserem Beispiel verwenden wir aber nur das MySQL-Backend.
Repositories einbinden
Auf der PowerDNS repositories-Seite finden sich Repositories fur Debian, Ubuntu, CentOS und SLES für deren verschiedenen Versionen, aufgeteilt in Recursor und autoritativen PowerDNS. Die Repos für Debian 9 müssen in
/etc/apt/sources.list.d/pdns.list
deb [arch=amd64] http://repo.powerdns.com/debian stretch-auth-41 main
und
/etc/apt/preferences.d/pdns
Package: pdns-* Pin: origin repo.powerdns.com Pin-Priority: 600
eingetragen werden. Sowie noch den öffentlichen GPG-Schlüssel aufnehmen
curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add -
Pakete pdns-server und mysql-server installieren
Dann kann man die Distributionspakete updaten und den autoritativen Teil, d.h. pdns-server, installieren:
apt-get update apt-get install pdns-server pdns-backend-mysql mysql-server
Datenbank anpassen
Nach der MySQL-Installation über den Paketmanager, das wir im selben Aufruf mit pdns-server erledigt haben, müssen wir noch die Datenbank anpassen.
mysql_secure_installation
mysql_secure_installation Passwort und Ausgabe
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] Y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] Y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] Y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] Y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
Dann wird in MySQL die Datendank "pdns" mit den nachfolgenden Tabellen erzeugt:
CREATE DATABASE pdns character set utf8;
GRANT ALL ON pdns.* TO 'pdns'@'localhost' IDENTIFIED BY '<PDNSPASSWORD>';
FLUSH PRIVILEGES;
mysql -u root -p'YOURMYSQLPASSWORD' powerdns < /usr/share/doc/pdns-backend-mysql/schema.mysql.sql
erzeugt das für Powerdns benötigte pdns-Schema in der MySQL-Datennbank.
Dies kann man dann noch aus Interesse bzw. zur Kontrolle sich ansehen:
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| powerdns |
+--------------------+
4 rows in set (0.00 sec)
MariaDB [(none)]> use powerdns;
Database changed
MariaDB [pdns]> SHOW TABLES;
+--------------------+
| Tables_in_powerdns |
+--------------------+
| comments |
| cryptokeys |
| domainmetadata |
| domains |
| records |
| supermasters |
| tsigkeys |
+--------------------+
7 rows in set (0.01 sec)
Der Datenbank-Storagemanager sollte innodb sein, und die Dateigröße in der MySQL-Konfiguration auf 64M erhöht werden. Dazu stoppen wir MySQL:
service mysql stop
löschen die existierenden Dateien - wenn schon immodb benutzt wurde, eine Sicherungskopie erstellen!
rm /var/lib/mysql/ib_logfile*
Dann setzen wir die file_size auf 64M:
cp /etc/mysql/my.cnf /etc/mysql/my.cnf.orig
vim /etc/mysql/my.cnf
[mysql]
innodb_log_file_size = 64M
einkommentieren und starten den MySQL-Server wieder:
service mysql start
PowerDNS-Konfiguration anpassen
Wir behalten eine Sicherungskopie der Originalkonfiguration bei:
cp /etc/powerdns/pdns.d/pdns.local.gmysql.conf /etc/powerdns/pdns.d/pdns.local.gmysql.conf.orig
Editieren dann die Konfigurationsdatei, /etc/powerdns/pdns.d/pdns.local.gmysql.conf, um das MySQL-Backend anzubinden, hier setzen wir das Passwort für den Benutzer pdns.
# MySQL Configuration
#
# Launch gmysql backend
launch+=gmysql
# gmysql parameters
gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=<PDNSPASSWORD>
gmysql-dnssec=yes
Firewall anpassen
PowerDNS soll die Zonendaten von dnssec-phpipam per MySQL übernehmen. Daher erlauben wir Verbindungen über Port 3306 von dessen IP 10.156.108.35:
ufw allow from 10.156.108.35 port 3306
Für die Zonentransfers, bzw. wenn der Server der öffentliche PowerDNS sein soll, muss noch TCP Port 53 geöffnet werden. Wenn man ganz auf Nummer sicher gehen will, kann man das nur auf die IPs der jeweiligen Slave-Nameserver, z.B. den nachgeschalteten Signing Proxy (in unserem Fall dnssec-powerproxy mit der IP 10.156.116.43), einschränken:
ufw allow from 10.156.116.43 port 53
DNSSEC für Zonen aktivieren
Die DNSSEC-Signierung muss pro Zone gesetzt werden. Daher muss hierfür schon mindestens eine Zone vorhanden sein. Wir werden darauf beim Import der Daten aus phpIPAM eingehen.
Test von PowerDNS
Nun können wir unsere PowerDNS-Installation einen ersten Test unterziehen.
service pdns start
service pdns status
● pdns.service - PowerDNS Authoritative Server
Loaded: loaded (/lib/systemd/system/pdns.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-05-28 15:12:34 CEST; 1 weeks 2 days ago
Docs: man:pdns_server(1)
man:pdns_control(1)
https://doc.powerdns.com
Main PID: 97810 (pdns_server)
Tasks: 8 (limit: 19660)
CGroup: /system.slice/pdns.service
└─97810 /usr/sbin/pdns_server --guardian=no --daemon=no --disable-syslog --write-pid=no
Um die Netzwerkverbindungen zu überprüfen, installieren wir die net-tools, die uns netstat zur Verfügung stellen:
apt-get install net-tools
netstat -npl | grep 'pdns\|mysql'
tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 97810/pdns_server
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 116326/mysqld
tcp6 0 0 :::53 :::* LISTEN 97810/pdns_server
udp 0 0 0.0.0.0:53 0.0.0.0:* 97810/pdns_server
udp6 0 0 :::53 :::* 97810/pdns_server
unix 2 [ ACC ] STREAM LISTENING 1710697 97810/pdns_server /var/run/pdns.controlsocket
unix 2 [ ACC ] STREAM LISTENING 1874800 116326/mysqld /var/run/mysqld/mysqld.sock
zeigt die geöffneten Ports 53 und 3306, sowie die Sockets in /var/run, die von den Control-Programmen verwendet werden.
Eine dig-Anfrage an den localhost liefert dann eine - allerdings noch leere - Antwort:
dig @127.0.0.1
; <<>> DiG 9.10.3-P4-Debian <<>> @127.0.0.1
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 65467
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1680
;; QUESTION SECTION:
;. IN NS
;; Query time: 4 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jun 06 15:36:51 CEST 2018
;; MSG SIZE rcvd: 28