PowerDNS Admin Paneli Kurulumu ve Kullanımı

DNS yönetimi, sistem yöneticilerinin en çok zaman harcadığı konulardan biri. Özellikle birden fazla alan adı yönetiyorsanız, komut satırından zone dosyalarını düzenlemek hızla kaosa dönüşebilir. PowerDNS Admin, bu sorunu zarif bir şekilde çözen web tabanlı bir yönetim arayüzü. Bu yazıda, PowerDNS Admin’i sıfırdan kurup production ortamında nasıl kullanacağınızı adım adım anlatacağım.

PowerDNS Admin Nedir ve Neden Kullanmalısınız?

PowerDNS Admin (PDNS Admin), PowerDNS Authoritative Server için geliştirilmiş açık kaynaklı bir web yönetim panelidir. Python/Flask tabanlı olan bu uygulama, PowerDNS’in REST API’si üzerinden çalışır ve size şu imkanları sunar:

  • Çoklu zone yönetimi: Onlarca domain’i tek ekrandan yönetin
  • Kullanıcı ve yetki sistemi: Farklı kullanıcılara farklı domain’ler atayın
  • Template sistemi: Tekrar eden DNS kayıtları için şablon oluşturun
  • API desteği: Kendi otomasyon scriptlerinizle entegre edin
  • DNSSEC yönetimi: Arayüzden DNSSEC anahtarlarını yönetin
  • Aktivite logu: Kim ne zaman ne değiştirdi, takip edin

Benim kişisel tercihim, birden fazla müşteriye DNS hizmeti verirken her birine kendi alanlarını yönetebilecekleri ayrı hesaplar tanımlamak. Komut satırı güzel ama müşterinize “zone dosyasını elle düzenle” demek pek profesyonelce durmuyor.

Ön Gereksinimler

Bu rehber Ubuntu 22.04 LTS üzerinde yapılmıştır. PowerDNS Authoritative Server’ın zaten kurulu ve çalışır durumda olduğunu varsayıyorum. Eğer kurulu değilse önce onu kurmanız gerekiyor.

Minimum sistem gereksinimleri:

  • İşlemci: 2 vCPU
  • RAM: 2 GB (üretim için 4 GB önerilir)
  • Disk: 20 GB
  • İşletim Sistemi: Ubuntu 20.04/22.04 veya Debian 11/12

Kullanacağımız bileşenler:

  • PowerDNS Authoritative Server 4.7+
  • PowerDNS Admin (GitHub’dan en güncel sürüm)
  • MySQL/MariaDB: Zone veritabanı için
  • Nginx: Reverse proxy olarak
  • Python 3.10+ ve pip
  • Node.js 16+: Frontend asset’leri build etmek için

PowerDNS Authoritative Server Kurulumu ve Yapılandırması

Eğer PowerDNS kurulu değilse şu adımları takip edin:

# PowerDNS repository'sini ekle
curl -s https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add -
echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu jammy-auth-47 main" | sudo tee /etc/apt/sources.list.d/pdns.list

# Sistemi güncelle ve PowerDNS'i kur
sudo apt update
sudo apt install -y pdns-server pdns-backend-mysql

# MariaDB kur
sudo apt install -y mariadb-server mariadb-client
sudo mysql_secure_installation

Şimdi PowerDNS için veritabanını hazırlayalım:

# MariaDB'ye bağlan
sudo mysql -u root -p

# Veritabanı ve kullanıcı oluştur
CREATE DATABASE powerdns CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'pdns'@'localhost' IDENTIFIED BY 'G3rcekl1ParolaSec!';
GRANT ALL PRIVILEGES ON powerdns.* TO 'pdns'@'localhost';
FLUSH PRIVILEGES;
EXIT;

# PowerDNS schema'yı import et
sudo mysql -u pdns -p powerdns < /usr/share/doc/pdns-backend-mysql/schema.mysql.sql

PowerDNS yapılandırma dosyasını düzenleyelim:

