Linux Lab Ortamı 02 — Docker PowerDNS ve PowerDNS Admin Panel Kurulumu

Aykut ÖZKAN
9 min readFeb 1, 2024

--

Merhabalar,

Yazı dizimizin üçüncü yazısı olan docker üzerinde PowerDNS ve PowerDNS Admin panel kurulumu ile devam ediyoruz. Tabi ki isterseniz linux sunucunuz üzerine de doğrudan kurulumu gerçekleştirebilirsiniz fakat ben bu yazıda docker üzerinde kurulum gerçekleştirerek sunucu üzerinde kurulacak bir çok bağımlılıktan kurtulmak istiyorum. Böylelikle ileride farklı bir dns server kurmak veya kullanmak istediğimiz durumda bu bize ciddi bir kolaylık sağlayacaktır. Ayrıca kurulumlar sırasında oluşacak çakışma veya arta kalan paket gibi problemler ile karşılaşmamızı engelleyecektir.

Ana amacımız dns hizmetini kurmak olduğundan, kuruluma geçmeden önce isterseniz dns’i hızlıca bir açıklamaya çalışalım.

DNS Nedir?

Dns en basit ifade ile bir tarayıcı kullanarak ulaşmak istediğimiz web sitesinin ip adresi yerine domain adı üzerinden arama yapmamızı sağlayan ve arka planda domain adının bağlı olduğu sunucu ip adresini bulup bizi ilgili sunucuya yönlendiren bir yapıdır diyebiliriz.

How does dns work?
Dns Workflow — (Dns Akışı)

Yukarıda dns çalışma yapısı ile ilgili örnek bir görseli sizlerle paylaştım. Bu görseli baz alarak dns çalışma yapısını biraz daha teknik olarak açıklamak gerekirse; öncelikle browser üzerinde domain adı ile arama yaptığımızda ilk olarak browser/os cache’den kontrol sağlar, (browser/os) local cache üzerinde bu bilginin olmaması durumunda, internet servis sağlayıcımızın (ISP) router’ına istek ulaşır. İsteğin ISP Router servisine ulaşması sonrası aranan domain bilgisine ait server ip adresi cache üzerinde bulunması halinde istekler doğrudan ilgili web sunucusuna yönlendirilir. Eğer cache sisteminde domain’e ait bir bilgi yok ise bu sefer Root DNS Server sisteminden bu bilgi talep edilir. Root DNS server ilgili domain’e ait TLD DNS server bilgisini döner. ISP router bu sefer TLD Dns server’a istekte bulunur ve ilgili sunucu bilgisini sorar. TLD DNS server ise ilgili domain bilgisini barındıran Authoritative DNS Server bilgisini geri döner. ISP Router bu sefer Authoritative DNS Server’a istekte bulunur. Authoritative DNS Server ise ilgili domain’e ait sunucunun ip adresini geri döner. Akabinde ISP Router isteği ilgili web sunucusuna yönlendirir. Son adımda ise web sunucusundan dönen yanıtı kullanıcıya dönerek, tarayıcı üzerinde bu bilgileri gösterir. İşte tüm bu süreç dns çalışma yapısını ifade etmektedir. Daha fazla teknik bilgi için gerekli olan araştırma kısmını sizlere bırakıyorum. :)

PowerDNS Nedir?

PowerDNS; local ortamda veya büyük yapılarda, gerek iç ağ gerekse dış ağda kullanılmak üzere bir dns hizmeti sunmamızı sağlayan hem açık kaynaklı hemde ücretli (lisanslı) bir sürümü bulunan dns server uygulamasıdır. Bu uygulama sayesinde projelerimize domain tanımlamaları yaparak hem iç ağda hemde dış ağda hizmet verebiliriz.

PowerDNS Admin Nedir?

PowerDNS aslında sunucu üzerine kurulan ve arka planda çalışan bir servistir. Yeni domain tanımlamalarında veya var olan domain’ler için düzenleme yapmamız gerektiğinde bu düzenlemeleri terminal üzerinden veya harici text editörler yardımı ile yapmamız gerekiyor. Fakat bu konfigürasyon dosyaları konuya çok vakıf olmadığımız durumda içinden çıkılması zor bir hal alabiliyor. En büyük problem ise dosya konfigürasyonu üzerinde yapılacak bir hata sonrası sistemlerin ulaşılamaz duruma gelmesidir. İşte bu konuda terminal veya harici bir editor ile dosyaları arayıp, bulup düzenlemeye gerek kalmadan, hızlıca çalışabileceğimiz PowerDNS Admin adında açık kaynaklı python ile geliştirilmiş bir web uygulaması bulunmaktadır. Kaynak kodlar için tıklayınız.

