Kurulum tek satırla bitiyor, asıl iş oradan sonra başlıyor. Bu yazıda sunucuyu ayağa kaldırdıktan sonra şifreli protokolleri nasıl açacağımızı, sertifikayı nasıl bağlayacağımızı ve önceki bir web sunucusuyla port çakışırken ne yapacağımızı anlatıyorum.
Sunucu .NET 10 üzerine kurulu, GNU GPLv3 lisanslı, C# ile yazılmış bir uygulama. Resmi paket sayfasındaki sürüm 15.6.2 iken benim kurduğumda 15.4 idi. Windows kurulum sihirbazı .zip olarak 5,62 MB, Linux ve macOS için olan taşınabilir paket ise .tar.gz olarak 5,82 MB. İkisi de install.sh içinden indiriliyor, senin makinene göre doğru olanı seçiyor. Raspberry Pi tarafında sadece arm7 işlemciler destekleniyor, yani Pi 1 ve Pi Zero'nun arm6 işlemcisi listede yok.
curl -sSL https://download.technitium.com/dns/install.sh | sudo bashBu komutu ikinci kez çalıştırdığında güncelleme yapıyor. Ayrı bir yükseltme komutu yok, tek satır hem kurar hem günceller. Kurulum bitince servis adı dns.service oluyor, çalıştığı kullanıcı dns-server adında bir sistem kullanıcısı ve programın tuttuğu her şey /opt/technitium/dns altında duruyor. Ayarlar ve zone dosyaları da aynı klasörün içindeki config dizininde. Klasörü başka yere taşıyacaksan sadece /opt/technitium/dns altını taşı, ayrıca bir /etc/dns kopyası yapmanın gerek yok.
systemctl status dns
journalctl --unit dns --followPort 53 doluysa
Ubuntu Desktop'ta kurulum çoğu zaman şu hatayla duruyor:
[0.0.0.0:53] System.Net.Sockets.SocketException (98): Address already in use
at DnsServerCore.DnsServer.Start()Hangi sürecin tuttuğunu netstat ile bakmak gerekiyor, çünkü iki farklı şey olabiliyor. Masaüstü dağıtımlarında NetworkManager'ın içine gömülü bir dnsmasq çalışıyor ve servisi NetworkManager'a ait. Bu durumda dnsmasq'yı ayrı kapatmak yerine yapılandırma dosyasında ilgili satırı yorum satırı yapmak gerekiyor:
sudo nano /etc/NetworkManager/NetworkManager.conf
#dns=dnsmasqSonra bir yeniden başlatma, dnsmasq gitmiş oluyor. systemd-resolved duruyorsa bu sefer servis dosyasına dokunuyorsun:
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
sudo rm /etc/resolv.conf
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.confBurada bir ayrıntı var, kurulum betiği bu işi yaparken sembolik bağı takip etmeyen bir kopyalama kullanıyor. Yedeklenen dosya aslında systemd-resolved'in çalışma anında oluşturduğu geçici bir bağ. O bağ kapanınca hedefi de kayboluyor ve geri almaya kalktığında karşına No such file or directory çıkıyor. Geri almak şu şekilde:
sudo systemctl enable --now systemd-resolved
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
resolvectl statusYeniden yükleme sırasında servis adının dns olduğunu unutma, technitium yazan her şey yanlış. Ayrıca el ile güncelleme yaparsan dosyaların sahibi root'a kalıyor ve servis açılıyor ama config klasörüne yazamıyor. Kullanıcı dns-server olmalı.
Sertifika olmadan şifreli sorgu açılmıyor
DoH, DoT ve DoQ servislerinin hepsi TLS üzerinde çalışıyor, yani geçerli bir sertifika olmadan hiçbiri ayağa kalkmıyor. Bu yüzden önce alan adı ve sertifika işi var. Let's Encrypt kuruyorsun:
sudo apt update
sudo apt install certbotSertifika isterken doğrulama yapılacak yeri söylemen gerekiyor. Webroot yöntemi en temizi, çünkü DoH servisini 80 portunda açıp doğrulama dosyasını oradan servis edebiliyorsun:
sudo certbot certonly --agree-tos --email admin@example.com --webroot -w /opt/technitium/dns/dohwww -d dns.example.comSertifika geldi ama uygulama PEM dosyasını kabul etmiyor, PKCS #12 yani .pfx istiyor. Dönüşümü elle yaparsan her yenilemede tekrar yapman gerekir, o yüzden bir kanca dosyasına yazmak daha doğru:
sudo mkdir -p /etc/letsencrypt/renewal-hooks/post/
sudo nano /etc/letsencrypt/renewal-hooks/post/pkcs12convert.sh#!/bin/sh
openssl pkcs12 -export -out /etc/dns/dns.example.com.pfx \
-inkey /etc/letsencrypt/live/dns.example.com/privkey.pem \
-in /etc/letsencrypt/live/dns.example.com/cert.pem \
-certfile /etc/letsencrypt/live/dns.example.com/chain.pem \
-passout pass:PAROLA
cp /etc/dns/dns.example.com.pfx /opt/technitium/dns/dns.example.com.pfx
chown dns-server:dns-server /opt/technitium/dns/dns.example.com.pfxDosya sahibinin dns-server olması şart, aksi halde servis yenilenen sertifikayı göremiyor. Betiği çalıştırılabilir yapıp bir kez elle de tetiklemek gerekiyor, çünkü sertifika henüz hiç yenilenmemiş:
sudo chmod +x /etc/letsencrypt/renewal-hooks/post/pkcs12convert.sh
sudo /etc/letsencrypt/renewal-hooks/post/pkcs12convert.shArtık ayarlarda sertifika yolunu .pfx dosyasına, parola kutusuna da üstte yazdığınız metni girip üç protokolü de açabiliyorsunuz. Kaydedince servisler başlıyor ve konsoldan loglara bakarak bir şeyin ters gidişini görebiliyorsun. Yenileme akışını sınamak için şu komut yeterli:
sudo certbot renew --dry-runBir de web sunucusu varsa
DoH varsayılan olarak 443 alıyor ve bu portu bir başka servis kullanıyorsa ikisi birden açılamıyor. Çözüm DoH'yi içeri tarafa çekmek, yani yalnızca yerel arayüzde açık olacak şekilde 8053 portuna taşımak. Buradaki bir kısıt var, program proxy'den gelen istekleri tanımıyor ve proxy'nin adresini kendi listesine eklemen gerekiyor, yoksa sorgular sessizce düşüyor:
# DoH protokolu portunu 8053 olarak ayarla
# Reverse Proxy Network ACL listesine 127.0.0.1 ekleProxy sonrasında istemcilere ne gösterileceği değişiyor. DoT ve DoQ için sertifikada kullanılan alan adıyla 853 portu, DoH için ise alan adı üstünde bir yol olması gerekiyor:
alan-adi:853
https://alan-adi/dns-queryFirefox kendi ayarında DoH adresini elle girebiliyor, sadece tarayıcı kullanıyor, diğer uygulamalar aynı zaman da sistem çözümleyicisini kullanmaya devam ediyor. Android'in Özel DNS ayarı da DoT kullanıyor, DoH kurduğun için o ayar çalışmıyor.
İç ağda reklam engelleme için blok listesi adresleri eklenebiliyor ve günlük otomatik yenileniyorlar. Panoda NX Domain sayısının çok yüksek olması kötü bir şey değil, tam tersi genelde bir kötü yazılımın alan adı üretme davranışına işaret ediyor. Aynı panelde ön bellek oranını da görebiliyorsun, çoğu sorgu buradan karşılandığı için yükselmesi normal.
