Πώς μπορώ να ορίσω το DNS μου όταν το resolv.conf αντικαθίσταται;

Οι περισσότερες πληροφορίες που βλέπω στο διαδίκτυο λένε να επεξεργαστώ το αρχείο /etc/resolv.conf, αλλά όποιες αλλαγές κάνω εκεί απλά παρακάμπτονται.

$ cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- 
#     YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1

Φαίνεται ότι το 127.0.1.1 είναι μια τοπική περίπτωση του dnsmasq. Τα έγγραφα του dnsmasq λένε να επεξεργαστείτε το /etc/resolv.conf. Δοκίμασα να βάλω προσαρμοσμένους διακομιστές ονομάτων στο /etc/resolv.conf.d/base, αλλά οι αλλαγές δεν εμφανίστηκαν στο /etc/resolv.conf μετά την εκτέλεση του sudo resolvconf -u.

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

UPDATE:

Απάντησα στην ερώτηση αυτή μόνος μου: https://unix.stackexchange.com/a/163506/67024

Νομίζω ότι είναι η καλύτερη λύση από τότε:

  1. Λειτουργεί.
  2. Απαιτεί τις λιγότερες αλλαγές και
  3. Εξακολουθεί να λειτουργεί σε συνδυασμό με την κρυφή μνήμη DNS του dnsmasq's, αντί να την παρακάμπτει.

Πιστεύω ότι αν θέλετε να παρακάμψετε τον διακομιστή ονομάτων DNS, απλώς προσθέτετε μια γραμμή παρόμοια με αυτή στο αρχείο base σας στο τμήμα resolv.conf.d.

Παράδειγμα

$ sudo vim /etc/resolvconf/resolv.conf.d/base

Στη συνέχεια, βάλτε τη λίστα με τους διακομιστές ονομάτων σας ως εξής:

nameserver 8.8.8.8
nameserver 8.8.4.4

Τέλος, ενημερώστε το resolvconf:

$ sudo resolvconf -u

Αν ρίξετε μια ματιά στη σελίδα man για το resolvconf περιγράφει τα διάφορα αρχεία κάτω από το /etc/resolvconf/resolv.conf.d/.

   /etc/resolvconf/resolv.conf.d/base
          File  containing  basic  resolver  information.  The lines in this 
          file are included in the resolver configuration file even when no
          interfaces are configured.

   /etc/resolvconf/resolv.conf.d/head
          File to be prepended to the dynamically generated resolver 
          configuration file.  Normally this is just a comment line.

   /etc/resolvconf/resolv.conf.d/tail
          File to be appended to the dynamically generated resolver 
          configuration file.  To append nothing, make this  an  empty  
          file.   This file is a good place to put a resolver options line 
          if one is needed, e.g.,

              options inet6

Παρόλο που υπάρχει μια προειδοποίηση στην κορυφή του αρχείου head:

$ cat /etc/resolvconf/resolv.conf.d/head
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN

αυτή η προειδοποίηση βρίσκεται εκεί έτσι ώστε όταν αυτά τα αρχεία κατασκευάζονται, η προειδοποίηση τελικά θα λειτουργήσει στο αρχείο resolv.conf που θα προκύψει και θα χρησιμοποιηθεί για την κατασκευή αυτών των αρχείων. Έτσι, θα μπορούσατε εξίσου εύκολα να έχετε προσθέσει τις γραμμές nameserver που περιγράφονται παραπάνω για το αρχείο base, και στο αρχείο head.

Αναφορές

Σχόλια (7)

Ενδιαφέρομαι επίσης για αυτό το ερώτημα και δοκίμασα τη λύση που πρότεινε ο @sim.

Για να το δοκιμάσω, έβαλα

nameserver 8.8.8.8

στο /etc/resolvconf/resolv.conf.d/base και

nameserver 8.8.4.4

στο /etc/resolvconf/resolv.conf.d/head

Στη συνέχεια έκανα επανεκκίνηση του δικτύου με

sudo service network-manager restart

Το αποτέλεσμα είναι ότι το /etc/resolv.conf μοιάζει με

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 8.8.4.4
nameserver 127.0.1.1

και το nm-tool δηλώνει ότι οι dnsserver είναι

DNS:             208.67.222.222
DNS:             208.67.220.220

οι οποίοι είναι αυτοί που παρέχονται από τον δρομολογητή μου. Από την άλλη πλευρά, το σκάψιμο μιας διεύθυνσης λέει ότι

;; Query time: 28 msec
;; SERVER: 8.8.4.4#53(8.8.4.4)

Αν έχω δίκιο, συμπεραίνω από όλα αυτά ότι

  1. μόνο το τμήμα "head" διαβάζεται από το resolvonf: το τμήμα "base" διαβάζεται κατά κάποιο τρόπο ελέγχεται από το dnsmasq
  2. ο dnsserver αναγκάζεται στην πραγματικότητα να 8.8.4.4 ανεξάρτητα από τον διακομιστή που παρέχεται από το dhcp, ΑΛΛΑ χάνετε την προσωρινή αποθήκευση που παρέχει το dnsmasq, αφού η αίτηση αποστέλλεται πάντα στον 8.8.4.4.
  3. Ο dnsmasq εξακολουθεί να χρησιμοποιεί ΜΟΝΟ τον dnsserver που παρέχεται από τον dhcp.

Συνολικά, λειτουργεί, αλλά δεν νομίζω ότι είναι το επιδιωκόμενο αποτέλεσμα που ζητήθηκε. Μια πιο κοντινή λύση νομίζω ότι είναι η ακόλουθη. Επεξεργασία

sudo vim /etc/dhcp/dhclient.conf

και στη συνέχεια προσθέστε

supersede domain-name-servers 8.8.8.8;

Το αποτέλεσμα είναι το εξής: το resolv.conf περιέχει μόνο το 127.0.0.1, πράγμα που σημαίνει ότι η cache dnsmasq καλείται και το nm-tool λέει

DNS:             8.8.8.8

που σημαίνει ότι αν το όνομα που αναζητείται δεν υπάρχει στην cache, τότε ζητείται στο 8.8.8.8.8 και όχι στον διακομιστή που παρέχεται από το dhcp.

Μια άλλη (ίσως καλύτερη) επιλογή είναι η χρήση του "prepend" αντί του "supersede": με αυτόν τον τρόπο, εάν το όνομα δεν επιλυθεί από τον 8.8.8.8.8, τότε η αίτηση επιστρέφει στον άλλο διακομιστή. Στην πραγματικότητα, το nm-tool λέει

DNS:             8.8.8.8    
DNS:             208.67.222.222
DNS:             208.67.220.220
Σχόλια (4)

Δοκιμάστε να προσθέσετε το dns-nameservers XXX.XXX.XXX.XXX.X στο αρχείο σας /etc/networking/interfaces.

Σχόλια (2)