Dnsmasq, DNS over HTTPS (DoH) ve Reklam Engelleyici DNS Resolver Kurulumu (Debian ve Ubuntu)

Sizlere Dnsmasq ve CloudFlare kullanarak iş ve ev ağlarınız için kendinize özel güvenli DNS çözümleyici kurulumunu göstereceğim. Bunlara ek olarak, reklam, takip yazılımı barındıran ve malware domainleri de engelleyerek reklamsız ve güvenlik internet kullanmaya hemen başlayabilirsiniz.



DNS over HTTPS (DoH) Nedir?

DNS over HTTPS (DoH) ile ilgili daha önce bilgi vermiştim. Bunun için DNS over HTTPS (DoH) ve Firefox Quantum Kullanımı makalemi okuyarak bilgi edinebilirsiniz.



Linux İçin DNS over HTTPS (DoH) Kurulumu

Öncelikle bu rehberimiz Debian ve Ubuntu tabanları işletim sistemleri içindir.

Kullandığımız işletim sistemi derlemesine ve işlemci mimarisine göre gerekli sürümü indirmemiz gerekiyor

  • amd64 / x86-64 (64 bit) : https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-amd64.deb
  • x86 (32 bit) : https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-386.deb
  • ARMv6 : https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-arm.deb

wget komutu ile gerekli kurulum dosyasını indirelim.

wget https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-amd64.deb

Aşağıdaki komut ile kurulumu yapalım.

dpkg -i cloudflared-stable-linux-amd64.deb

Kurulum tamamlandıktan sonra servis ayarlamamız gerekiyor.

/lib/systemd/system/cloudflared.service dosyasını oluşturup aşağıdaki içeriği yapıştralım.

nano /lib/systemd/system/cloudflared.service

cloudflared.service içeriği:

[Unit]
Description=cloudflared DNS over HTTPS proxy
After=syslog.target network-online.target

[Service]
Type=simple
User=root
EnvironmentFile=/etc/default/cloudflared
ExecStart=/usr/local/bin/cloudflared proxy-dns $CLOUDFLARED_OPTS
Restart=on-failure
RestartSec=10
KillMode=process
[Install]
WantedBy=multi-user.target

Servis olarak tanıtmak için aşağıdaki komut dizesini girelim.

systemctl enable cloudflared
systemctl start cloudflared
systemctl status cloudflared

En son komut ile servisin çalıştığını gösteren çıktı ile karşılaşmanız gerekiyor.

root@web:~# sudo systemctl status cloudflared
● cloudflared.service - cloudflared DNS over HTTPS proxy
   Loaded: loaded (/lib/systemd/system/cloudflared.service; enabled)
   Active: active (running) since Fri 2018-11-16 13:17:21 +03; 548ms ago
 Main PID: 7227 (cloudflared)
   CGroup: /system.slice/cloudflared.service
           └─7227 /usr/local/bin/cloudflared proxy-dns --port 5053 --upstream https://mozilla.cloudflare-dns.com/dns-query

Nov 16 13:17:21 web systemd[1]: Starting cloudflared DNS over HTTPS proxy...
Nov 16 13:17:21 web systemd[1]: Started cloudflared DNS over HTTPS proxy.
Nov 16 13:17:21 web cloudflared[7227]: time="2018-11-16T13:17:21+03:00" level=info msg="Adding DNS upstream" url="https://mozilla.cloudflare-dns.c...ns-query"
Nov 16 13:17:21 web cloudflared[7227]: time="2018-11-16T13:17:21+03:00" level=info msg="Starting DNS over HTTPS proxy server" addr="dns://localhost:5053"
Nov 16 13:17:21 web cloudflared[7227]: time="2018-11-16T13:17:21+03:00" level=info msg="Starting metrics server" addr="127.0.0.1:24419"
Hint: Some lines were ellipsized, use -l to show in full.

Eğer CloudFlare yerine başka DoH sunucu kullanmak isterseniz /etc/default/cloudflared dosyasını düzenlemeniz yeterli olacaktır.

root@web:~# cat /etc/default/cloudflared
# Commandline args for cloudflared
CLOUDFLARED_OPTS=--port 5053 --upstream https://mozilla.cloudflare-dns.com/dns-query
root@web:~#

–upstream kısmında yer alan sunucuyu istediğiniz başka bir DoH sağlayıcı ile değiştirebilirsiniz.

Aşağıda kullanabileceğiniz diğer DoH sağlayıcılar listelenmiştir:

  • https://dns.google.com/experimental
  • https://doh.cleanbrowsing.org/doh/family-filter/
  • https://dns.dnsoverhttps.net/dns-query
  • https://doh.crypto.sx/dns-query
  • https://doh.securedns.eu/dns-query

