Tarayıcınız bir web sitesi ile HTTP veya HTTPS bağlantısı kurmadan önce, bağlantının yapılacağı IP adresini bulmak için bir DNS sorgusu yapar (IP adresi yerine bir ana bilgisayar adı kullanarak yaptığınız bağlantılarda da aynı şey geçerlidir). DNS sorguları ön tanımlı olarak şifrelenmez, düz metin olarak gönderilir. Bunun anlamı, HTTPS kullanan bir web sitesine bağlandığınızda, konuşmanız şifreli olsa bile bağlantı üzerinde bulunan herhangi bir platformun (modem, router, ISS vb.), hangi web sitesini aradığınızı görebilmesidir. Aşağıda, bloğuma girmek için istek gönderen bir internet tarayıcısından yapılan DNS sorgusunu görebilirsiniz.

Wireshark uygulaması ile yakalanan, şifrelenmemiş DNS sorgusu içeriği.

DNS sorgusu incelendiğinde, girilmek istenen sitenin web adresi düz metin olarak kolayca görülebilir. Bu durum bizi DNS Spoofing, trafik takibi ve kayıt altına alma, reklam amaçlı kullanım gibi isteğimiz dışında gerçekleşebilecek problemlere sürükleyebilir. Ücretsiz Wi-Fi bağlantı noktası sunan bir kişi veya işletmenin, reklam verenlere satmak için DNS sorgularınızı kaydettiğini düşünün.

DNS over TLS (DoT), bunun önlemini almak için geliştirilmiş yöntemlerden biridir. Bu yöntemi kullanarak DNS trafiğimizi şifreleyebiliyoruz. Bazı tarayıcılarla birlikte gömülü halde zaten geliyor (aktifleştirmeniz gerekebilir). Ancak sadece tarayıcıların değil, sistem genelinde DNS sorgusu gönderen tüm uygulamaların sorgularını şifrelemek istiyorsanız, aşağıda anlatacağım uygulamalar ile sistem genelinde kullanılır hale getirebilirsiniz.

Not: Aşağıda anlatılan yöntemler, Debian ve Ubuntu tabanlı Linux dağıtımları için geçerlidir.
Ağ işlemleri yürütürken, ağ istatistiklerine sıkça ihtiyaç duyacaksınız. Bu ihtiyacı karşılamak için sisteminizde bazı araçların kurulu olması gerekiyor. Aşağıdaki işlemleri yürütürken de, ağ istatistiklerini analiz etmeye yarayan netstat adında bir komut satırı yardımcı programını kullandım. Bunu kurmak ve kullanmak zorunda değilsiniz, bu kısımları atlasanız da olur. Kurmak isteyenler ise netstat aracını içinde barındıran net-tools paketini aşağıdaki komutla kurabilirler.
sudo apt-get install net-tools

DNS over TLS (DoT)

DNS sorgularının, HTTP trafiğini şifreleyen TLS (Transport Layer Security) teknolojisi ile şifrelenmiş olarak gönderildiği bir yöntemdir. Böylece üçüncü tarafların DNS sorgularınızı görmesini, takibini ve yönlendirmesini önleyerek kullanıcı gizliliğini ve güvenliğini artırır.

Bu yöntemi Ubuntu dağıtımlarının güncel sürümlerinde, sistemde ön tanımlı olarak gelen systemd-resolved servisinin konfigüre edilmesiyle kullanılabileceğiniz söyleniyor. Ancak yaptığım deneme ve araştırmalarda, ne kadar uğraşsam da ne yazık ki kararlı çalışmadığını, sorguların bazen şifrelenmediğini gördüm. Bu nedenle systemd-resolved konfigürasyonunu burada anlatmıyorum.

İkinci seçenek olarak, Stubby uygulamasını kurarak bu yöntemi Linux işletim sistemi genelinde kullanabilirsiniz.

Stubby

Stubby açık kaynaklı, TLS yöntemini kullanarak DNS sorgularında gizlilik sağlayan bir DNS çözümleyicidir. Uygulamalardan gelen DNS sorgularını dinler ve aldığı istekleri şifreleyerek DNS'e gönderir. Ön tanımlı olarak yalnızca şifreli DNS sorguları gönderir. Ayrıca, kullanılan DNS adreslerini daha ayrıntılı bir şekilde yönetmenizi sağlayan konfigürasyon alt yapısına da sahiptir.

Bir uygulama sorgu yapacağı DNS adresini, Linux'ta DNS adresi elde etme kısmında anlatıldığı şekilde bulur. Bu adreste bir yerel DNS, uzak DNS, geçit cihazı veya bir çözümleyici uygulaması olabilir ve DNS sorguları için ön tanımlı olarak ayrılmış 53 nolu portu dinlerler. Bu portu dinleyen bir DNS, sorguyu doğrudan değerlendirip cevap döndürebileceği gibi, geçit cihazları ya da çözümleyici uygulamaları ise programlandıkları üzere sorguyu başka bir adrese yönlendirebilir. Ubuntu sistemlerde bulunan ön tanımlı çözümleyici de (systemd-resolved) işte bu adresi dinler ve gelen sorguları, kendi konfigürasyon dosyalarında tanımlanmış diğer DNS adreslerine (ya da başka bir çözümleyiciye) yönlendirir. Ancak şifrelemez, olduğu gibi açık olarak gönderir. Stubby çözümleyicisi ise systemd-resolved çözümleyicisi ile uzak DNS arasına konumlandırılır. systemd-resolved çözümleyicisinin, sorguları uzak DNS yerine Stubby'e göndermesi sağlanır. Stubby gelen açık sorguları şifreler ve kendi konfigürasyonundaki güvenli DNS adreslerine 853 nolu port üzerinden gönderir. Aşağıdaki şemada bu yapıyı anlatmaya çalıştım.

