Το DNS επανέρχεται διαρκώς, η επανασύνδεση του VPN ακυρώνει τη διόρθωσή σας, και κάποια στιγμή κάποιος στην ομάδα προτείνει να κλειδωθεί το αρχείο. Αυτή η ακολουθία είναι σύμπτωμα, όχι λύση: δύο στοιχεία πιστεύουν και τα δύο ότι κατέχουν το /etc/resolv.conf, και κερδίζει όποιο γράφει τελευταίο. Το κλείδωμα του αρχείου δεν λύνει τη σύγκρουση ιδιοκτησίας, απλώς την κρύβει ενώ σπάει το στοιχείο που πραγματικά θέλατε. Εκτελέστε τους τέσσερις ελέγχους παρακάτω με τη σειρά και διορθώστε τη διάταξη στο επίπεδο που την κατέχει, όχι στο αρχείο.

Έλεγχος 1: είναι συμβολικός σύνδεσμος, και προς τι

Ξεκινήστε από το ίδιο το αρχείο, γιατί η διαδρομή που επεξεργάζεστε μπορεί να μην είναι καθόλου το αρχείο. Ένας συμβολικός σύνδεσμος στον κατάλογο χρόνου εκτέλεσης ενός resolver συμπεριφέρεται εντελώς διαφορετικά από ένα συνηθισμένο αρχείο που ξαναγράφει ένα σενάριο πελάτη:

ls -l /etc/resolv.conf
readlink -f /etc/resolv.conf
cat /etc/resolv.conf

Ένας σύνδεσμος προς διαδρομή stub του systemd-resolved σημαίνει ότι τα περιεχόμενα του αρχείου παράγονται και η χειροκίνητη επεξεργασία θα αντικατασταθεί στο επόμενο συμβάν. Ένα συνηθισμένο αρχείο με γραμμές nameserver συνήθως το γράφει όποιος πελάτης ή hook DHCP εκτελείται κατά τη σύνδεση. Και τα δύο είναι θεμιτά· αυτό που μετράει είναι να ξέρετε ποιο από τα δύο έχετε πριν αλλάξετε οτιδήποτε.

Έλεγχος 2: ποιος δαίμονας εκτελείται

Βρείτε τι είναι πραγματικά ενεργό, όχι τι είναι εγκατεστημένο. Σε μια σύγχρονη διανομή μπορεί να υπάρχουν πολλοί resolver, και απαντά εκείνος που κρατά τη θύρα 53 στη διεπαφή loopback:

systemctl status systemd-resolved --no-pager
resolvectl status
ss -lunp | grep ':53'

Η έξοδος κατάστασης ονομάζει τους διακομιστές DNS ανά ζεύξη και τους τομείς δρομολόγησης, που είναι ο χάρτης που χρειάζεστε για split DNS. Αν τα εσωτερικά ονόματα πρέπει να πηγαίνουν σε εσωτερικό διακομιστή και όλα τα άλλα σε δημόσιο, αυτή η πολιτική ζει στους τομείς ανά ζεύξη, και η ισοπέδωσή της σε στατική λίστα nameserver μέσα στο αρχείο χάνει αθόρυβα τη διάκριση.

Η ίδια η διαμόρφωση του NetworkManager αποφασίζει ποιο από αυτά τα backend χρησιμοποιεί. Η ρύθμιση dns= στο κύριο αρχείο διαμόρφωσης επιλέγει ανάμεσα στον εσωτερικό του resolver, το dnsmasq, το systemd-resolved και το none, και η διανομή μπορεί να έχει επιλέξει για εσάς. Διαβάστε αυτή τη ρύθμιση πριν αποφασίσετε τι σημαίνει “διόρθωση DNS” σε αυτόν τον υπολογιστή.

Έλεγχος 3: τι επιτρέπεται να γράφει ο πελάτης VPN

Εδώ συνήθως ζει η σύγκρουση. Ένας πελάτης VPN που ξαναγράφει απευθείας το αρχείο του resolver θα συγκρουστεί με κάθε υπηρεσία που το συντηρεί επίσης, και χαμένος είναι όποιος εκτελείται πρώτος. Πρόσφατες εκδόσεις του OpenVPN μπορούν να παραδώσουν τις ρυθμίσεις DNS στο systemd-resolved αντί να ξαναγράψουν το αρχείο, που είναι η συνεργατική συμπεριφορά που θέλετε· παλαιότερα σενάρια και χειρόγραφα hooks συχνά καλούν έναν παλιό βοηθό ή απλώς αντικαθιστούν το αρχείο.

Η κατάσταση του WireGuard είναι παρόμοια σε μορφή: η ίδια η διαμόρφωση της διεπαφής δεν διαχειρίζεται το DNS, το κάνουν τα εργαλεία γύρω της, μέσω βοηθού resolver ή της ενσωμάτωσης resolved. Αν είναι εγκατεστημένοι δύο τέτοιοι βοηθοί, και οι δύο θα προσπαθήσουν να επιβάλουν την εικόνα τους για τον κόσμο κατά τη σύνδεση.