NOT! Kurulumlar docker üzerinde gerçekleştirileceğinden dolayı sisteminizde docker kurulu olmalıdır. Eğer sisteminiz üzerinde docker kurulu değil ise linux üzerine docker kurulumu başlıklı bir önceki yazımızı okumanızı rica ediyorum.

Docker Üzerinde PowerDNS ve PowerDNS Admin Kurulumu

Öncelikle ilgili sunucunuza ssh ile bağlanıp sizin için çalışması uygun olan bir dizine geçiş yapınız. Ben burada örnek çalışma için /home/aykut dizinine geçiş yapıyorum. Sonrasında komut satırına sırası ile aşağıdaki komutları yazarak yeni bir klasör ve kurulum bilgilerini barındıracak docker yml dosyasını oluşturup ilgili dosyayı düzenliyoruz.

# power-dns adında bir klasör oluşturuyoruz.
mkdir power-dns # enter tuşuna basıyoruz.

# power-dns dizinine geçiş yapıyoruz.
cd power-dns/ # enter tuşuna basıyoruz.

# docker-compose-pgsql.yml dosyasını oluşturuyoruz.
touch docker-compose-pgsql.yml # enter tuşuna basıyoruz.

# şimdi ise oluşturduğumuz docker-compose-pgsql.yml dosyasını vi editör
# yardımı ile düzenliyoruz.
vi docker-compose-pgsql.yml # enter tuşuna basıyoruz.

Şimdi ise vi editör ile açtığımız dosyaya aşağıdaki kodları yazıyoruz ama öncelikle vi editörde “i” tuşuna basmamız gerekiyor. Aksi halde yazı yazamayacaksınız.

version: '2.4'

services:

pdns-recursor-pgsql:
image: pschiffe/pdns-recursor:${RECURSOR_TAG:-latest}
networks:
- pdns-pgsql
volumes:
- /etc/localtime:/etc/localtime:ro
ulimits:
nofile:
soft: 5000
hard: 5000

postgres:
#image: postgres:16-alpine
image: postgres:16
networks:
pdns-pgsql:
aliases:
- db
- pgsql
volumes:
- /etc/localtime:/etc/localtime:roa
- ./pgsql:/var/lib/postgresql/data:Z
- ./pgsql_conf/pg_hba.conf:/etc/postgresql/pg_hba.conf
- ./pgsql_conf/postgresql.conf:/etc/postgresql/postgresql.conf
environment:
- POSTGRES_PASSWORD=kullanmak_istediginiz_db_sifre_bilgisini_giriniz
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
#- POSTGRES_HOST_AUTH_METHOD="scram-sha-256"
#- POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256 --auth-local=scram-sha-256"
healthcheck:
test: ['CMD', 'pg_isready', '-U', 'postgres']
timeout: 10s
retries: 5

adminer:
image: adminer
networks:
- pdns-pgsql
ports:
- '7988:8080'
volumes:
- /etc/localtime:/etc/localtime:ro

pdns-pgsql-master:
image: pschiffe/pdns-pgsql:${PDNS_PGSQL_TAG:-latest}
hostname: ns1.example.com
networks:
pdns-pgsql:
ipv4_address: 172.8.0.20
aliases:
- pdns
ports:
- '53:53'
- '53:53/udp'
extra_hosts:
- 'ns1.example.com:172.8.0.20'
- 'ns2.example.com:172.8.0.21'
volumes:
- /etc/localtime:/etc/localtime:ro
environment:
- PDNS_gpgsql_password=kullanmak_istediginiz_db_sifre_bilgisini_giriniz
- PDNS_master=yes
- PDNS_api=yes
- PDNS_api_key=kullanmak_istediginiz_api_sifre_bilgisini_giriniz
- PDNS_webserver=yes
- PDNS_webserver_address=0.0.0.0
- PDNS_webserver_allow_from=172.8.0.0/16
- PDNS_version_string=anonymous
- PDNS_default_ttl=1500
- PDNS_allow_axfr_ips=172.8.0.21
- PDNS_only_notify=172.8.0.21
depends_on:
- postgres