Cloudflared servisimiz çalıştığına göre dns çözümleme testi gerçekleştirelim. Servis 5053 portunda çalışmaktadır.

root@web:~# dig @localhost -p 5053 www.google.com

; <<>> DiG 9.9.5-9+deb8u16-Debian <<>> @localhost -p 5053 www.google.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20754
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1452
;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         164     IN      A       172.217.17.36

;; Query time: 497 msec
;; SERVER: 127.0.0.1#5053(127.0.0.1)
;; WHEN: Fri Nov 16 13:23:06 +03 2018
;; MSG SIZE  rcvd: 73

root@web:~#

SERVER: 127.0.0.1#5053(127.0.0.1) kısmında gördüğünüz üzere Cloudflared sorunsuzca çalışmakta ve yanıt vermekte.



Dnsmasq Kurulumu ve DoH Çözümleyicisi

Dnsmasq çok az sistem kaynağı kullanan, önbellekleme yeteneği çok gelişmiş bir DNS, DHCP ve TFTP sunucusudur. DNS sunucusu görevi gördüğü gibi, DNS çözümleyicisi görevi de görmektedir. Bizim için önemli olan şuanda çözümleyici rolüdür :)

Dnsmasq Çalışma Yapısı

Dnsmasq bir sorgu aldığında yukarıdaki döngü gerçekleşmektedir. Öncelikle kendi önbelleğinde ya da DNS sunucu ayarların varsa eğer sonucu iletmektedir. Eğer sonuc yoksa, /etc/hosts dosyasını kontrol eder. Eğer burada varsa sonucu iletir. Eğer sonuç burada da yoksa başka bir DNS çözümleyiciye başvurarak sonucu iletmektedir. İşte biz bu noktada başka çözümleyici olarak DoH kullanıp, yaptığımız sorguları Dnsmasq üzerinde önbellekleyeceğiz.

Aşağıdaki komut ile Dnsmasq kurulumunu yapalım.

apt-get install dnsmasq

Kurulum tamamlandıktan sonra ifconfig ile interface ayarlarımıza bakalım. İnternete çıkış yaptğımız interface adı ve IP adresini not edelim.

Daha sonra ayar dosyasını düzenleyelim.

nano /etc/dnsmasq.conf

Tüm dosyanın içeriğini silelim. Aşağıdaki içeriği yapıştıralım.

resolv-file=/etc/dnsmasq-resolv.conf
log-facility=/var/log/dnsmasq.log
log-queries
domain-needed
bogus-priv
no-hosts
no-resolv
dns-forward-max=300
cache-size=10000
#no-negcache
neg-ttl=7200
max-cache-ttl=3600
no-poll
#conf-file=/usr/share/dnsmasq-base/trust-anchors.conf
#dnssec
#dnssec-check-unsigned
server=127.0.0.1#5053

interface=INTERNETE.CIKAN.INTERFACE
listen-address=127.0.0.1
listen-address=INTERNETE.CIKIS.IP.ADRESI
bind-interfaces

Daha sonradan /etc/dnsmasq-resolv.conf dosyasını oluşturalım ve içeriğini aşağıkidaki şekilde yapalım.

nano /etc/dnsmasq-resolv.conf

/etc/dmsmasq-resolv.conf içeriği:

nameserver 127.0.0.1#5053

Ayarların uygulanabilmesi için aşağıki komutla Dnsmasq servisini yeniden başlatalım.

service dnsmasq restart

Bu sefer 53 portundaki Dns çözümleyicisini deneyelim.

root@web:~# dig @localhost www.google.com.tr

; <<>> DiG 9.9.5-9+deb8u16-Debian <<>> @localhost www.google.com.tr
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43087
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1452
;; QUESTION SECTION:
;www.google.com.tr.             IN      A

;; ANSWER SECTION:
www.google.com.tr.      193     IN      A       216.58.212.163

;; Query time: 130 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Nov 16 13:50:58 +03 2018
;; MSG SIZE  rcvd: 79

root@web:~#

İlk sorgumuz gördüğünüz üzere 130 milisaniye sürdü. Yukarıda bahsettiğim döngü burada işlemiş bulunuyor. Sorgu geldiğinde Dnsmasq üzerinde kayıtlı bir sorguysa size direkt olarak yanıt veriyor. Eğer yoksa başka resolver sunucusuna isteği yönlendiriyor. Tam olarak bu döngü burada işledi. Ve sorgu geri dönüşü 130 milisaniye sürdü. Aynı sorguyu tekrar çalıştıralım.

