Hairpin NAT: γιατί το τελικό σημείο VPN αποτυγχάνει από μέσα
Ένας τοπικός πελάτης που χρησιμοποιεί τη δημόσια διεύθυνση φεύγει από το LAN και επιστρέφει μέσα. Όταν ο δρομολογητής δεν κάνει hairpin, έξω δουλεύει και μέσα όχι.
Ένας διακομιστής VPN που απαντά από κινητό δίκτυο και αποτυγχάνει από τον καναπέ συνήθως δεν είναι πρόβλημα πιστοποιητικού. Ο πελάτης μέσα στο LAN ζητά από τον δρομολογητή να μεταφράσει ένα πακέτο του οποίου ο προορισμός είναι η δημόσια διεύθυνση του ίδιου του δρομολογητή, που σημαίνει ότι το πακέτο πρέπει να βγει και να επιστρέψει αμέσως μέσα. Αυτός ο ελιγμός λέγεται hairpinning, και πολλοί δρομολογητές είτε δεν τον υλοποιούν είτε τον ενεργοποιούν μόνο με τσεκαρισμένο πλαίσιο. Το ότι περνά η δοκιμή από έξω είναι αυτό που μπερδεύει, γιατί αποδεικνύει ότι ο ακροατής και ο κανόνας προώθησης είναι εντάξει.
Το πακέτο βγαίνει και ξαναμπαίνει
Ακολουθήστε το πακέτο. Ο πελάτης επιλύει το δημόσιο όνομα, συνδέεται στη δημόσια διεύθυνση, και το NAT προορισμού του δρομολογητή ξαναγράφει τον προορισμό προς τον εσωτερικό διακομιστή. Η απάντηση του διακομιστή απευθύνεται στη διεύθυνση LAN του πελάτη, οπότε επιστρέφει μέσω της διεπαφής LAN του δρομολογητή χωρίς ποτέ να περάσει από τον κανόνα NAT που θα είχε επαναφέρει την πηγή.
Τώρα ο πελάτης λαμβάνει πακέτο από διεύθυνση στην οποία δεν έστειλε ποτέ τίποτα και το απορρίπτει. Αυτή η ασυμμετρία είναι όλη η βλάβη.
Το RFC 4787 περιγράφει τη συμπεριφορά που αναμένεται από ένα NAT σε αυτή την περίπτωση, και η σύντομη εκδοχή είναι ότι στην πράξη είναι προαιρετική ακόμη και εκεί όπου ορίζεται θεωρητικά. Μερικοί δρομολογητές ονομάζουν τη ρύθμιση NAT loopback, άλλοι hairpin NAT ή NAT reflection, και μερικοί δεν εκθέτουν τίποτα. Ένας δρομολογητής που δεν το έχει δεν είναι λανθασμένα ρυθμισμένος· κάνει το συνηθισμένο και η διόρθωση ανήκει αλλού. Μη συμπεράνετε από μια αποτυχημένη τοπική δοκιμή ότι ο δημόσιος κανόνας προώθησης είναι λάθος.
Έλεγχος 1: δοκιμάστε τις δύο διαδρομές χωριστά
Από έξω από το LAN, συνδεθείτε με το ίδιο προφίλ που θα χρησιμοποιούσε πραγματικός χρήστης και επιβεβαιώστε ότι η συνεδρία εγκαθίσταται. Από μέσα, συνδεθείτε στη δημόσια διεύθυνση με το ίδιο προφίλ και καταγράψτε το ακριβές σφάλμα και την ώρα.
Μια ακριβής τοπική δοκιμή κρατά το όνομα κεντρικού υπολογιστή και αντικαθιστά μόνο τη διεύθυνση: curl -v --resolve vpn.example.com:443:203.0.113.10 https://vpn.example.com/ στέλνει το αίτημα στη δημόσια διεύθυνση ενώ παρουσιάζει ακόμη το σωστό όνομα διακομιστή. Αυτό χωρίζει ένα πρόβλημα επίλυσης ονομάτων από ένα πρόβλημα μετάφρασης, που εύκολα συγχέονται όταν το ίδιο όνομα δουλεύει από ένα καφέ. Σημειώστε αν ο πελάτης αποτυγχάνει στη σύνδεση TCP ή αργότερα στο TLS, γιατί το πρώτο δείχνει μετάφραση και το δεύτερο ταυτότητα.
Έλεγχος 2: διαβάστε τι βλέπει ο διακομιστής
Η πιο χρήσιμη παρατήρηση είναι η οπτική του διακομιστή. Εκτελέστε καταγραφή στον κεντρικό υπολογιστή VPN με φίλτρο στη διεύθυνση LAN του πελάτη και στη διεύθυνση LAN του δρομολογητή, και επαναλάβετε την τοπική απόπειρα. Αν δεν φτάσει τίποτα, το πακέτο δεν επέζησε της μετάφρασης.
Αν μια σύνδεση φτάνει από τη διεύθυνση LAN του δρομολογητή αντί για του πελάτη, το hairpinning συμβαίνει και η πηγή ξαναγράφηκε. Αυτή είναι λειτουργική διαμόρφωση, όχι βλάβη.
Έλεγχος 3: διορθώστε το χωρίς να αγγίξετε την εξωτερική διαδρομή
Υπάρχουν τρεις υποστηριζόμενες μορφές, σε αύξουσα σειρά εύρους επιπτώσεων. Η στενότερη είναι το διαχωρισμένο DNS: δημοσιεύστε μια εσωτερική εγγραφή ώστε το ίδιο όνομα διακομιστή να επιλύεται στην εσωτερική διεύθυνση για τους πελάτες στο LAN, κάτι που αποφεύγει εντελώς τη δημόσια διαδρομή. Η επόμενη είναι να ενεργοποιήσετε την τεκμηριωμένη επιλογή loopback ή reflection του δρομολογητή, αν υπάρχει, και να την εφαρμόσετε μόνο σε αυτή την υπηρεσία. Η ευρύτερη είναι ένας κανόνας source-NAT στον δρομολογητή που ξαναγράφει την κίνηση από το LAN προς τον διακομιστή ώστε η απάντηση να επιστρέφει μέσω του δρομολογητή· σε δρομολογητή Linux είναι κανόνας MASQUERADE στο POSTROUTING που ταιριάζει με τη διεύθυνση και τη θύρα του διακομιστή. Και οι τρεις αφήνουν ανέπαφη την εξωτερική διαδρομή, και αυτή είναι η ιδιότητα που πρέπει να διατηρηθεί.
Μην επεκτείνετε άσχετη προώθηση θυρών για να μοιάζει η τοπική διαδρομή με την εξωτερική, και μη μετακινήσετε την υπηρεσία σε άλλη θύρα για να αποφύγετε το πρόβλημα. Και οι δύο αλλαγές μεταβάλλουν τι μπορεί να προσεγγίσει ο εξωτερικός κόσμος για να διορθώσουν κάτι που βλέπει μόνο ο εσωτερικός.
Το διαχωρισμένο DNS έχει μια παγίδα που αξίζει να αναφερθεί. Η αντικατάσταση ενός ονόματος κεντρικού υπολογιστή με αυθαίρετη IP αλλάζει τι επικυρώνει ο πελάτης, οπότε η εσωτερική εγγραφή πρέπει να ταιριάζει ακόμη με το όνομα στο πιστοποιητικό.
Έλεγχος 4: επαληθεύστε και τις δύο διαδρομές μετά
Επαναλάβετε την εξωτερική απόπειρα από έξω από το LAN, επαναλάβετε την εσωτερική με το ίδιο προφίλ, και επιβεβαιώστε ότι το αρχείο καταγραφής του διακομιστή δείχνει δύο ξεχωριστές επιτυχημένες συνεδρίες και όχι μία επιτυχία και μία σιωπή. Έπειτα ελέγξτε ότι άλλοι πελάτες φτάνουν ακόμη στον ακροατή και ότι οι διαδρομές προς ιδιωτικούς πόρους δεν άλλαξαν.
Κρατήστε το αρχείο σύντομο: ποια διεύθυνση χρησιμοποίησε κάθε πελάτης, τι είδε ο διακομιστής και ποια από τις τρεις διορθώσεις εφαρμόστηκε. Οι απαιτήσεις hairpinning του RFC 4787 είναι η αναφορά για το τι αναμένεται από ένα NAT εδώ, και εξηγούν γιατί ένας δρομολογητής χωρίς τη λειτουργία συμπεριφέρεται κανονικά. Μια τοπική αποτυχία που ο εξωτερικός κόσμος δεν μπορεί να αναπαράγει είναι ζήτημα μετάφρασης μέχρι να αποδειχθεί το αντίθετο, οπότε δοκιμάστε την ως τέτοια.