pdns-pgsql-slave:
image: pschiffe/pdns-pgsql:${PDNS_PGSQL_TAG:-latest}
hostname: ns2.example.com
networks:
pdns-pgsql:
ipv4_address: 172.8.0.21
extra_hosts:
- 'ns1.example.com:172.8.0.20'
- 'ns2.example.com:172.8.0.21'
volumes:
- /etc/localtime:/etc/localtime:ro
environment:
- PDNS_gpgsql_dbname=powerdnsslave
- PDNS_gpgsql_password=kullanmak_istediginiz_db_sifre_bilgisini_giriniz
- PDNS_slave=yes
- PDNS_superslave=yes
- PDNS_webserver=yes
- PDNS_webserver_address=0.0.0.0
- PDNS_webserver_allow_from=172.8.0.0/16
- PDNS_version_string=anonymous
- PDNS_disable_axfr=yes
- PDNS_allow_notify_from=172.8.0.20
- SUPERMASTER_IPS=172.8.0.20
depends_on:
- postgres
- pdns-pgsql-master

pdns-admin-pgsql:
image: pschiffe/pdns-admin
networks:
pdns-pgsql:
aliases:
- pdns-admin
ports:
- '7989:8080'
volumes:
- /etc/localtime:/etc/localtime:ro
environment:
- PDNS_ADMIN_SQLA_DB_TYPE=postgres
- PDNS_ADMIN_SQLA_DB_HOST=pgsql
- PDNS_ADMIN_SQLA_DB_PORT=5432
- PDNS_ADMIN_SQLA_DB_USER=postgres
- PDNS_ADMIN_SQLA_DB_PASSWORD=kullanmak_istediginiz_db_sifre_bilgisini_giriniz
- PDNS_VERSION=4.8
- PDNS_API_KEY=kullanmak_istediginiz_api_sifre_bilgisini_giriniz
depends_on:
- postgres
- pdns-pgsql-master

networks:
pdns-pgsql:
ipam:
config:
- subnet: 172.8.0.0/16
gateway: 172.8.0.1

volumes:
pgsql:

Yukarıdaki komutları vi editör ile açmış olduğunuz dosyaya kopyala — yapıştır da yapabilirsiniz. Editörden çıkmadan önce lütfen dosya üzerinde aşağıda belirtilen alanları kendinize göre güncelleyiniz. Düzenleme işlemi bittikten sonra editör üzerinde sırası ile “ESC + : + w + q + enter” tuşlarını kullanarak editörden çıkın.

Düzenlenecek Alanlar

hostname: ns1.example.com # alana kendi domain bilginizi giriniz.

# alanları da yine kendi kullanmak istediğiniz domain bilgisine göre
# güncelleyiniz.
extra_hosts:
- 'ns1.example.com:172.8.0.20'
- 'ns2.example.com:172.8.0.21'

# Örneğin;
- 'ns1.cloudyazilim.com:172.8.0.20'
- 'ns2.cloudyazilim.com:172.8.0.21'

# db için kullanılmasını istediğiniz bir şifre belirleyiniz.
# dosya üzerinde 'kullanmak_istediginiz_db_sifre_bilgisini_giriniz'
# gecen yerleri güncelleyiniz.
PDNS_gpgsql_password=kullanmak_istediginiz_db_sifre_bilgisini_giriniz


# api servisinde kullanılmak üzere istediğiniz bir şifreyi giriniz.
# dosya üzerinde 'kullanmak_istediginiz_api_sifre_bilgisini_giriniz'
# gecen yerleri güncelleyiniz.
PDNS_API_KEY=kullanmak_istediginiz_api_sifre_bilgisini_giriniz

Tüm bu düzenlemeleri tamamladıktan sonra editörümüzden çıkabiliriz. Editörden çıktığımıza göre şimdi powerdns hizmetini docker üzerinde çalıştırabiliriz. Bunun için yine terminal üzerindeyken aşağıdaki komutu çalıştırıyoruz.

docker compose -f docker-compose-pgsql.yml up -d

Böylelikle toplamda bir master ve bir slave olmak üzere 2 dns hizmeti (powerdns), bu hizmetler için kullanılacak bir postgresql veritabanı ve dns hizmetlerini yönetebileceğimiz bir panel uygulaması (powerdns admin) docker üzerinde çalışmaya başlayacaktır.

