To σισύφιο έργο της ρύθμισης του DNS στο Linux, Μέρος Ι

Το DNS (Domain Name Service) είναι μια υπηρεσία που μεταφράζει ονόματα όπως το linux-user.gr σε διευθύνσεις IP και υπάρχει από το 1983. Για να κάνει την μετάφραση χρειάζεται να ξέρει που να ρωτήσει και αυτό το παρέχει ένα απλό αρχείο το /etc/resolv.conf.

$ cat /etc/resolv.conf
nameserver 192.168.1.1

Απλό και εύκολο. Θέλεις να χρησιμοποιήσεις κάτι άλλο; Απλά άλλαξε μια γραμμή σε ένα αρχείο.

Και μετά ήρθε το DHCP. Το πρωτόκολλο αυτό επιτρέπει στον υπολογιστή να ρυθμίσει το δίκτυο ζητώντας πληροφορίες όπως την IP που θα χρησιμοποιήσει από κάποιον DHCP server τυπικά το ρούτερ. Και ανάμεσα στις πληροφορίες που θα πάρει είναι και ο DNS server. Πλέον το περιεχόμενο του /etc/resolv.conf δεν είναι στατικό και ένα πρόγραμμα φροντίζει να το ενημερώσει. Το πρόγραμμα αυτό είναι το resolvconf ή το openresolv. Πλέον στο αρχείο θα δούμε στην αρχή του ένα σχόλιο της μορφής

# Generated by resolvconf

Αλλά όταν πολλά προγράμματα έχουν άποψη για το τι πρέπει να περιέχει το αρχείο /etc/resolv.conf το Debian αφήνει όλους να κερδίσουν και φτιάχνει μια μίξη ρυθμίσεων που να ικανοποιεί όλους. Και αυτό συνήθως λειτουργεί, εκτός αν θέλεις να έχεις τον πλήρη έλεγχο. Το openresolve έχει καλύτερο έλεγχο αλλά και πάλι ο τελευταίος που κάνει την ρύθμιση κερδίζει.

Αλλά αυτή η συνεχής μάχη είναι κουραστική και ενοχλητική, για να μην πούμε πως κάνει την ρύθμιση του Wifi εξαιρετικά δύσκολη. Κάθισαν λοιπόν και έφτιαξαν το NetworkManager. Το μεγάλο πλεονέκτημα του είναι πως έχει ένα D-Bus API και ένα πρόγραμμα μπορεί να περάσει την διαμόρφωση που θέλει, αλλά και να ελέγξει αν αυτή πραγματοποιήθηκε. Αλλά το NetworkManager μπορεί να αναθέσει την δουλεία πίσω στο resolvconf και αυτό συμβαίνει σε πολλές διανομές. Παρόλα αυτά το Network Manager ήταν η καλύτερη λύση, τουλάχιστον για κάποια περίοδο.

Αλλά καθώς τα πράγματα γίνονταν όλο και ποιο πολύπλοκα υπήρξε ανάγκη για μια ποιο ισχυρή λύση και ήρθε το systemd-resolved. Αυτό επιτρέπει στον διαχειριστή να έχει καλύτερο έλεγχο στο ποιο DNS χρησιμοποιεί ή κάθε διασύνδεση δικτύου.

🚀~ resolvectl status
resolvectrl status
Global
       LLMNR setting: no
MulticastDNS setting: no
  DNSOverTLS setting: no
      DNSSEC setting: no
    DNSSEC supported: no

Link 2 (enp5s0)
      Current Scopes: DNS         
DefaultRoute setting: yes         
       LLMNR setting: yes         
MulticastDNS setting: no          
  DNSOverTLS setting: no          
      DNSSEC setting: no          
    DNSSEC supported: no          
         DNS Servers: 192.168.2.10
          DNS Domain: lan         

Link 4 (tun0)
      Current Scopes: DNS         
DefaultRoute setting: yes         
       LLMNR setting: yes         
MulticastDNS setting: no          
  DNSOverTLS setting: no          
      DNSSEC setting: no          
    DNSSEC supported: no          
         DNS Servers: 10.255.255.3
          DNS Domain: ~.    

Βλέπουμε πως υπάρχουν δυο διαφορετικοί DNS servers ανάλογα με το αν βγαίνεις απο το VPN ή όχι. Και ένας εταιρικός χρήστης μπορεί να χρησιμοποιεί ταυτόχρονα πολλά VPN. Επίσης έχει υποστήριξη για DNS over TLS αλλά δεν θα μιλήσουμε εδώ για αυτό. Και μιλάει και αυτό μέσα από το D-Bus.

Μέχρι τώρα βλέπαμε το DNS ως έναν παγκόσμιο συνεπή χώρο ονομάτων, με τον τρόπο που προοριζόταν το DNS όταν δημιουργήθηκε για πρώτη φορά. Αυτό δεν συμβαίνει πάντα. Ορισμένα δίκτυα ή οργανισμοί έχουν τον δικό τους ιδιωτικό διακομιστή DNS με ονόματα που δεν μπορούν να επιλυθούν μέσω του διαδικτύου. Αυτό καθιστά τα πράγματα πολύ πιο περίπλοκα. Λόγω έλλειψης καλύτερου όρου, θα ονομάσουμε αυτή τη ρύθμιση split DNS.