sudo nano /etc/powerdns/pdns.conf

Dosyaya şu satırları ekleyin veya mevcut olanları düzenleyin:

# Temel ayarlar
launch=gmysql
gmysql-host=127.0.0.1
gmysql-user=pdns
gmysql-password=G3rcekl1ParolaSec!
gmysql-dbname=powerdns

# API ayarları (PowerDNS Admin için şart)
api=yes
api-key=gizli-api-anahtariniz-buraya-girin
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081
webserver-allow-from=127.0.0.1

# Zone transfer ayarları
allow-axfr-ips=127.0.0.1
# PowerDNS'i yeniden başlat
sudo systemctl restart pdns
sudo systemctl enable pdns

# Çalışıyor mu kontrol et
sudo systemctl status pdns

API’nin çalıştığını test edelim:

curl -s -H 'X-API-Key: gizli-api-anahtariniz-buraya-girin' 
  http://127.0.0.1:8081/api/v1/servers/localhost | python3 -m json.tool

Bu komut sunucu bilgilerini JSON formatında döndürmeli. Eğer başarılı bir yanıt geliyorsa devam edebiliriz.

PowerDNS Admin Kurulumu

Şimdi asıl konumuza, web arayüzünün kurulumuna geçelim. Ben Docker olmadan, doğrudan sistemde kurulum yapacağım. Daha temiz bir ortam ister ve bağımlılıkları izole etmek istiyorsanız Docker da tercih edebilirsiniz, ama üretim ortamında sistemin kontrolünü direkt tutmayı seviyorum.

# Bağımlılıkları kur
sudo apt install -y python3-dev python3-pip python3-venv 
  libmysqlclient-dev libsasl2-dev libldap2-dev libssl-dev 
  libxml2-dev libxslt1-dev libxmlsec1-dev pkg-config 
  build-essential curl git

# Node.js kur (Yarn için gerekli)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
sudo npm install -g yarn

# PowerDNS Admin kullanıcısı oluştur
sudo useradd -r -s /sbin/nologin -d /opt/pdnsadmin pdnsadmin

# Kurulum dizinini hazırla
sudo mkdir -p /opt/pdnsadmin
sudo chown pdnsadmin:pdnsadmin /opt/pdnsadmin

# GitHub'dan çek
sudo -u pdnsadmin git clone https://github.com/PowerDNS-Admin/PowerDNS-Admin.git /opt/pdnsadmin/app
cd /opt/pdnsadmin/app

# Python virtual environment oluştur
sudo -u pdnsadmin python3 -m venv /opt/pdnsadmin/venv
sudo -u pdnsadmin /opt/pdnsadmin/venv/bin/pip install --upgrade pip
sudo -u pdnsadmin /opt/pdnsadmin/venv/bin/pip install -r requirements.txt

Uygulama Yapılandırması

PowerDNS Admin için konfigürasyon dosyasını oluşturalım:

sudo -u pdnsadmin cp /opt/pdnsadmin/app/configs/development.py 
  /opt/pdnsadmin/app/configs/production.py

sudo nano /opt/pdnsadmin/app/configs/production.py

Dosyayı şu şekilde düzenleyin:

import os
import urllib.parse

# Genel ayarlar
SECRET_KEY = 'cok-gizli-bir-anahtar-uretmeyi-unutmayin'
BIND_ADDRESS = '0.0.0.0'
PORT = 9191
LOGIN_TITLE = 'DNS Yonetim Paneli'

# Veritabanı ayarları
SQLA_DB_USER = 'pdnsadmin'
SQLA_DB_PASSWORD = 'BaskaBirParola123!'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'pdnsadmin'
SQLALCHEMY_TRACK_MODIFICATIONS = True

# PowerDNS API bağlantısı
PDNS_STATS_URL = 'http://127.0.0.1:8081/'
PDNS_API_KEY = 'gizli-api-anahtariniz-buraya-girin'
PDNS_VERSION = '4.7.0'

# Session güvenliği
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_HTTPONLY = True