root@web:~# dig @localhost www.google.com.tr

; <<>> DiG 9.9.5-9+deb8u16-Debian <<>> @localhost www.google.com.tr
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47432
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.com.tr.             IN      A

;; ANSWER SECTION:
www.google.com.tr.      64      IN      A       216.58.212.163

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Nov 16 13:53:07 +03 2018
;; MSG SIZE  rcvd: 62

root@web:~#

Bu sefer 0 milisaniyede cevap aldık. Dnsmasq sorguyu kendi üzerinde tutarak anında bize yanıt vermiş bulunuyor.



Dnsmasq İle Reklamların Engellenmesi

Dnsmasq ile aynı Pi-hole gibi, Adblock gibi reklam engellemeleri yapabilirsiniz. Adblock ve türevi tarayıcı eklentilerine nazaran sadece kurulu olduğu tarayıcı için değil, tüm ağınızdaki cihazlar için kullanabilirsiniz.

https://github.com/notracking/hosts-blocklists adresi günlük olarak reklam barındıran siteleri, adresleri ve zararlı sitelerin listesini güncelliyor. Tek yapmamız gereken bu listeyi Dnsmasq içerisine tanıtmak. Öncelikle /etc/dnsmasq/ klasörünü oluşturup bu listeleri indirelim.

mkdir /etc/dnsmasq/
cd /etc/dnsmasq/
wget https://raw.githubusercontent.com/notracking/hosts-blocklists/master/hostnames.txt -O /etc/dnsmasq/hostnames.txt
wget https://raw.githubusercontent.com/notracking/hosts-blocklists/master/domains.txt -O /etc/dnsmasq/domains.txt

Daha sonra /etc/dnsmasq.conf dosyasını düzenleyip aşağıdaki satırları ekleyelim.

conf-file=/etc/dnsmasq/domains.txt
addn-hosts=/etc/dnsmasq/hostnames.txt

Ayar dosyasının sön görüntüsü aşağıdaki gibi olacak.

resolv-file=/etc/dnsmasq-resolv.conf
log-facility=/var/log/dnsmasq.log
log-queries
domain-needed
bogus-priv
no-hosts
no-resolv
dns-forward-max=300
cache-size=10000
#no-negcache
neg-ttl=7200
max-cache-ttl=3600
no-poll
#conf-file=/usr/share/dnsmasq-base/trust-anchors.conf
#dnssec
#dnssec-check-unsigned
server=127.0.0.1#5053

interface=INTERNETE.CIKAN.INTERFACE
listen-address=127.0.0.1
listen-address=INTERNETE.CIKIS.IP.ADRESI
bind-interfaces

conf-file=/etc/dnsmasq/domains.txt
addn-hosts=/etc/dnsmasq/hostnames.txt

Dosyayı kayıt edip Dnsmasq yeniden başlattıktan sonra reklam engelleyicili Dns sunucumuz kullanıma hazır.



DNS Sunucu Ayarlarını Değiştirme

Dns çözücümüz çalışmaya başladığına göre, ister Windows bağlantı ayarlarından, isterseniz de Modem/Router arayüzünden sunucunuzun public IP adresini DNS sunucunuz olarak göstererek kendi kişisel DNS sunucunuzu kullanmaya başlayabilirsiniz. Size önerim Modem/Router üzerinden DNS ayarını değiştirmeniz yönünde olacaktır. Bu şekilde ağınızda bulunan tüm cihazlar reklamsız ve güvenli dns sunucularınızı kullanmaya başlayacaktır.



Opsiyonel – Reklam Listesinin Otomatik Güncellenmesi

https://github.com/notracking/hosts-blocklists adresindeki reklam listesi her gün (hatta kimi zaman 7-8 saatte bir) güncellenmektedir. Bu güncellemeleri basit bir zamanlanmış görev yazarak günlük olarka kendi sunucunuza uygulayabilirsiniz.

Önceikle root dizini altında blok-guncelle.sh isimli bir dosya oluşturalım.

nano /root/block-guncelle.sh

İçeriğe aşağıdakileri yapıştralım

