Key Features
- Native DNSSEC support with automatic signing
- RESTful API for zone management
- Multiple backends (MySQL, PostgreSQL, SQLite)
- High-performance packet and query caching
Prerequisites
Before starting, ensure you have:
Server Requirements
- • RamNode VPS with Ubuntu 24.04 LTS
- • Minimum 1GB RAM, 1 vCPU
- • Root or sudo access
- • Static public IP address
Recommended Specs
| Use Case | RAM | Storage |
|---|---|---|
| < 100 zones | 1 GB | 20 GB |
| 100-1000 zones | 2 GB | 40 GB |
| 1000+ zones | 4+ GB | 80+ GB |
System Preparation
Update System Packages
sudo apt update && sudo apt upgrade -y
sudo rebootDisable systemd-resolved
Ubuntu uses systemd-resolved for DNS resolution, which binds to port 53 and conflicts with PowerDNS:
sudo systemctl disable --now systemd-resolved
sudo rm /etc/resolv.confConfigure Static DNS Resolution
sudo tee /etc/resolv.conf << EOF
nameserver 8.8.8.8
nameserver 8.8.4.4
EOFPrevent resolv.conf Modification
sudo chattr +i /etc/resolv.confMariaDB Installation
Install MariaDB Server
sudo apt install mariadb-server mariadb-client -ySecure MariaDB Installation
sudo mysql_secure_installationSet a strong root password, remove anonymous users, disallow remote root login, and remove the test database.
Create PowerDNS Database and User
sudo mysql -u root -pCREATE DATABASE pdns;
CREATE USER 'pdns'@'localhost' IDENTIFIED BY 'YOUR_SECURE_PASSWORD';
GRANT ALL PRIVILEGES ON pdns.* TO 'pdns'@'localhost';
FLUSH PRIVILEGES;
EXIT;⚠️ Important: Replace YOUR_SECURE_PASSWORD with a strong, randomly generated password. Store this securely.
PowerDNS Installation
Install from Ubuntu Repository
sudo apt install pdns-server pdns-backend-mysql -yAlternative: Install from PowerDNS Repository
For the latest version, add the official PowerDNS repository:
# Add PowerDNS GPG key
curl -fsSL https://repo.powerdns.com/FD380FBB-pub.asc | \
sudo gpg --dearmor -o /etc/apt/keyrings/powerdns.gpg
# Add repository
echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/powerdns.gpg] \
http://repo.powerdns.com/ubuntu noble-auth-49 main' | \
sudo tee /etc/apt/sources.list.d/pdns.list
# Set package priority
sudo tee /etc/apt/preferences.d/pdns << EOF
Package: pdns-*
Pin: origin repo.powerdns.com
Pin-Priority: 600
EOF
sudo apt update
sudo apt install pdns-server pdns-backend-mysql -yPowerDNS Configuration
Backup Default Configuration
sudo cp /etc/powerdns/pdns.conf /etc/powerdns/pdns.conf.backupConfigure MySQL Backend
sudo tee /etc/powerdns/pdns.d/mysql.conf << EOF
# MySQL/MariaDB Backend Configuration
launch+=gmysql
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=YOUR_SECURE_PASSWORD
gmysql-dnssec=yes
EOFSet Secure Permissions
sudo chmod 640 /etc/powerdns/pdns.d/mysql.conf
sudo chown root:pdns /etc/powerdns/pdns.d/mysql.confMain Configuration File
Edit /etc/powerdns/pdns.conf with these key settings:
# Network settings
local-address=0.0.0.0
local-port=53
# Security settings
setuid=pdns
setgid=pdns
# Performance tuning
cache-ttl=60
query-cache-ttl=20
# Logging
log-dns-queries=no
log-dns-details=no
loglevel=4Database Schema Setup
Import PowerDNS Schema
curl -o /tmp/schema.sql \
https://raw.githubusercontent.com/PowerDNS/pdns/master/modules/gmysqlbackend/schema.mysql.sql
mysql -u pdns -p pdns < /tmp/schema.sqlVerify Schema Installation
mysql -u pdns -p -e 'SHOW TABLES;' pdnsExpected tables: domains, records, supermasters, comments, domainmetadata, cryptokeys, tsigkeys
Start and Enable PowerDNS
sudo systemctl enable pdns
sudo systemctl start pdns
sudo systemctl status pdnsVerify Installation
sudo systemctl stop pdns
sudo pdns_server --daemon=no --guardian=no --loglevel=9Look for 'gmysql Connection successful' messages. Press Ctrl+C to stop, then restart the service.
sudo systemctl start pdnsAPI Configuration
PowerDNS includes a built-in REST API for programmatic zone management. Enable it for integration with management tools like PowerDNS-Admin.
Generate API Key
openssl rand -base64 32Save this key securely. You will need it for API authentication.
Enable API in Configuration
Add the following to /etc/powerdns/pdns.conf:
# API and Webserver Configuration
api=yes
api-key=YOUR_GENERATED_API_KEY
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081
webserver-allow-from=127.0.0.1,::1
webserver-password=YOUR_WEBSERVER_PASSWORDRestart PowerDNS
sudo systemctl restart pdnsTest API Access
curl -H 'X-API-Key: YOUR_API_KEY' \
http://127.0.0.1:8081/api/v1/servers/localhost | jq .Security Hardening
Firewall Configuration (UFW)
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 53/tcp comment 'DNS TCP'
sudo ufw allow 53/udp comment 'DNS UDP'
sudo ufw enableAlternative: iptables
sudo iptables -A INPUT -p tcp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo netfilter-persistent saveSecurity Best Practices
- Run PowerDNS as non-root user (setuid/setgid already configured)
- Restrict API access to localhost only
- Use strong, unique passwords for database and API
- Enable DNSSEC for all zones
- Monitor logs for suspicious activity
Disable Zone Transfers
Unless required for secondary servers, disable AXFR:
# In pdns.conf
disable-axfr=yes
# Or restrict to specific IPs
allow-axfr-ips=192.168.1.0/24,10.0.0.5DNSSEC Configuration
PowerDNS provides native DNSSEC support with automatic online signing, eliminating the need for external signing tools.
Create a Zone
sudo pdnsutil create-zone example.com ns1.example.comAdd DNS Records
sudo pdnsutil add-record example.com @ A 300 YOUR_SERVER_IP
sudo pdnsutil add-record example.com @ NS 86400 ns1.example.com
sudo pdnsutil add-record example.com ns1 A 86400 YOUR_SERVER_IP
sudo pdnsutil add-record example.com www A 300 YOUR_SERVER_IPEnable DNSSEC for Zone
Secure the zone with DNSSEC (generates ECDSA P-256 key by default):
sudo pdnsutil secure-zone example.com
sudo pdnsutil rectify-zone example.comView DS Records
sudo pdnsutil show-zone example.comSubmit the DS record to your domain registrar to complete the DNSSEC chain of trust.
DNSSEC Key Management Commands
pdnsutil list-keys example.com- List keyspdnsutil show-zone example.com- Show zone infopdnsutil export-zone-ds example.com- Export DSpdnsutil unset-presigned example.com- Unsecure zone
Testing and Verification
Check Service Status
sudo systemctl status pdns
sudo ss -tlnp | grep pdnsTest DNS Resolution
dig @127.0.0.1 example.com A
dig @127.0.0.1 example.com NS
dig @127.0.0.1 example.com SOAVerify DNSSEC
dig @127.0.0.1 example.com DNSKEY +dnssec
dig @127.0.0.1 example.com A +dnssecCheck PowerDNS Statistics
sudo pdns_control showExternal Testing
dig @YOUR_SERVER_IP example.com A
# Use online tools like dnsviz.net for DNSSEC validationTroubleshooting
Common Issues
Port 53 Already in Use
sudo ss -tlnp | grep :53
# Ensure systemd-resolved is disabled
sudo systemctl status systemd-resolvedDatabase Connection Failed
# Verify credentials
mysql -u pdns -p pdns -e 'SELECT 1;'
# Check configuration file permissions
ls -la /etc/powerdns/pdns.d/Service Won't Start
# Check logs
sudo journalctl -u pdns -n 50
# Test configuration
sudo pdns_server --daemon=no --guardian=no --loglevel=9Useful Commands
journalctl -u pdns -f- View logspdnsutil list-all-zones- Check configpdns_control show- Statisticspdns_control purge- Clear cachepdns_control reload- Reload zones
Log Locations
| Log Type | Location/Command |
|---|---|
| PowerDNS service logs | journalctl -u pdns |
| System logs | /var/log/syslog |
| MariaDB logs | /var/log/mysql/error.log |
Deployment Complete!
Your PowerDNS authoritative server is now deployed with MariaDB backend and DNSSEC support. This enterprise-grade setup is ideal for hosting providers requiring scalable DNS infrastructure.