Διαβάστε τα hooks ανόδου και καθόδου του πελάτη αντί να μαντεύετε. Λίγες γραμμές shell στο /etc/openvpn/up.sh ή σε ισοδύναμο κατάλογο εξηγούν συμπεριφορά που αλλιώς φαίνεται τυχαία, και είναι επίσης το σημείο όπου μπορείτε να κάνετε τον πελάτη να συνεργάζεται αντί να ανταγωνίζεται.

Έλεγχος 4: διορθώστε το στον ιδιοκτήτη, όχι στο αρχείο

Αφού μάθετε τον ιδιοκτήτη, διαμορφώστε το DNS μέσω της διεπαφής που υποστηρίζει αυτός ο ιδιοκτήτης. Για το systemd-resolved αυτό σημαίνει ρυθμίσεις ανά ζεύξη και τομείς δρομολόγησης αντί για στατικό αρχείο· για το NetworkManager σημαίνει τις ρυθμίσεις DNS του προφίλ σύνδεσης και το επιλεγμένο backend· για μια διανομή με ενσωμάτωση resolvconf σημαίνει γραφή μέσω αυτού του βοηθού.

Μην κάνετε το αρχείο αμετάβλητο. Η ιδιότητα αμεταβλητότητας σταματά τις θεμιτές ανανεώσεις DHCP και τις ενημερώσεις VPN μαζί με εκείνες με τις οποίες παλεύατε, και αφήνει το σύστημα σε κατάσταση όπου η επόμενη αναβάθμιση πακέτου ή επανασύνδεση παράγει αστοχία που κανείς δεν μπορεί να εξηγήσει από τη διαμόρφωση. Κρύβει τη σύγκρουση ιδιοκτησίας, που είναι ακριβώς το πράγμα που προσπαθούσατε να λύσετε.

Όπου δύο στοιχεία πρέπει πραγματικά να συνυπάρχουν, δώστε τους διαφορετικές δουλειές. Αφήστε τον διαχειριστή δικτύου να κατέχει τη διαμόρφωση σε επίπεδο διεπαφής, αφήστε τον πελάτη VPN να συνεισφέρει DNS και τομείς ανά ζεύξη μέσω της ίδιας ενσωμάτωσης, και αφαιρέστε το τρίτο σενάριο που γράφει απευθείας το αρχείο. Η τεκμηρίωση του systemd-resolved περιγράφει τις λειτουργίες που υποστηρίζει και τι εκθέτει καθεμία στο /etc/resolv.conf. Επιλέξτε τη λειτουργία που ταιριάζει με το πόση πολιτική πρέπει να διατηρήσετε. Αν το split DNS έχει σημασία, η διάταξη stub με τομείς ανά ζεύξη το διατηρεί, ενώ η λειτουργία που αντιγράφει τους upstream διακομιστές στο αρχείο το ισοπεδώνει αθόρυβα.

Επαληθεύστε μετά από επανασύνδεση, όχι μετά την επεξεργασία

Ένα αρχείο που φαίνεται σωστό αμέσως μετά την αλλαγή σας δεν αποδεικνύει τίποτα, γιατί το επόμενο συμβάν δεν έχει συμβεί ακόμη. Πυροδοτήστε την ακολουθία που παλιά το έσπαγε: κατεβάστε και ανεβάστε τη σήραγγα, ανανεώστε τη μίσθωση DHCP ή εναλλάξτε τη διεπαφή, και μετά διαβάστε ξανά τις ίδιες τιμές.

resolvectl query build.corp.example
resolvectl query example.com
resolvectl status | head -40

Έπειτα επιβεβαιώστε τη διάκριση που μετράει: το εσωτερικό όνομα επιλύεται μέσω του εσωτερικού διακομιστή ενώ το δημόσιο όνομα εξακολουθεί να λειτουργεί. Μια διαμόρφωση που στέλνει τα πάντα στον εσωτερικό διακομιστή φαίνεται καλή μέχρι κάποιος να προσπαθήσει να φτάσει στο διαδίκτυο μέσω της σήραγγας, και μια διαμόρφωση που στέλνει τα πάντα στον δημόσιο διαρρέει εσωτερικά ονόματα.

Καταγράψτε τον ιδιοκτήτη, το backend και τη λειτουργία συμβολικού συνδέσμου στις σημειώσεις ανάπτυξης. Αυτή η μία παράγραφος μετατρέπει μια μελλοντική αναβάθμιση πακέτου από περιστατικό σε σημείο ελέγχου, και εμποδίζει τον επόμενο άνθρωπο να ανακαλύψει ξανά την ίδια σύγκρουση με μια εντολή chattr.

Σχετικά άρθρα