Şimdi PowerDNS Admin için ayrı bir veritabanı oluşturalım:

sudo mysql -u root -p

CREATE DATABASE pdnsadmin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'pdnsadmin'@'localhost' IDENTIFIED BY 'BaskaBirParola123!';
GRANT ALL PRIVILEGES ON pdnsadmin.* TO 'pdnsadmin'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Veritabanı tablolarını oluşturun ve frontend’i derleyin:

cd /opt/pdnsadmin/app

# Environment değişkenini ayarla
export FLASK_APP=powerdnsadmin/__init__.py
export FLASK_CONF=../configs/production.py

# Veritabanı migration'larını çalıştır
sudo -u pdnsadmin /opt/pdnsadmin/venv/bin/flask db upgrade

# Frontend asset'leri derle
sudo -u pdnsadmin yarn install --pure-lockfile
sudo -u pdnsadmin yarn build

Systemd Servisi Oluşturma

Uygulamanın sistem başlangıcında otomatik başlaması için bir systemd unit dosyası oluşturun:

sudo nano /etc/systemd/system/pdnsadmin.service
[Unit]
Description=PowerDNS Admin Web Arayuzu
After=network.target mariadb.service pdns.service

[Service]
User=pdnsadmin
Group=pdnsadmin
WorkingDirectory=/opt/pdnsadmin/app
Environment="FLASK_APP=powerdnsadmin/__init__.py"
Environment="FLASK_CONF=../configs/production.py"
ExecStart=/opt/pdnsadmin/venv/bin/gunicorn 
  --workers 4 
  --bind unix:/opt/pdnsadmin/pdnsadmin.sock 
  --access-logfile /var/log/pdnsadmin/access.log 
  --error-logfile /var/log/pdnsadmin/error.log 
  "powerdnsadmin:create_app()"
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
# Log dizini oluştur
sudo mkdir -p /var/log/pdnsadmin
sudo chown pdnsadmin:pdnsadmin /var/log/pdnsadmin

# Servisi etkinleştir ve başlat
sudo systemctl daemon-reload
sudo systemctl enable pdnsadmin
sudo systemctl start pdnsadmin
sudo systemctl status pdnsadmin

Nginx Reverse Proxy Yapılandırması