NOT! yukarıdaki docker compose dosyasının orjinalinde postgreSQL alpine iso sürümü kullanılmaktadır. Fakat yaptığım kontroller sırasında alpine iso sürümünde scram-sha-256 hatası ile karşılaştığımdan ve container üzerinde ekstra düzenlemeler yapmam gerektiğinden dolayı açıkçası çok uğraşmadım. Ama siz isterseniz harici olarak bu konu ile ilgili inceleme yapabilirsiniz.

NOT! docker compose komutunu çalıştırdığımızda 53 portunun kullanıldığına dair bir hata mesajı ile karşılaşırsanız aşağıdaki adımları uygulayabilirsiniz.

Portun kullanıldığını doğrulamak ve aktif portları listelemek için terminal üzerinde aşağıdaki komutu çalıştırın.

sudo lsof -i -P -n | grep LISTEN

Burada muhtemelen 53 nolu portu systemd-resolved.service dosyasının kullandığını göreceksiniz. Bundan dolayı sırası ile aşağıdaki komutları çalıştırıyoruz.

systemctl disable systemd-resolved.service # enter tuşuna basınız.

systemctl stop systemd-resolved # enter tuşuna basınız.

Yukarıdaki komutları çalıştırdıktan sonra internet erişiminde problem olmaması için aşağıdaki komutu çalıştırıyoruz.

echo "nameserver 8.8.8.8" > /etc/resolv.conf

Yukarıdaki komut ile google dns nameserver bilgisini /etc/resolv.conf dosyasına eklemiş bulunuyoruz. Böylelikle nameserver problemini aşıyoruz. Kaynak

Bu işlemin artından yeniden docker compose komutunu çalıştırabilirsiniz.

docker compose -f docker-compose-pgsql.yml up -d

Bu aşamada herhangi bir hata almadıysanız şimdi tarayacı url kısmına http://sunucu_id_adresi:7989 bilgisi formatında ilgili url bilgisini yazarak aşağıdaki görselde ki PowerDNS Admin panel ekranına ulaşmaya çalışıyoruz.

Yukarıdaki ekranı gördükten sonra “Create an account” linkine tıklayıp bir hesap oluşturuyoruz. Oluşturulan ilk hesap administrator yetkisine sahip olmaktadır.

Yukarıdaki ekran üzerinde gerekli bilgileri doldurduktan sonra yeniden login ekranına geçiş yapıyoruz. Login ekranı üzerinde username ve password bilgisini giriyoruz. OTP Token bilgisini şimdilik boş bırakabilirsiniz.

powerdns admin dashboard screenshot
PowerDNS Admin Panel Dashboard Görüntüsü

Başarılı şekilde login olduysanız yukarıdaki gibi bir ekran göreceksiniz. Yukarıdaki görselde orta alanda bir adet domain bilgisi olduğu için ilgili tablo dolu görünmektedir fakat sizin ilk karşılama ekranınızda bu alan boş olarak gelecektir.

PowerDNS Admin Yeni Domain (Zone) Tanımlama

Login işleminden hemen sonra sıra geldi domain hizmeti sağlayabilmek için gerekli olan tanımlamaları yapmaya. Bunun için öncelikle sol menü altında bulunan “Create Zone” linkine tıklıyoruz. Açılan sayfa üzerinde aşağıdaki gibi tanımlamaları yaptıktan sonra ekranın en altında bulunan “Create Zone” butonuna tıklıyoruz.

Bu işlemin ardından ilgili domain bilgisi dashboard ekranında listelenecek olup bu ekran üzerinde eklemiş olduğumuz domain bilgisinin üzerine geldiğimizde önce ilgili satırın sonunda çıkan menü düğmesine ardından “Edit Records” linkine tıklıyoruz. Karşımıza dns bilgilerinin girilmesi veya var olan bilgileri düzenleyebilmek için gerekli olan bir ekran gelecektir. Bu ekran üzerinde “Add Record” butonuna tıklayıp yeni record bilgilerini aşağıdaki gibi tanımlıyoruz. Aşağıdaki görsellerde 4 kayıt bulunmakta olup toplamda 4 defa “Add Record” düğmesini kullanmanız gerekecektir. Her satır üzerinde işlem yaptıktan sonra ilgili satırda görünen “Save” butonunu kullanmalıyız. Son olarak tüm bilgileri düzenledikten sonra ekranın sağ üst köşesindeki “Save Changes” butonuna tıklamalıyız.

