server:powerdns

PowerDNS authoritative

PowerDNS Server ist ein unter der GNU General Public License veröffentlichter Nameserver der auf allen verbreiteten Betriebsystemen eingesetzt werden kann. PowerDNS Recursor ist ein rekursiver bzw. caching-only Nameserver der seperat erhältlich ist, aber auch im Hauptpaket enthalten ist.

Verfügbare Backends:

name Funktion
bind und bind2 Liest Zonendaten aus einer Zonendatei des weit verbreiteten BIND Nameservers
db2 Kann Anfragen aus einer IBM DB2-Datenbank beantworten
geo Erlaubt je nach IP-Adressen Bereich oder geographischer Herkunft der IP-Adresse verschiedene Antworten zurückzusenden
gmysql Verwendet MySQL als Datenbank
gpgsql Verwendet PostgreSQL als Datenbank
goracle Verwendet Oracle als Datenbank
gsqlite Verwendet SQLite als Datenbank
ldap Holt Informationen aus einem hierarchisch strukturierten LDAP-Verzeichnis
odbc Greift auf Zoneninformationen in einer von ODBC unterstützten Datenbank zu. Diese Methode ist nur mit Windows als Betriebssystem möglich]
opendbx Ein auf Geschwindigkeit, Lastverteilung und Ausfallsicherheit optimiertes Datenbank Backend, das auf der OpenDBX Bibliothek aufbaut und MySQL, PostgreSQL, SQLite, Firebird, Interbase, Microsoft SQL Server und Sybase ASE Datenbanken unterstützt
pipe Fragt einen Koprozess nach Antworten auf DNS-Anfragen
random Generiert zufällige Antworten (nur zum Testen sinnvoll)

pdnsutil list-all-zones [master|slave|native]

https://real-activities.com/~phrank/host/powerdns.html

Schleife mit „dig -t axfr $Zone @$DNS:

#!/bin/bash
 
axfr_from="127.0.0.1"
zone_backup_file="pdns_fullbackup.txt"
 
set -e -o pipefail
 
function cleanup {
  EXIT_CODE=$?
  set +e # disable termination on error
  rm "$exportfile"
  rm "$exportfile_sorted"
  exit $EXIT_CODE
}
trap cleanup EXIT
 
exportfile=$(mktemp)
exportfile_sorted=$(mktemp)
 
# old versions:
# pdnssec list-all-zones > "$exportfile"
pdnsutil list-all-zones > "$exportfile"
 
cat "$exportfile" | grep -v "All zonecount" | sort > "$exportfile_sorted"
 
while read -r zeile ; do
   dig -t axfr "$zeile" @$axfr_from >> "$zone_backup_file"
done < "$exportfile_sorted"

via API:

GET /servers/{server_id}/zones
GET /servers/{server_id}/zones/{zone_id}

https://doc.powerdns.com/authoritative/http-api/zone.html

PowerDNS recursor

rec_control wipe-cache $domain
rec_control dump-cache /tmp/dns-cache

Queries loggen (erzeugt viele Logseinträge!):

quiet=no
# show last 50 log entries:
journalctl -r -n 50 --no-pager -u pdns-recursor.service

Standardmäßig führen leider Validierungsfehler nicht zu SRVFAIL, dieses Verhalten lässt sich mit der Option dnssec anpassen:

dnssec validate
# listen
local-address=0.0.0.0:53 [::]:53
# ACL (example: 1.2.3.4 / 1:2:3::4):
allow-from=127.0.0.0/8, 1.2.3.4, ::1/128, fe80::/10, 1:2:3::4

Standardmäßig macht der recursor keine queries via IPv6 („When no address of a certain address family is configured, there are no queries sent with that address family. In the default configuration this means that IPv6 is not used for outgoing queries.“), siehe https://doc.powerdns.com/recursor/settings.html#setting-query-local-address bzw. outgoing.source_address

In einer Dualstack-Konfiguration muss daher der Standard „0.0.0.0“ erweitert werden:

query-local-address=::, 0.0.0.0

anschließend macht der recursor auch IPv6-queries. Test mit (Ziel nur per IPv6 erreichbar): dig AAAA aaaa.v6ns.test-ipv6.com

dnsdist

powerdns config:

  • controlSocket("127.0.0.1")
  • setKey("your_secret_key")
dnsdist -c
dumpStats()
  1. switch pools via lua (depending on source IP of client)
  2. rewrite queries with static values (lua)
  3. delegate to a different (internal?) DNS-Server depending on asked domain