Η κίνηση IP δρομολογείται μεταξύ άλλων μηχανημάτων χρησιμοποιώντας έναν πίνακα δρομολόγησης. Αυτός ο πίνακας δρομολόγησης διαθέτει μια λίστα δικτύων και οδηγίες σχετικά με το τι πρέπει να κάνετε με αυτά. Για να χειριστούμε σωστά το split DNS, χρειαζόμαστε έναν πίνακα δρομολόγησης για το DNS, κατανεμημένο ανά υποτομέα αντί για διεύθυνση IP. Αυτό κάνουν τα Windows, τα Mac, και όποιος υπολογιστής Linux χρησιμοποιεί το systemd-resolved.

Για παράδειγμα, θα μπορούσατε να έχετε έναν πίνακα δρομολόγησης DNS που μοιάζει με αυτό:

  • Εάν ο τομέας τελειώνει σε .lab, ρωτήστε 10.77.2.2 για την απάντηση
  • Εάν ο τομέας καταλήγει σε .local, ρωτήστε τον Bonjour για την απάντηση
  • Διαφορετικά, ρωτήστε 1.1.1.1 ή 8.8.8.8 για την απάντηση

Κάπως έτσι δουλεύουν οι διευθύνσεις της μορφής computername.local άρα δεν είναι μια εξωτική ανάγκη. Αλλά το /etc/resolv.conf δεν υποστηρίζει κάτι τέτοιο. Το NetworkManager με την βοήθεια του dnsmasq μπορεί να το καταφέρει.

Αλλά στην γενική περίπτωση η πικρή αλήθεια είναι πως τα πράγματα στο Linux δεν είναι απλά, ούτε επαρκώς τεκμηριωμένα και εξαρτώνται από το πως είναι η κάθε διανομή ρυθμισμένη. Ποιος θα μου πει την διεύθυνση του linux-user.gr; Θα παέι να ρωτήσει το δημόσιο Internet; Θα πάρω πάντα την ίδια απάντηση; Θα χρησιμοποιήσει UDP, TCP ή DNS over HTTPS. Δεν υπάρχουν σαφείς απαντήσεις και τα πράγματα δεν είναι επαρκώς τεκμηριωμένα. Για το κερασάκι στην τούρτα το glibc και το musl έχουν διαφορετική συμπεριφορά.

Στα προβλήματα αυτά το systemd-resolved είναι ίσως η λύση για να γίνει σωστά. Υποστηρίζει ότι χρειάζεται ένα split DNS VPN και έχει πολύ καλή τεκμηρίωση. Μένει μόνο να δούμε πως θα το χρησιμοποιήσουμε

Αν δεν υπάρχει το αρχείο /etc/resolv.conf υποθέτει πως μπορεί να αναλάβει δράση και να το αντικαταστήσει. Θα φτιάξει το αρχείο και εκεί θα δούμε

# This is /run/systemd/resolve/stub-resolv.conf managed by man:systemd-resolved(8).
# Do not edit.

αν υπάρχει το αρχείο και δεν έχει το σχόλιο μέσα του, υποθέτει πως κάτι άλλο παρέχει την υπηρεσία και δεν πειράζει τίποτα. Αλλά τότε θα πρέπει να γίνουν μια σειρά από έλεγχοι. Χρησιμοποιεί το resolvconf; Υπάρχει σαν εκτελέσιμο; Μήπως το NetworkManager; Μιλάει αυτός στο D-Bus; Είναι η τελευταία του έκδοση μιας και οι παλιές εκδόσεις δεν ρυθμίζουν σωστά;

Το παραπάνω διάγραμμα δείχνει πως ακριβώς μια διανομή Linux ρυθμίζει το DNS.

Εάν αποφασίσετε ότι θέλετε να δημιουργήσετε κάποια νέα υπηρεσία διαχείρισης διαμόρφωσης DNS στο μέλλον, βεβαιωθείτε τουλάχιστον πως ότι είναι τεκμηριωμένη. Συμπεριλαμβανομένων των αλληλεπιδράσεων με το υπόλοιπο αυτού του γραφήματος.

Εάν είστε maintainer κάποιας διανομής Linux, ίσως αναρωτιέστε ποιο μέρος αυτής της παράνοιας θα παραδώσετε στους χρήστες σας. Η άποψή μας είναι ότι πρέπει να χρησιμοποιήσετε το systemd-resolved και, εάν χρειάζεστε φιλική προς το χρήστη διαμόρφωση δικτύου, μια πολύ πρόσφατη έκδοση του NetworkManager (1.26.6 ή καλύτερη) Αυτό θα δώσει τις δυνατότητες διανομής DNS τελευταίας τεχνολογίας και θα κάνει τους εφαρμοστές λογισμικού δικτύωσης πολύ πιο χαρούμενους. Με αυτήν τη ρύθμιση, το γράφημα διαμόρφωσης DNS μοιάζει με αυτό:

image

To κείμενο είναι μια όχι λέξη προς λέξη μετάφραση του The Sisyphean Task Of DNS Client Config on Linux από την ομάδα ανάπτυξης του Tailscale. Οι απόψεις είναι του συγγραφέα. Ελπίζω να φανεί χρήσιμο την επόμενη φορά που θα αναρωτιέστε τι :poop: κάνει η διανομή σας με το DNS. Αν υπάρχουν καλύτερες λύσεις θα χαρώ να τις ακούσω στα σχόλια. Ο μεταφραστής είναι ψιλοάσχετος με το αντικείμενο και ακόμα προσπαθεί να καταλάβει τι :poop: κάνει το VPN που χρησιμοποιεί και πώς.

Διαβάστε

2 «Μου αρέσει»