@ Soa kayıt ekranı
Örnek DNS Records Bilgileri

NOT! Yukarıda paylaşılan ekran görüntüsünde 192.168.19.19 ip adresi yerine sunucunuzun ip adresini giriniz.

NOT! NS kayıtlarında ip adresinin sonunda “.” nokta işareti olması gerekmektedir.

NOT! Domain tanımlama işleminde en basit haliyle ns bilgilerini girmeden sadece @ işareti ile tanımlı “A” ve “SOA” tiplerine ait kayıtları girmiş olmanız bile domain’in sunucu üzerinde aktif olması için yeterlidir.

NOT! Bu işlem ile yeni almış olduğunuz domain için tüm işlemler henüz bitmedi. Buraya kadar sadece ilgili domain’in bu sunucu üzerindeki dns hizmeti tarafından kullanılabilir olduğunu belirlemiş olduk. Domain bilgisinin aktif olabilmesi için öncelikle domain hizmetini aldığınız yerden ns bilgilerini sunucunuzun ip adresi olacak şekilde düzenlemeniz gerekmektedir. Akabinde domain bilgisi üzerinden sizin sunucunuza bir yönlendirme işlemi gerçekleşecektir. Geriye kalan süreçte artık PowerDNS Admin üzerinden alan adınızı yöneterek istediğiniz kadar sub domain ekleyebiliyor olacaksınız. Sadece sub domain değil harici olarak kuracağınız mail server sonrası mx kayıtlarını da yine bu ekran üzerinden güncelleyebilirsiniz.

Yukarıdaki işlem adımlarını tamamladıktan sonra sunucumuzun üzerindeki terminal uygulamasında aşağıdaki komutu çalıştırıyoruz.

# siz burada kendi domain adresinizi yazacaksınız.
# aşağıdaki komut ile kurulumu yapmış olduğumuz sunucu üzerinde domain
# bilgisini check ediyoruz.
dig @127.0.0.1 demoapp.com

Tüm işlemler doğru ise yukarıdaki komuta ait örnek çıktı bilgisi aşağıdaki gibi olacaktır.

<<>> DiG 9.18.12-0ubuntu0.22.04.3-Ubuntu <<>> @127.0.0.1 demoapp.com; (1 server found)
;; global options: +cmd;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17276;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;demoapp.com. IN A

;; ANSWER SECTION:
demoapp.com. 60 IN A 192.168.19.19

;; Query time: 3 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Thu Jan 25 17:01:02 UTC 2024
;; MSG SIZE rcvd: 61

SOA bilgisini kontrol etmek için aşağıdaki komutu çalıştırabiliriz.

dig demoapp.com soa
; <<>> DiG 9.18.12-0ubuntu0.22.04.3-Ubuntu <<>> demoapp.com soa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52518
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;demoapp.com. IN SOA

;; ANSWER SECTION:
demoapp.com. 1800 IN SOA ns1.demoapp.com. ns2.demoapp.com. 2331562544 10000 2400 604800 1800

;; Query time: 87 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Thu Jan 25 17:02:52 UTC 2024
;; MSG SIZE rcvd: 89

Sonuç olarak; bu adıma kadar geldiyseniz tebrikler artık sizinde kendinize ait bir dns server hizmetiniz ve bu hizmeti yönetecek bir admin paneliniz oldu demektir. Bundan sonraki adımda ise tanımladığımız domain’i sunucumuz üzerinde ki herhangi bir uygulamaya yönlendirmek için Nginx Proxy Manager uygulamasının kurulumu olacaktır. Böylelikle sunucuya gelen istekleri Nginx Proxy Manager yardımı ile içeride istediğimiz bir uygulama veya port ile eşleştirecek ve gerekli reverse proxy işleminin otomatik gerçekleşmesini sağlayacağız.

İçeriği her ne kadar kısa tutmaya çalışmak istesem de uygulamanın kurulumu esnasında bir hata almamanız ve sorun yaşamamanız adına olabildiğince adım adım aktarma yapmaya çalıştım. Bundan dolayı içerik tahmin ettiğimden uzun oldu. Fakat umut ediyorum ki sizler için okuması keyifli ve çıktı itibariyle de faydalı bir içerik olmuştur. Bir sonraki yazıda görüşmek üzere…

İyi okumalar dilerim.

--

--