Stubby Kurulumu

Stubby, Debian ve Ubuntu depolarında zaten bulunuyor. Uygulamayı kurmak için aşağıdaki komutu kullanabilirsiniz.
sudo apt install stubby
Veya kaynak koduna Github üzerinden ulaşabilirsiniz.
Dikkat! Stubby'yi nereden indirdiğinize dikkat edin. Açık kaynak kodlu bir uygulama olduğu için, zararınıza çalışacak şekilde düzenlenmiş kopyalarından sakınmalısınız. Yukarıda verdiğim linklerden veya yine yukarıda gösterildiği gibi, apt ile işletim sisteminizin kendi paket deposundan kurmanız daha güvenli olacaktır.
Stubby kurulduktan sonra arka planda otomatik olarak çalışmaya başlar. Alttaki komut yardımıyla çalışma durumunu kontrol edebiliyoruz.
systemctl status stubby
$ systemctl status stubby
● stubby.service - DNS Privacy Stub Resolver
   Loaded: loaded (/lib/systemd/system/stubby.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-12-09 09:51:45 +03; 21s ago
     Docs: https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Daemon+-+Stubby
 Main PID: 15870 (stubby)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/stubby.service
           └─15870 /usr/bin/stubby

Ara 09 09:51:45 debian-f systemd[1]: Started DNS Privacy Stub Resolver.
Ara 09 09:51:46 debian-f stubby[15870]: [02:51:46.000821] STUBBY: Read config from file /etc/stubby/stubby.yml
Ara 09 09:51:46 debian-f stubby[15870]: [02:51:46.003755] STUBBY: DNSSEC Validation is OFF
Ara 09 09:51:46 debian-f stubby[15870]: [02:51:46.004223] STUBBY: Transport list is:
Ara 09 09:51:46 debian-f stubby[15870]: [02:51:46.004228] STUBBY:   - TLS
Ara 09 09:51:46 debian-f stubby[15870]: [02:51:46.004232] STUBBY: Privacy Usage Profile is Strict (Authentication required)
Ara 09 09:51:46 debian-f stubby[15870]: [02:51:46.004235] STUBBY: (NOTE a Strict Profile only applies when TLS is the ONLY transport!!)
Ara 09 09:51:46 debian-f stubby[15870]: [02:51:46.004238] STUBBY: Starting DAEMON....
$ 
Çıktıda Active: satırında active (running) ifadesinden, Stubby'nin çalıştığını anlayabilirsiniz.

Ağ arayüzü istatistiklerine stubby filtresini uygulayarak baktığımızda, Stubby'nin yerel bilgisayarın (127.0.0.1) 53 nolu TCP ve UDP portunu dinlemeye başladığını görebiliriz.
sudo netstat -lnptu | grep stubby
$ sudo netstat -lnptu | grep stubby
tcp        0      0 127.0.0.1:53          0.0.0.0:*        LISTEN      15870/stubby        
tcp6       0      0 ::1:53                :::*             LISTEN      15870/stubby        
udp        0      0 127.0.0.1:53          0.0.0.0:*                    15870/stubby        
udp6       0      0 ::1:53                :::*                         15870/stubby        
$ 
Ubuntu dağıtımının güncel sürümleri (18.10+), yerleşik çözümleyici olarak systemd-resolved çözümleyicisini kullanır. Yukarıdaki netstat aracına systemd-resolved filtresi uyguladığımızda ise bu ön tanımlı çözümleyicinin 127.0.0.53 IP adresinin 53 nolu TCP ve UDP portunu dinlediğini görebiliriz.
sudo netstat -lnptu | grep systemd-resolve
$ sudo netstat -lnptu | grep systemd-resolve
tcp        0      0 127.0.0.53:53         0.0.0.0:*        LISTEN      527/systemd-resolve        
udp    49920      0 127.0.0.53:53         0.0.0.0:*                    527/systemd-resolve        
$ 
Hatırlatma: Debian dağıtımlarında ise, eğer daha önce systemd-resolve çözümleyici kurulmamışsa bu komuttan sonra herhangi bir sonuç dönmeyecektir. Dolayısıyla biraz sonra düzenleme yapacağımız systemd konfigürasyon dosyası da var olmayacaktır. Bu durumda systemd konfigürasyon dosyası yerine sistemin kendi çözümleyici konfigürasyon dosyasında düzenleme yapmanız gerekecek (yeri geldiğinde belirteceğim).

Yapılandırma

Şimdi mevcut DNS adresimizi öğrenelim. Ubuntu için aşağıdaki komutu kullanabilirsiniz.

systemd-resolve --status
$ systemd-resolve --status
Global
          DNSSEC NTA: 10.in-addr.arpa
                      16.172.in-addr.arpa
                      168.192.in-addr.arpa
                      17.172.in-addr.arpa
                      18.172.in-addr.arpa
                      19.172.in-addr.arpa
                      20.172.in-addr.arpa
                      21.172.in-addr.arpa
                      22.172.in-addr.arpa
                      23.172.in-addr.arpa
                      24.172.in-addr.arpa
                      25.172.in-addr.arpa
                      26.172.in-addr.arpa
                      27.172.in-addr.arpa
                      28.172.in-addr.arpa
                      29.172.in-addr.arpa
                      30.172.in-addr.arpa
                      31.172.in-addr.arpa
                      corp
                      d.f.ip6.arpa
                      home
                      internal
                      intranet
                      lan
                      local
                      private
                      test

Link 5 (docker0)
      Current Scopes: none
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no

Link 4 (virbr0-nic)
      Current Scopes: none
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no

Link 3 (virbr0)
      Current Scopes: none
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no

Link 2 (enp3s0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 192.168.1.1
          DNS Domain: ~.
Debian için de aşağıdaki komutu kullanın.
cat /etc/resolv.conf
$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.1.1

Ubuntu çıktısında listenen bilgilere göre sistemimde Link 2, ... Link 5 olarak gösterilen dört arayüz tanımlı ve ethernet kartımın bağlı olduğu enp3s0 (Link 2 olarak gösterilen) arayüzüne tanımlanmış bir DNS adresi var. Aslında DNS adresini ben tanımlamadım. Ağ ayarlarında DNS otomatik modda olduğu için, arayüzün varsayılan rotasındaki geçidin adresini sistem otomatik olarak eklemiş. Bu durumda DNS, geçit (modem) üzerinden sağlanıyor. Bizim ise DNS adresini, Stubby'nin dinlediği IP adresine yönlendirmemiz gerekiyor. Böylece açık DNS sorguları bu adres üzerinden Stubby'e yapılırken, Stubby tarafından şifrelenerek dış DNS'e gönderilebilir. Bu durumda izleyebileceğimiz iki alternatif yolumuz var.

  1. Arayüze özel yönlendirme: Ağ arayüzlerinin DNS adreslerini tek tek Stubby'e yönlendirebilirsiniz. Bu durumda sadece yönlendirdiğiniz arayüzlerden güvenli DNS sorguları yapabilirsiniz. Diğer arayüzlerle yapılan bağlantılar kendi arayüz ayarlarına göre yönlendirilir.

  2. Sistemin genel DNS adresini Stubby'e yönlendirme: Bu durumda sistemde oluşturulmuş sanal ya da gerçek bütün arayüzler, eğer arayüzde başka bir DNS adresi tanımlanmamışsa ve otomatik DNS modunda değilse genel DNS adresine yönlendirilir.

İki seçeneği de görelim.

1. Arayüze özel yönlendirme

Bu işlemi üç farklı şekilde gerçekleştirebilirsiniz.

  1. Netplan kullanarak
  2. NetworkManager kullanarak
  3. NetworkManager GUI kullanarak

1.1 Netplan kullanarak yönlendirme

Netplan, Ubuntu dağıtımlarında kullanılan, ağ yapılandırmasını kolaylaştıran bir araçtır. Ubuntu 18.04 sürümünden itibaren ön tanımlı olarak gelir. Daha önceki sistemlerde, ağ yapılandırmaları için /etc/resolv.conf, /etc/systemd/resolved.conf ve /etc/network/interfaces dosyalarını düzenlemek gerekiyordu. Ancak yeni servisler ve araçlar eklendikçe oluşan karmaşayı tek elden yönetmek için bu araç sisteme dahil edildi.

Netplan yapılandırma dosyalarında, ağ yönetim araçları "renderer" olarak adlandırılır. NetworkManager veya systemd-networkd ağ yönetim araçlarından (renderer) istediğiniz herhangi biri ile çalışabilir. YAML dilini kullanarak istediğimiz ağ ayarlarını .yaml dosyalarında tanımladıktan sonra, Netplan her çalışma zamanında ve sistemin her açılışında, her arayüz için gerekli dosyaları otomatik olarak yerinde oluşturur. Netplan yapılandırma dosyaları /etc/netplan dizininde saklanır. Sistem başlangıcında veya sudo netplan apply komutunu verdiğinizde, bu dizin içinde bulunan tüm YAML dosyalarındaki komutları uygular ve arayüzlerin ağ yapılandırma dosyalarını oluşturur. Renderer ise bu yapılandırma dosyaları yardımıyla ağ arayüzlerini yapılandırır.

Yukarıda, systemd-resolve --status komutuyla ağ arayüzlerini listeleyebiliyorduk. Bu defa da aynı işi gören farklı bir komutla listeleyelim.

ifconfig -a
$ ifconfig -a
docker0: flags=4099 (UP,BROADCAST,MULTICAST)  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:7b:cb:0f:19  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp3s0: flags=4163 (UP,BROADCAST,RUNNING,MULTICAST)  mtu 1500
        inet 192.168.1.5  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::9c05:d472:9474:4a73  prefixlen 64  scopeid 0x20
        ether 60:a4:4c:51:10:1f  txqueuelen 1000  (Ethernet)
        RX packets 3869576  bytes 5184392155 (5.1 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1199648  bytes 129541357 (129.5 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73 (UP,LOOPBACK,RUNNING)  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 126393  bytes 10946367 (10.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 126393  bytes 10946367 (10.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...
$

Çıktıda 3 tane ağ arayüzünün bilgileri görülüyor.

  • docker0 Docker uygulamasının otomatik olarak oluşturduğu bir köprü ağı,
  • enp3s0 ethernet kartımın bulunduğu fiziki ağ arayüzü,
  • lo (loopback) makinenin kendisiyle haberleşebilmesini sağlayan arayüz

Yukarıdaki çıktıyı ben biraz kısalttım. Bu arayüzlerin sayısı her makinede değişecektir. Bunları listeleme sebebimiz, Linux'un tanıdığı ethernet kartlarını görmekti. enp3s0 arayüzünün internete bağlandığım ethernet ağ arayüzüm olduğunu biliyorum artık. İnternete kablosuz ağ üzerinden bağlanıyorsanız, wlan0 gibi bir arayüz listelenmeli. Hangi arayüzlerin kablosuz olduğunu anlamak için iwconfig komutunu kullanabilirsiniz.

$ iwconfig

lo        no wireless extensions.
enp3s0    no wireless extensions.
docker0   no wireless extensions.

$

Arayüzünüzü belirledikten sonra Netplan yapılandırması sırasında o arayüzün adını kullanmalısınız. Daha doğrusu DNS sorgularını şifrelemek istediğiniz her arayüzü yapılandırmalısınız. Ya da ikinci bölümde anlatacağım gibi bütün arayüzleri Stubby'e yönlendirebilirsiniz.

Aslında echo "nameserver 127.0.0.1" > /etc/resolv.conf komutunu kullanarak DNS adresini hemen değiştirebilirsiniz. Ancak bu değişiklik kalıcı olmayacaktır. Sistem yeniden başlatıldığında eski ayarlara geri döner. İşte Netplan sayesinde bunu kalıcı hale getirebiliyoruz.

Şimdi /etc/netplan dizinine girelim.

Not: /etc/netplan dizinine girdiğinizde birkaç YAML dosyası bulabilirsiniz. Eğer dosya yoksa, kendiniz oluşturmalısınız. Dosya uzantıları .yaml olmalı. Her arayüz yapılandırması için farklı bir dosya oluşturabilirsiniz. Dosya isimlerini kendi anlayacağınız herhangi bir isim koyabilirsiniz. Netplan dosya adlarını önemsemez (Türkçe karakterler sorun çıkarabilir, ...bilemiyorum), klasör içindeki bütün dosyaları alfabetik sıraya göre yorumlar. Sonra gelen dosyadaki anahtar değerleri, daha önceki dosyalarda da tanımlanmışsa üzerine yazılır. Bu nedenle dosyaların yorumlanış sırasını belirleyebilmek için başlarına sayı ekleyebilirsiniz ( önerilen yazım şekli, iki basamaklı bir sayı ve kısa çizgi, ardından dosya adı şeklindedir, örnek: 04-superonline.yaml). Ayrıca /etc/netplan dizininden sonra sırasıyla yorumlanan iki dizin daha vardır.
  1. /etc/netplan
  2. /lib/netplan
  3. /run/netplan
Bu dizinlerde bulunan YAML dosyaları da, /etc/netplan dizinindekilerden sonra yukarıdaki sırayla yoruma dahil edilir. Bu sıralamaya göre önceliğe sahip dizin, son sıradaki /run/netplan dizinidir. Bu dizinde bulunan dosyalarda tanımlanan anahtarlar, diğer dizin altındaki dosyalarda tanımlanan anahtarların üzerine yazılacaktır.
Ben dizin altında 01-network-manager-all.yaml dosyasını buldum ve yapılandırmayı da aynı dosya içinde yapıyorum. Dosyanın ilk olarak yorumlanması için isminin başına 01 eklenmiş. Bu zorunlu değil ancak başka dosyalar da eklendiğinde ilk olarak hangisinin yorumlanacağını anlayabiliyoruz. Dosyayı Nano editörü ile açalım.
sudo nano /etc/netplan/01-network-manager-all.yaml
# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager
Yapılandırmada bir network düğümü tanımlanmış ve bu düğüm içinde, ağ yöneticisi (renderer) olarak NetworkManager atanmış. Başka herhangi bir yapılandırma değeri olmadığı için, sistemdeki tüm arayüzler NetworkManager'ın kontrolüne bırakılmış. Dolayısıyla şu an arayüzler için bir alt konuda anlattığım (komut satırı ve gui ile girilen) ayarlar geçerli durumda. Biz ise NetworkManager'ın konfigurasyonunu Netplan'ın yapmasını sağlayacağız. Yani arayüzlerin kontrolü yine NetworkManager'da olacak fakat NetworkManager'ın konfigürasyonunu Netplan ile önceden tanımlayacağız.  Ve NewtwokManager başladığında, Netplan ile tanımladığımız ayarlar ile çalışacak. Eğer daha önce yaptığınız bir NetworkManager konfigürasyonu varsa, burada yapacağımız işlemler NetworkManager'in kendi konfigürasyonunun üzerine yazılacak.

Arayüzün adını yukarıda öğrenmiştim (enp3s0). Şimdi bu arayüzü YAML dosyasına dahil edelim ve ilgili değerleri de ekleyelim.
# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    enp3s0:
      dhcp4: no
      addresses: [192.168.1.21/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [127.0.0.1]
Yaptığımız değişiklik ile ethernet türünde bir cihaz tanımladık ve cihazın ağ arayüzünün adını belirttik (enp3s0). Burada çoklu arayüz tanımlamak için match anahtarı kullanılabilir.
match:
 name: wlan*
Bu şekilde wlan ile başlayan bütün kablosuz ağ arayüzlerini match komutuyla eşleştirmiş oluruz. Ve bu anahtar altında yapacağımız yapılandırmalar, eşleşen tüm arayüzlere uygulanır. Sistemdeki tüm PCI üzerindeki ethernet arayüzleri için de alttaki yapı kullanılabilir.
match:
 name: en*s*

Daha fazla örnek için man -a netplan komutuyla, Netplan kılavuzuna bakabilirsiniz.

dhcp4: no değeri, ağ arayüzünün otomatik IP almasının önüne geçiyor. Ve hemen ardından, arayüzün ve ağ geçitinin adreslerini tanımlıyoruz. Stubby'nin dinlediği IP ise nameservers: düğümü altındaki, addresses: anahtarına giriliyor. , ile ayırarak birden fazla adres girebilirsiniz. Ancak şifrelemeye alternatif yaratmaması adına, Stubby adresini tek adres olarak yazalım.

Amacımız yalnızca DNS adresini yönlendirmekken, arayüzün adres alma şeklini de dinamikten statiğe çevirdik. Bunun nedeni, Netplan'ın otomatik DNS adresi alma özelliğini NetworkManager konfigürasyonunda kapatamaması (networkd üzerinde kapatabiliyor). DNS adresini DHCP sunucusundan almasına engel olamadığımız için de, DHCP kullanımını bu şekilde kapatmış oluyoruz. Böylece DNS adresi de otomatik alınmamış oluyor. Sonrasında da hem arayüz hem de DNS adresini sabit olarak tanımlıyoruz.

Bu problem renderer olarak networkd seçildiğinde yaşanmıyor ancak networkd ağ yöneticisinin kapsamı NetworkManager kadar geniş değil. Örneğin kablosuz ağları yapılandıramıyorsunuz ve grafik arayüzü (gui) ile yapılandırmak da biraz zor çünkü doğru düzgün bir gui uygulaması yok. Netplan-NetworkManager arasındaki bu sorun giderilene kadar bu yöntemi kullanabilirsiniz.

Dosyayı bu haliyle kaydedelim. Şimdi Netplan'ın bu yeni yapılandırma dosyalarını yorumlayıp, NetworkManager konfigürasyon dosyalarını oluşturabilmesi için gerekli komutu verelim.

sudo netplan generate

Yapılan değişiklikleri çalışan sistemde uygulayalım.

sudo netplan apply

Değişikliği kontrol etmek için alttaki komutu kullanabilirsiniz.

nmcli device show enp3s0 | grep IP4.DNS
nmcli device show enp3s0 | grep IP4.DNS
IP4.DNS[1]:                             127.0.0.1 
$

Ethernet arayüzünün DNS adresi, Stubby'nin dinlediği IP adresine sabitlenmiş oldu.

1.2 NetworkManager kullanarak komut satırından yönlendirme

NetworkManager ağ bağlantılarından sorumlu, arka planda çalışan bir ağ yönetici araçtır. Ağ kartlarının eklendiğini veya çıkarıldığını algılayabilir, arayüze rotalar tanımlayabilir. WiFi bağlantı noktalarını seçmenize olanak tanır ve WiFi arayüzlerini yapılandırabilir. Büyük Linux dağıtımlarının çoğunda kurulu olarak gelmektedir.

NetworkManager yapılandırmasını iki şekilde yapabilirsiniz.

  1. nmcli komut satırı aracını kullanarak.
  2. NetworkManager yapılandırma dosyalarını elle düzenleyerek.
1.2.1 nmcli aracını kullanarak NetworkManager'ın yapılandırılması

Network Manager paketi ile beraber gelen nmcli aracı ise, NetworkManager'ı komut satırından kontrol etmek için kullanılır. Bu aracı kullanarak DNS adresini tek bir arayüz üzerinde değiştirebilirsiniz. İlk olarak, sistemimizde tanımlı bağlantıları listeliyelim.

nmcli c
$ nmcli c
NAME         UUID                                  TYPE      DEVICE 
Superonline  7badaaca-682b-3650-bc7c-229a6f13a344  ethernet  enp3s0 
virbr0       0a3bdcad-282f-467c-a4c9-6023b3cb576d  bridge    virbr0 
Hsn          84f98807-b1ac-466e-b1f4-01fa2da01a66  wifi      --     
$

Benim kullandığım sistemde bir kablosuz (Hsn), bir de kablolu (Superonline) bağlantı tanımlı durumda. Ayrıca sanal sistemlerle kullanılan bir de köprü bağlantı tanımlanmış. DNS adres değişikliğini Superonline bağlantısı üzerinde yapmak istediğimi düşünelim. Aşağıdaki komutla bu bağlantı için değişikliği gerçekleştirmiş oluyorum.

nmcli c modify Superonline ipv4.dns "127.0.0.1" ipv4.ignore-auto-dns true

ipv4.dns parametresine Stubby'nin dinlediği adresi tırnak içinde girerken, ipv4.ignore-auto-dns parametresine de true değeri vererek, otomatik DNS seçiminin önüne geçmiş oluyoruz.

IPv6 adresini değiştirmek için de yine nmcli aracını kullanabilirsiniz.

nmcli c modify Superonline ipv6.dns "::1" ipv6.ignore-auto-dns true

Bir bağlantı için mevcut tüm parametreleri görmek isterseniz alttaki komutu kullanın.

nmcli c show Superonline
1.2.2 NetworkManager'ın yapılandırma dosyalarını düzenleme

Alternatif olarak üstteki yöntem kadar pratik olmasa da, NetworkManager yapılandırma dosyalarını elle düzenleyerek de aynı işlemi gerçekleştirebilirsiniz. NetworkManager her bağlantıya ait yapılandırma dosyalarını /etc/NetworkManager/system-connections dizini altında bulundurur. İlk önce bu dizin altında bulunan dosyaları listeleyelim.

ls -l /etc/NetworkManager/system-connections
$ ls -l /etc/NetworkManager/system-connections
toplam 12
-rw------- 1 root root 345 Ağu  4  2018 Hsn.nmconnection
-rw-r--r-- 1 root root 191 Kas  3  2013 NetworkManager-USRP
-rw------- 1 root root 359 Ara 16 20:59 Superonline.nmconnection
$

Listelenen dosyalardan da görüldüğü gibi Network Manager her bağlantı için bir yapılandırma dosyası oluşturmuş. DNS yönlendirme işlemini, internet bağlantım olan Superonline üzerinde yapmak istiyorum. Bu nedenle Superonline dosyasını yönetici haklarıyla Nano editörünü kullanarak açıyorum.

sudo nano /etc/NetworkManager/system-connections/Superonline.nmconnection
[connection]
id=Superonline
uuid=7badaaca-682b-3650-bc7c-229a6f13a344
type=ethernet
autoconnect-priority=-999
permissions=
timestamp=1576751879

[ethernet]
mac-address=62:B2:1C:68:11:1D
mac-address-blacklist=

[ipv4]
dns-search=
method=auto

[ipv6]
addr-gen-mode=stable-privacy
dns-search=
ip6-privacy=0
method=auto

Açılan dosyada [ipv4] alanı altına dns=127.0.0.1; ve [ipv6] alanı altına da, dns=::1; şeklinde Stubby'nin dinlediği adresleri tanımlıyalım. Ayrıca DNS adresinin otomatik alınmasını engelleyen ignore-auto-dns=true satırını her iki alana da ekleyelim (IP adreslerinin sonuna ; koymayı unutmayın).

...

[ipv4]
dns=127.0.0.1;
ignore-auto-dns=true
dns-search=
method=auto

[ipv6]
dns=::1;
ignore-auto-dns=true
addr-gen-mode=stable-privacy
dns-search=
ip6-privacy=0
method=auto

Yeni eklediğimiz satırlarla birlikte dosyayı kaydediyoruz.

İpucu: Nano editörü ile açılmış dosyayı kaydetmek için Ctrl+O tuşlayın ve ardından Enter ile onaylayın. Artık Ctrl+X ile editörden çıkış yapabilirsiniz.

Değişiklilerin uygulanması için Network Manager'ı yeniden başlatmamız gerekiyor.

sudo systemctl restart NetworkManager.service

Bağlantı yeniden kurulduğunda, arayüzün DNS adresi olarak 127.0.0.1 görmelisiniz.

systemd-resolve --status
$ systemd-resolve --status
...

Link 2 (enp3s0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 127.0.0.1
          DNS Domain: ~.
$

Eğer yukarıdaki işlemleri uygulayabildiyseniz, sadece bu bağlantı (Superonline) üzerinde DNS sorgularınız şifrelenmeye başlayacaktır.

1.3 NetworkManager kullanarak grafik arayüz (GUI) ile yönlendirme

Ubuntu masaüstünde, NetworkManager ile kontrol edilen ağın ayarlarını grafik arayüz ile düzenlemek isterseniz nm-connection-editor programını kullanabilirsiniz. Programı doğrudan komut satırından çalıştırabilirsiniz.

nm-connection-editor
Not: Eğer yukarıdaki komut ile başlatamıyorsanız, sisteminize kurmak için network-manager-gnome paketini kurun. nm-connection-editor programı bu paket ile birlikte gelir. sudo apt-get install network-manager-gnome komutu ile paketi sisteminize kurabilirsiniz.

Veya bildirim alanındaki ağ simgesine tıklayın ve "Bağlantıları Düzenle..." seçeneğini seçin.

Not: Kullandığınız masaüstü ortamının bir bildirim alanı yoksa bu simgeyi göremezsiniz. Bu durumda uygulamalar arasında "Ağ Bağlantıları" isimli uygulamayı arayın.

Açılan pencereden internete bağlandığınız ağın adını seçin ve ayarlar penceresindeki IPv4 Ayarları sekmesinde bulunan, Yöntem açılabilir menüsünü Yalnızca kendiliğinden (DHCP) adresler olarak değiştirin (bazı sistemlerde bunun yerine Auto DNS gibi bir seçenek olmalı, onu kapatın). DNS adresi olarak 127.0.0.1 seçerek kaydedin.

Not: nm-connection-editor arayüzünde değişiklik yapmanıza rağmen ağın çalışması etkilenmiyorsa, arka planda ağ kontrol uygulaması olarak, NetworkManager yerine systemd-networkd çalışıyor olabilir. Aşağıdaki komut ile NetworkManager çalışma durumunu öğrenin.
sudo systemctl status NetworkManager | grep Active
$ sudo systemctl status NetworkManager | grep Active
   Active: inactive (dead)
$
Şimdi de systemd-networkd servisinin durumuna bakalım.
sudo systemctl status systemd-networkd | grep Active
$ sudo systemctl status systemd-networkd | grep Active
   Active: active (running) since Wed 2019-12-18 15:40:22 +03; 1min 37s ago
$
Görüldüğü gibi, NetworkManager servisi inactive durumdayken, systemd-networkd servisi ise active durumda. Bu durumu tersine çevirmek için öncelikle systemd-networkd servisini devre dışı bırakalım. Aşağıdaki komutları sırasıyla uygulayın.
sudo systemctl disable systemd-networkd.service
sudo systemctl mask systemd-networkd.service
sudo systemctl stop systemd-networkd.service
Şimdi /etc/netplan dizinine girerek .yaml uzantılı dosyayı yönetici olarak açın ve içeriğini aşağıdaki gibi değiştirin.
network:
  version: 2
  renderer: NetworkManager
Dosyayı kaydedin ve alttaki komut ile NetworkManager için yapılandırma dosyalarının oluşturulmasını sağlayın.
sudo netplan generate
Ve son olarak NetworkManager servisini başlatın.
sudo systemctl unmask NetworkManager
sudo systemctl enable NetworkManager
sudo systemctl start NetworkkManager
Şimdi artık sudo systemctl status NetworkManager | grep Active komutu ile NetworkManager servisinin aktif olduğunu görmelisiniz. Artık yukarıdaki işlemleri uygulayarak nm-connection-editor ile ağınızı yapılandırabilirsiniz.

Bu şekilde sadece bir arayüz bağlantısı üzerinde DNS sorgularınız şifrelenmeye başlayacaktır.

2. Bütün arayüzleri yönlendirme

Öncelikle Linux'ta DNS adresi elde etmekle ilgili aşağıdaki bilgileri not düşeyim.

Linux'ta, kullanılacak olan DNS adresi sırasıyla aşağıdaki kaynaklardan elde edilir.

  1. /etc/resolv.conf dosyasından ( systemd-resolved çözümleyicisinin yüklü olduğu sistemlerde bu dosya doğrudan düzenlenmez, aşağıda uyarı kısmını okuyun).

  2. Sistem hizmetlerinin yapılandırma dosyalarından, otomatik DNS alma özelliği aktif değil ve statik olarak belirtilmiş ise ( sytemd-networkd servisi aktif ise /etc/systemd/network dizini içindeki .network uzantılı, NetworkManager aktif ise /etc/NetworkManager/system-connections/ içindeki, bağlantı başına oluşturulmuş dosyalardan).

  3. DHCP üzerinden, bağlantı başına dinamik olarak (otomatik DNS alma özelliği aktif ise).

En son elde edilen adres diğerlerinin üzerine yazılır, yani 3. seçenek önceliklidir. Dolayısıyla 3. sıradaki yöntem iptal edilmiş ve 2. sıradaki ayarlarda herhangi bir statik adres belirtilmemişse (otomatik DNS alma özelliğinin kapatılması gerekli), sistem bütün arayüzlerin DNS sorgularını, /etc/resolv.conf dosyasında bulunan DNS adresine yönlendirir. Eğer burada da bir DNS adresi bulunamazsa, bağlantı kurmaya çalıştığınızda karşı sunucunun IP adresinin bulunamadığına dair bir hata mesajı alırsınız.

Uyarı: /etc/resolv.conf dosyası, systemd-resolved çözümleyicisinin yüklü olduğu sistemlerde doğrudan düzenlenmez. Bu dosya, systemd-resolved tarafından sistem her açıldığında dinamik olarak yeniden oluşturulur. Bu nedenle bu dosya içinde değişiklik yapsanız dahi, bir sonraki açılışta dosya eski haline dönecektir. systemd-resolved ise bu dosyayı oluştururken /etc/systemd/resolved.conf yapılandırma dosyasını dikkate alır. Dolayısıyla bu yapılandırma dosyasını düzenlemek, /etc/resolv.conf dosyasının dinamik olarak oluşturulduğunda girilen değerlerini belirleyecektir.
Şimdi yukarıdaki açıklama ve uyarıdan sonra, 1. adımda belirtilen DNS adresimizi ayarlayabilmek için systemd-resolved yapılandırma dosyasını düzenlememiz gerektiğini biliyoruz. Dosyayı bir metin düzenleyici ile (örn. Nano) yönetici olarak açın.
sudo nano /etc/systemd/resolved.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See resolved.conf(5) for details

[Resolve]
#DNS=
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes
Dosya içindeki [Resolve] başlığı altında bulunan DNS= parametresinin başındaki # karakterini kaldırın ve değer olarak, Stubby'nin dinlediği adresi (IPv4 127.0.0.1, IPv6 için 0::1) yazın.
[Resolve]
...

DNS=127.0.0.1 0::1
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes
Bu değişiklikten sonra dosyayı kaydederek kapatabilirsiniz.
İpucu: Nano editörü ile açılmış dosyayı kaydetmek için Ctrl+O tuşlayın ve ardından Enter ile onaylayın. Artık Ctrl+X ile editörden çıkış yapabilirsiniz. 
Değişikliğin etkili olabilmesi için, systemd-resolved servisini yeniden başlatmamız gerekiyor.
sudo systemctl restart systemd-resolved
veya
sudo service systemd-resolved restart
Değişikliğin gerçekleştiğini aşağıdaki komut ile gözlemleyebiliriz.
systemd-resolve --status
$ systemd-resolve --status
Global
         DNS Servers: 127.0.0.1
                      ::1
          DNSSEC NTA: 10.in-addr.arpa
                      16.172.in-addr.arpa
                      168.192.in-addr.arpa
                      17.172.in-addr.arpa
                      18.172.in-addr.arpa
                      19.172.in-addr.arpa
                      20.172.in-addr.arpa
                      ...
                      ...
Link 2 (enp3s0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 192.168.1.1
DNS adresinin Global alanında değişmiş olmasına rağmen, bende (enp3s0) olarak gösterilen Link 2 ağında değişmediği görülüyor. Üstelik bendeki ağ yapılandırmasında, (enp3s0) arayüzünün DNS adresi de tanımlanmış değil. Bunun nedeni, sistem ağ bağlantısı ayarlarında (enp3s0) olarak gösterilen ethernet ağımın, DNS adres tercihinin otomatik ayarlanmış olmasıdır. Yani Linux DNS adresini, DNS adresi temin etme yollarındaki 3. adımdan sağlıyor. Bu şekilde DHCP ile otomatik alınan DNS adresi öncelikli olduğu için bu arayüzdeki bütün DNS sorguları bu adrese yönlendirilecektir. Bu yüzden, sistemin DNS adresi temin etme yollarından 3. ve 2. seçenekleri iptal etmemiz gerekecek.

Bu işlemi yukarıda anlattığım tek ağ arayüzünü yönlendirme başlığı altındaki seçenekleri kullanarak her arayüz için yapabilirsiniz. Ya da kısaca NetworkManager'ın nmcli aracı ile yapabilirsiniz. İlk olarak, sistemimizde tanımlı bağlantıları listeleyelim.
nmcli c
$ nmcli c
NAME         UUID                                  TYPE      DEVICE 
Superonline  7badaaca-682b-3650-bc7c-229a6f13a344  ethernet  enp3s0 
virbr0       0a3bdcad-282f-467c-a4c9-6023b3cb576d  bridge    virbr0 
Hsn          84f98807-b1ac-466e-b1f4-01fa2da01a66  wifi      --     
$
enp3s0 arayüzünde, DNS adresinin DHCP ile otomatik alınmasını önleyelim ve mevcut DNS adresini de silelim.
nmcli c modify Superonline ipv4.dns "" ipv4.ignore-auto-dns true ipv4.dns-search "~."
ipv4.dns parametresine "" girerek mevcut bütün adresleri temizliyoruz. ipv4.ignore-auto-dns parametresi ile otomatik DNS alımını engellemiş oluyoruz. ipv4.dns-search "~." parametresi ise DNS sorgularının, sistemin ön tanımlı DNS adresine (yani /etc/systemd/resolved.conf dosyası içinde [Resolve] alanında tanımladığımız) yönlenmesini sağlayacak.

IPv6 DNS adresini değiştirmek için de yine nmcli aracını kullanabilirsiniz.
nmcli c modify Superonline ipv6.dns "" ipv6.ignore-auto-dns true ipv6.dns-search "~."
Bu komutu uyguladığınız bütün arayüzler, Global alandaki DNS adresine yönlenecektir. Artık yalnızca genel DNS adresini değiştirerek, bütün arayüzleri bu adrese yönlendirmiş olursunuz.

Değişiklilerin uygulanması için Network Manager'ı yeniden başlatmamız gerekiyor.
sudo systemctl restart NetworkManager.service

Sonuç

Yukarıdaki yöntemlerden birini tamamladıktan sonra, bloğuma girmek için istek gönderen bir internet tarayıcısının yaptığı DNS sorgusuna tekrar bakalım.

Wireshark uygulaması ile yakalanan, şifrelenmiş DNS sorgusu içeriği.

Wireshark yazılımı ile elde ettiğim ekran görüntüsünde görüldüğü gibi, artık DNS sorguları açık gönderilmek yerine TLS yöntemi ile şifreleniyor. Sorguların gönderildiği 185.49.141.37 IP adresi ise Stubby yapılandırma dosyasında (/etc/stubby/stubby.yml) ön tanımlı olarak gelen DNS adreslerinden biri. Bu yapılandırma dosyasında 3 adet IPv4, 3 adet de IPv6 DNS adresi kullanıma hazır olarak geliyor. Başka ek adresler de kayıtlı fakat kullanıma açılmamış. Diğer DNS adreslerinin başındaki # karakterini silerek kullanıma dahil edebilirsiniz.

Not: Stubby yapılandırma dosyalarında tanımladığınız DNS'lerin, DoT protokolünü desteklemesi gerekir. Stubby, kendi DNS'leri tanımlanmış halde geldiği için ek bir işlem yapmanıza gerek yok. Destekleyen diğer DNS'lerin listesine ise buradan ulaşabilirsiniz.

Kaynaklar