sudo apt install -y nginx
sudo nano /etc/nginx/sites-available/pdnsadmin
server {
    listen 80;
    server_name dns.sirketiniz.com;
    
    # HTTP'den HTTPS'e yönlendir
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name dns.sirketiniz.com;

    ssl_certificate /etc/ssl/certs/pdnsadmin.crt;
    ssl_certificate_key /etc/ssl/private/pdnsadmin.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;

    access_log /var/log/nginx/pdnsadmin_access.log;
    error_log /var/log/nginx/pdnsadmin_error.log;

    location / {
        proxy_pass http://unix:/opt/pdnsadmin/pdnsadmin.sock;
        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_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
    }

    location /static {
        alias /opt/pdnsadmin/app/powerdnsadmin/static;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}
# Nginx konfigürasyonunu etkinleştir
sudo ln -s /etc/nginx/sites-available/pdnsadmin /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

İlk Giriş ve Temel Yapılandırma

Tarayıcınızdan https://dns.sirketiniz.com adresine gidin. İlk açılışta admin hesabı oluşturmanız istenecek. Bu adımı dikkatlice yapın çünkü bu hesap tam yetkili admin hesabıdır.

Giriş yaptıktan sonra yapmanız gereken ilk işlemler:

Admin Paneli ayarları:

  • Settings > PowerDNS bölümüne gidin
  • API URL’sini http://127.0.0.1:8081/ olarak girin
  • API Key’i girin ve bağlantıyı test edin
  • Default record TTL değerini ortamınıza göre ayarlayın (genellikle 3600)

Yeni Zone Ekleme

Sol menüden New Domain seçeneğine tıklayın:

  • Domain Name: ornek.com
  • Domain Type: Native (tek sunucu için), Master (primary NS), Slave (secondary NS)
  • SOA-EDIT-API: DEFAULT seçin

Zone oluşturduktan sonra temel kayıtları ekleyin:

A kaydı:

  • Name: @
  • Type: A
  • TTL: 3600
  • Content: 1.2.3.4

MX kaydı:

  • Name: @
  • Type: MX
  • TTL: 3600
  • Content: 10 mail.ornek.com

CNAME kaydı:

  • Name: www
  • Type: CNAME
  • TTL: 3600
  • Content: ornek.com

Kullanıcı Yönetimi ve Yetkilendirme

Gerçek dünya senaryosu: Bir hosting firması için PowerDNS Admin kuruyorsunuz. Her müşterinin sadece kendi domain’lerini görmesi ve düzenleyebilmesi gerekiyor.

User Management > Add User bölümünden yeni kullanıcı oluşturun:

  • Rol Tipleri:
  • Administrator: Her şeye tam erişim
  • Operator: Domain ekleyip silebilir, kullanıcı yönetemez
  • User: Sadece kendisine atanan domain’leri düzenleyebilir

Müşteri hesabı oluşturduktan sonra User Management > Manage Domains bölümünden o kullanıcıya hangi domain’lerin atanacağını seçin. Kullanıcı giriş yaptığında sadece kendisine ait domain’leri görecektir.

API ile Otomasyon

PowerDNS Admin’in kendi API’si de bulunuyor. CI/CD pipeline’larında veya IaC (Infrastructure as Code) süreçlerinde DNS kayıtlarını otomatik yönetmek için kullanabilirsiniz:

# API token al (önce web arayüzünden token oluşturun)
PDNS_ADMIN_URL="https://dns.sirketiniz.com"
API_TOKEN="web-arayuzunden-olusturdugunuz-token"

# Tüm zone'ları listele
curl -s -H "X-API-Key: ${API_TOKEN}" 
  "${PDNS_ADMIN_URL}/api/v1/pdnsadmin/zones" | python3 -m json.tool

# Yeni A kaydı ekle
curl -s -X POST 
  -H "X-API-Key: ${API_TOKEN}" 
  -H "Content-Type: application/json" 
  -d '{
    "rrsets": [{
      "name": "yeni-servis.ornek.com.",
      "type": "A",
      "ttl": 300,
      "changetype": "REPLACE",
      "records": [{"content": "5.6.7.8", "disabled": false}]
    }]
  }' 
  "${PDNS_ADMIN_URL}/api/v1/servers/localhost/zones/ornek.com."

Yedekleme ve Bakım

DNS verilerinizi düzenli olarak yedekleyin. Ben şöyle bir script kullanıyorum:

#!/bin/bash
# /usr/local/bin/pdns-backup.sh

BACKUP_DIR="/opt/backups/pdns"
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_USER="root"
MYSQL_PASS="root-parolasi"

mkdir -p "${BACKUP_DIR}"

# Veritabanlarını yedekle
mysqldump -u "${MYSQL_USER}" -p"${MYSQL_PASS}" powerdns | 
  gzip > "${BACKUP_DIR}/powerdns_${DATE}.sql.gz"

mysqldump -u "${MYSQL_USER}" -p"${MYSQL_PASS}" pdnsadmin | 
  gzip > "${BACKUP_DIR}/pdnsadmin_${DATE}.sql.gz"

# Zone'ları zone-file formatında da yedekle
for zone in $(curl -s -H 'X-API-Key: gizli-api-anahtariniz-buraya-girin' 
  http://127.0.0.1:8081/api/v1/servers/localhost/zones | 
  python3 -c "import sys,json; [print(z['id']) for z in json.load(sys.stdin)]"); do
  
  curl -s -H 'X-API-Key: gizli-api-anahtariniz-buraya-girin' 
    "http://127.0.0.1:8081/api/v1/servers/localhost/zones/${zone}/export" 
    > "${BACKUP_DIR}/${zone}_${DATE}.zone"
done

