Το VPN συνδέεται, και τρία άσχετα εργαλεία αποτυγχάνουν με τρεις διαφορετικούς τρόπους το ίδιο απόγευμα. Το mitmproxy σταματά να βλέπει αιτήματα, το Chrome αρνείται τον αποσφαλματωτή, και το Gradle πετά BindException κατά τη δέσμευση μιας τοπικής υποδοχής. Η κοινή υποψία είναι ότι η σήραγγα μπλοκάρει το localhost. Δεν μπορεί: 127.0.0.1 επεξεργάζεται μέσα στον πυρήνα και δεν φτάνει ποτέ σε προσαρμογέα, πόσο μάλλον σε πύλη.

Τρία επίπεδα, τρεις διαφορετικές βλάβες

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

SymptomLayerFirst check
Proxy sees no trafficLocal proxy or listenerss -lntp, or netstat -ano on Windows
TLS error in one tool onlyTrust storeWhich CA bundle does that runtime read?
Local bind or connect refusedPacket filter or port ownerWho holds the port, and what rule drops it?

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

Ξεκινήστε από τον ακροατή, όχι από τη σήραγγα

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

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

Το επίπεδο του διαμεσολαβητή: το περιβάλλον δεν είναι ρύθμιση

Πολλοί εταιρικοί πελάτες τρέχουν έναν διαμεσολαβητή HTTP και περιμένουν οι εφαρμογές να τον χρησιμοποιούν. Η ρύθμιση του HTTPS_PROXY σε ένα κέλυφος διορθώνει εργαλεία γραμμής εντολών που το σέβονται, και δεν κάνει τίποτα για ένα εργαλείο που διαβάζει το δικό του αρχείο ρυθμίσεων. Τα Gradle, Selenium και gRPC συμβουλεύονται το καθένα τη δική του διαμόρφωση, και ένας διαμεσολαβητής που εξάγεται σε ένα τερματικό είναι αόρατος σε έναν δαίμονα που ξεκινά το IDE.

Τα εργαλεία κοντέινερ είναι το συνηθισμένο σημείο όπου αυτό γίνεται ορατό. Το loopback ενός κοντέινερ είναι δικό του, οπότε 127.0.0.1 μέσα στο κοντέινερ δεν σημαίνει ποτέ τον διαμεσολαβητή του κεντρικού υπολογιστή· απαιτείται η διεύθυνση του κεντρικού ή ρύθμιση δικτύου κεντρικού. Μια διόρθωση που λειτουργεί στο κέλυφος και αποτυγχάνει στην κατασκευή είναι συνήθως αυτή η σειρά, όχι η σήραγγα.

Το επίπεδο εμπιστοσύνης: το εργαλείο διαβάζει άλλη αποθήκη

Η υποκλοπή είναι η δεύτερη αλλαγή και παράγει τα πιο παραπλανητικά σφάλματα. Ο πελάτης παρουσιάζει το δικό του πιστοποιητικό για τις επιθεωρούμενες συνδέσεις, οπότε ένας περιηγητής που εμπιστεύεται τη ρίζα της εταιρείας πετυχαίνει, ενώ ένα εργαλείο με ενσωματωμένη αποθήκη CA αποτυγχάνει. Τα requests της Python μέσω certifi είναι η κλασική περίπτωση: η αποθήκη του λειτουργικού συστήματος μπορεί να είναι σωστή και το αίτημα να αποτυγχάνει παρόλα αυτά, επειδή αυτό το περιβάλλον εκτέλεσης δεν τη διαβάζει ποτέ. Το κείμενο του σφάλματος σπάνια αναφέρει υποκλοπή, γι' αυτό αυτή η σειρά διαγιγνώσκεται λανθασμένα ως χαλασμένο τελικό σημείο.

Συγκρίνετε τι παρουσιάζει πραγματικά το τελικό σημείο με το τι επικύρωσε το εργαλείο. openssl s_client δείχνει την αλυσίδα που έστειλε ο διακομιστής· η δική του έξοδος επικύρωσης του εργαλείου δείχνει τι αποφάσισε. Όταν διαφωνούν, REQUESTS_CA_BUNDLE ή SSL_CERT_FILE είναι ο μοχλός για αυτό το περιβάλλον εκτέλεσης, και η ρίζα της εταιρείας ανήκει στην αποθήκη που διαβάζει αυτό το περιβάλλον, όχι σε μια καθολική τοποθεσία που σέβονται μόνο μερικά εργαλεία.

Μια αλλαγή έκδοσης που διορθώνει ένα σφάλμα SSL είναι απόδειξη για την πολιτική εμπιστοσύνης και κρυπτογράφησης, όχι για το VPN. Μια υποβάθμιση της Python που κάνει έναν πελάτη SOAP να λειτουργεί άλλαξε την ενσωματωμένη αποθήκη CA και τις προεπιλεγμένες ρυθμίσεις TLS· η διαδρομή δικτύου δεν μετακινήθηκε.

Το επίπεδο του φίλτρου: μπορεί να απορρίψει και το loopback

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

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

Η θύρα αποσφαλμάτωσης του Chrome αποτυγχάνει στην ίδια οικογένεια. Ο περιηγητής ξεκινά, ο οδηγός δεν μπορεί να φτάσει στο τελικό σημείο DevTools, και το μήνυμα ονομάζει το DevTools αντί για το δίκτυο. Πρόσθετες σημαίες εκκίνησης και ένας περιττός διαχειριστής οδηγών αλλάζουν ποια διεργασία κατέχει τη θύρα, γι' αυτό η αφαίρεσή τους μερικές φορές φαίνεται να διορθώνει το VPN.

Επισκευάστε το επίπεδο που απέτυχε

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

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

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