Το ping με διεύθυνση λειτουργεί μέσα στη διανομή, οι εγκαταστάσεις πακέτων και τα git fetches όχι, και η αστοχία εμφανίστηκε αμέσως μετά την ανάδυση της σήραγγας. Μόνο τα ονόματα σταμάτησαν να επιλύονται, κάτι που δείχνει DNS και όχι συνδεσιμότητα. Η επανεγκατάσταση πακέτων είναι η πιο δημοφιλής λάθος πρώτη κίνηση εδώ. Το WSL2 έχει δύο ανεξάρτητους τρόπους να παραγάγει ακριβώς αυτό το σύμπτωμα, και χρειάζονται διαφορετικές επισκευές.

Γιατί η διανομή κρατά δικό της resolver

Ο πελάτης DNS των Windows δεν χρησιμοποιείται μέσα στη διανομή. Το WSL2 χτίζει δικό του αρχείο resolver κατά την εκκίνηση, δείχνοντας σε μια διεύθυνση stub που δημοσιεύει τα Windows στον εικονικό διακόπτη για την βοηθητική εικονική μηχανή.

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

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

Συλλέξτε πρώτα στοιχεία και από τις δύο πλευρές

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

Μέσα στη διανομή, εκτυπώστε το αρχείο resolver, τον πίνακα δρομολόγησης και μία εσωτερική και μία δημόσια αναζήτηση:

ip -4 route
cat /etc/resolv.conf
getent hosts intranet.corp.example
getent hosts example.com

Στα Windows, καταγράψτε τους διακομιστές DNS ανά προσαρμογέα και τον πίνακα IPv4 με μετρικές. Ένας πελάτης VPN εγκαθιστά συνήθως διαδρομή για το υποδίκτυο του WSL2, και η μετρική της αποφασίζει αν αυτή η κίνηση φεύγει από τη σήραγγα ή μένει τοπική.

Get-NetAdapter | Get-DnsClientServerAddress
route print -4

Μετρική διαδρομής ή παλιό αρχείο

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

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

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

Για την περίπτωση δρομολόγησης, αφαιρέστε την αυτόματη μετρική από τον προσαρμογέα της σήραγγας και δώστε του αριθμό πάνω από τη διαδρομή ζεύξης του WSL2:

Get-NetAdapter | Where-Object InterfaceDescription -Match VPN | Set-NetIPInterface -InterfaceMetric 5500
wsl.exe --shutdown

Το τερμάτισμα μετράει. Η αλλαγή μετρικής δεν ξαναγράφει τη βοηθητική εικονική μηχανή που τρέχει, οπότε η διανομή πρέπει να ξαναχτιστεί πριν γίνει ορατή η αλλαγή.

Πάρτε το αρχείο, σκόπιμα

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

Δημιουργήστε το /etc/wsl.conf μέσα στη διανομή με την ενότητα δικτύου που απενεργοποιεί τη δημιουργία, και μετά γράψτε το αρχείο resolver μόνοι σας, πρώτα τον εταιρικό διακομιστή και μετά μια δημόσια εφεδρική διεύθυνση:

[network]
generateResolvConf = false
search corp.example
nameserver 10.88.4.53
nameserver 9.9.9.9

Η σειρά μετράει. Ένας δημόσιος resolver δεν μπορεί να απαντήσει σε εσωτερικό όνομα, και το εφεδρικό υπάρχει μόνο για αναζητήσεις στο διαδίκτυο. Μόλις το αρχείο γίνει δικό σας, τίποτα δεν το αναπαράγει, οπότε ένας εταιρικός resolver που μετακομίζει γίνεται διακοπή που πρέπει να προσέξετε μόνοι σας.

Ελέγξτε ονόματα, μετά πακέτα

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

Αν αυτοματοποιείτε την επανεγγραφή, κάντε την ασφαλή για επανάληψη: χωρίς σήραγγα, κρατήστε το αρχείο που υπάρχει ήδη αντί να γράψετε κενή λίστα διακομιστών.

getent hosts intranet.corp.example
resolvectl status | head -20
getent hosts example.com

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

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