# 30 günden eski yedekleri sil
find "${BACKUP_DIR}" -type f -mtime +30 -delete

echo "Yedekleme tamamlandi: ${DATE}"
# Script'i çalıştırılabilir yap
sudo chmod +x /usr/local/bin/pdns-backup.sh

# Cron'a ekle (her gece 02:00'de çalışsın)
echo "0 2 * * * root /usr/local/bin/pdns-backup.sh >> /var/log/pdns-backup.log 2>&1" | 
  sudo tee /etc/cron.d/pdns-backup

Sık Karşılaşılan Sorunlar ve Çözümleri

Sorun: API bağlantısı başarısız, “Unable to connect to PowerDNS API” hatası

pdns.conf dosyasında webserver-allow-from satırını kontrol edin. PowerDNS Admin’in çalıştığı IP’nin bu listede olması gerekiyor. Lokal kurulumda 127.0.0.1 olmalı.

Sorun: Zone değişiklikleri uygulanmıyor

PowerDNS’in zone cache’ini temizleyin:

sudo pdns_control purge
# veya belirli bir zone için:
sudo pdns_control purge ornek.com

Sorun: Gunicorn socket izin hatası

# Socket dizininin izinlerini kontrol et
ls -la /opt/pdnsadmin/pdnsadmin.sock
# Nginx'in pdnsadmin grubuna dahil olduğundan emin ol
sudo usermod -aG pdnsadmin www-data
sudo systemctl restart nginx pdnsadmin

Sorun: Migration hatası, “Table already exists”

cd /opt/pdnsadmin/app
export FLASK_APP=powerdnsadmin/__init__.py
export FLASK_CONF=../configs/production.py
sudo -u pdnsadmin /opt/pdnsadmin/venv/bin/flask db stamp head
sudo -u pdnsadmin /opt/pdnsadmin/venv/bin/flask db upgrade

Güvenlik Önerileri

Üretim ortamında mutlaka dikkat etmeniz gereken güvenlik adımları:

  • Güçlü API anahtarı kullanın: openssl rand -hex 32 komutuyla rastgele üretin
  • Fail2ban entegrasyonu: Başarısız giriş denemelerini engelleyin
  • IP kısıtlaması: Admin paneline erişimi belirli IP’lerle sınırlayın, Nginx’te allow/deny direktiflerini kullanın
  • HTTPS zorunlu kılın: HTTP trafiğini kesinlikle engellein
  • Düzenli güncellemeler: git pull ile uygulamayı güncel tutun, PowerDNS paketlerini düzenli güncelleyin
  • Log izleme: /var/log/pdnsadmin/ dizinini düzenli takip edin
  • Güçlü parola politikası: Admin hesabı için en az 16 karakter, özel karakter içeren parola kullanın

Sonuç

PowerDNS Admin, özellikle birden fazla domain yönetmek zorunda olan sysadmin’ler için gerçek bir zaman kazandırıcı. Kurulum ilk bakışta biraz uzun görünebilir ama bir kez çalıştırdıktan sonra DNS yönetimi çok daha keyifli hale geliyor. Web arayüzü üzerinden zone eklemek, kayıt düzenlemek ve kullanıcılara yetki vermek dakikalar alıyor, üstelik hata yapma ihtimaliniz komut satırına kıyasla çok daha düşük.

Kendi ortamımda bu kurulumu yaklaşık 30 müşteri domain’i için kullanıyorum. Müşterilere kendi DNS kayıtlarını yönetebilecekleri sınırlı yetkili hesaplar tanımladım ve destek taleplerinde ciddi bir düşüş yaşadım. API desteği sayesinde de Terraform ile altyapı oluştururken DNS kayıtlarını otomatik ekleyip kaldırabiliyor, CI/CD süreçlerine sorunsuz entegre edebiliyorum.

Herhangi bir adımda sorun yaşarsanız veya farklı bir senaryo için yapılandırma desteği isterseniz yorum bırakabilirsiniz.

Yorum yapın