rm /etc/dnsmasq/*
wget https://raw.githubusercontent.com/notracking/hosts-blocklists/master/hostnames.txt -O /etc/dnsmasq/hostnames.txt
wget https://raw.githubusercontent.com/notracking/hosts-blocklists/master/domains.txt -O /etc/dnsmasq/domains.txt
service dnsmasq restart

Bu komutlar mevcuttaki hostnames.txt ve domains.txt dosyalarını silip, yenilerini indirip, dnsmasq hizmetini yeniden başlatıyor.

Çalışması için gerekli izini verelim.

chmod +x /root/block-guncelle.sh

Crontab ile zamanlanmış görev ekleyelim.

crontab -e

En alt satıra aşağıdaki ekleyelim ve kayıt edip çıkalım.

0 0 * * * sh /root/blok-guncelle.sh >/dev/null 2>&1

Bu zamanlanmış görev her gün 00:00 da oluşturduğumuz bash dosyasını çalıştırıp, reklam fitrelerini güncelleyip, dns hizmetini yeniden başlatacaktır. Bu sayede en güncel reklam engelleme listesini sahip olacaksınız.



Dnsmasq Sorgu Loglarını Gözlemleme

Aşağıdaki komut ile anlık olarak dns sorgularını görebilirsiniz

tail -f /var/log/dnsmasq.log

Aşağıdaki gibi çıktı göreceksiniz.

Nov 16 14:27:45 dnsmasq[7808]: query[PTR] 252.40.185.185.in-addr.arpa from 212.156.106.42
Nov 16 14:27:45 dnsmasq[7808]: forwarded 252.40.185.185.in-addr.arpa to 127.0.0.1
Nov 16 14:27:45 dnsmasq[7808]: reply 185.185.40.252 is web.netkolik.org
Nov 16 14:27:45 dnsmasq[7808]: query[A] www.google.com.tr.htsolar.local from 212.156.106.42
Nov 16 14:27:45 dnsmasq[7808]: forwarded www.google.com.tr.htsolar.local to 127.0.0.1
Nov 16 14:27:45 dnsmasq[7808]: reply www.google.com.tr.htsolar.local is NXDOMAIN
Nov 16 14:27:45 dnsmasq[7808]: query[AAAA] www.google.com.tr.htsolar.local from 212.156.106.42
Nov 16 14:27:45 dnsmasq[7808]: forwarded www.google.com.tr.htsolar.local to 127.0.0.1
Nov 16 14:27:45 dnsmasq[7808]: reply www.google.com.tr.htsolar.local is NXDOMAIN
Nov 16 14:27:45 dnsmasq[7808]: query[A] www.google.com.tr from 212.156.106.42
Nov 16 14:27:45 dnsmasq[7808]: forwarded www.google.com.tr to 127.0.0.1
Nov 16 14:27:45 dnsmasq[7808]: reply www.google.com.tr is 172.217.17.35
Nov 16 14:27:45 dnsmasq[7808]: query[AAAA] www.google.com.tr from 212.156.106.42
Nov 16 14:27:45 dnsmasq[7808]: forwarded www.google.com.tr to 127.0.0.1
Nov 16 14:27:45 dnsmasq[7808]: reply www.google.com.tr is 2a00:1450:400e:804::2003
Nov 16 14:27:57 dnsmasq[7808]: query[PTR] 252.40.185.185.in-addr.arpa from 212.156.106.42
Nov 16 14:27:57 dnsmasq[7808]: cached 185.185.40.252 is web.netkolik.org
Nov 16 14:27:57 dnsmasq[7808]: query[A] www.google.com.tr.htsolar.local from 212.156.106.42
Nov 16 14:27:57 dnsmasq[7808]: cached www.google.com.tr.htsolar.local is NXDOMAIN
Nov 16 14:27:57 dnsmasq[7808]: query[AAAA] www.google.com.tr.htsolar.local from 212.156.106.42
Nov 16 14:27:57 dnsmasq[7808]: cached www.google.com.tr.htsolar.local is NXDOMAIN
Nov 16 14:27:57 dnsmasq[7808]: query[A] www.google.com.tr from 212.156.106.42
Nov 16 14:27:57 dnsmasq[7808]: cached www.google.com.tr is 172.217.17.35
Nov 16 14:27:57 dnsmasq[7808]: query[AAAA] www.google.com.tr from 212.156.106.42
Nov 16 14:27:57 dnsmasq[7808]: cached www.google.com.tr is 2a00:1450:400e:804::2003

Hangi IP adresinden hangi domain için sorgu yapıldığını görebilirsiniz. Dnsmasq üzerinde olmayan kayıtlar görüldüğü gibi forwarded ile bir üst sunucuya iletiliyor. Aynı sorgular tekrarlandığında ise cached yapılan sorgular anında istemciye iletiliyor.

Kendinize özel reklamsız, güvenli DNS sunucunuzu güle güle kullanın :) Her türlü soru ve sorununuzu yorumlarda iletmeyi ihmal etmeyin. İyi günler dilerim.

Yorum yapın