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

Δύο διαδρομές που μοιάζουν στη διαμόρφωση

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

GET /app        client -> proxy
302 Location    proxy  -> client   (http://10.40.0.20:8080/)
GET /app        client -> 10.40.0.20:8080   client network, no route

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

GET /app        client -> proxy
GET /app        proxy  -> 10.40.0.20:8080   over the VPN
response        proxy  -> client

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

Τι χρειάζεται το πρόγραμμα περιήγησης και τι δεν του δίνει το VPN του διακομιστή

Το αίτημα του ίδιου του προγράμματος περιήγησης χρειάζεται τέσσερα πράγματα που μπορεί να μην έχει: μια απάντηση DNS για το ιδιωτικό όνομα, μια διαδρομή προς αυτή τη διεύθυνση, άδεια πρόσβασης στην υπηρεσία που ακούει και εμπιστοσύνη στο πιστοποιητικό που παρουσιάζει αυτή η υπηρεσία. Ο κεντρικός υπολογιστής του proxy έχει και τα τέσσερα μέσω της σήραγγάς του. Κανένα από αυτά δεν μεταφέρεται σε έναν πελάτη που δεν βρέθηκε ποτέ σε αυτή τη σήραγγα, γιατί η σήραγγα είναι ιδιότητα του κεντρικού υπολογιστή, όχι της διεύθυνσης URL.

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

Όταν μόνο το proxy μπορεί να φτάσει την εφαρμογή

Αφαιρέστε την ενέργεια ανακατεύθυνσης και στείλτε αυτά τα αιτήματα σε ένα backend που δείχνει στην ιδιωτική διεύθυνση. Το frontend διατηρεί το δημόσιο όνομά του ενώ το backend αποφασίζει πού πηγαίνει πραγματικά το αίτημα. Τίποτα δεν αλλάζει στη διαδρομή του πελάτη, γιατί το proxy σταματά να περιγράφει έναν προορισμό και αρχίζει να είναι ένας. Για μια εφαρμογή που ακούει σκόπιμα στην εσωτερική θύρα 8080, το μπλοκ του διακομιστή είναι σύντομο:

backend private_app
    mode http
    option httpchk GET /health
    server app1 10.40.0.20:8080 check

Διαβάστε αυτό το μπλοκ ως δήλωση για τον πίνακα δρομολόγησης του proxy: το 10.40.0.20 πρέπει να είναι προσβάσιμο από τον ίδιο τον κεντρικό υπολογιστή του proxy, που εδώ σημαίνει μέσω της διεπαφής VPN και όχι μέσω της προεπιλεγμένης διαδρομής. Η λέξη-κλειδί check αναφέρει μόνο τι κάνει αυτή η διαδρομή, και η διαδρομή υγείας πρέπει να υπάρχει στην εφαρμογή, αλλιώς κάθε έλεγχος σημαδεύει τον διακομιστή ως εκτός λειτουργίας. Ένας επιτυχής έλεγχος δεν αποδεικνύει τίποτα για τον πελάτη και δεν αντικαθιστά την πολιτική που αποφασίζει ποιος μπορεί να χρησιμοποιήσει το backend.

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

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

Οι ανακατευθύνσεις της ίδιας της εφαρμογής δείχνουν ακόμη προς τα μέσα

Η προώθηση του πρώτου αιτήματος είναι μόνο το μισό της ενσωμάτωσης. Η εφαρμογή μπορεί να εκπέμπει απόλυτες ανακατευθύνσεις, σκληρά κωδικοποιημένες διευθύνσεις URL πόρων ή cookies περιορισμένα στο όνομα που γνωρίζει εσωτερικά, και καθένα από αυτά στέλνει το πρόγραμμα περιήγησης πίσω σε μια διεύθυνση που δεν μπορεί να φτάσει. Μια κεφαλίδα Location που δείχνει στο εσωτερικό όνομα μοιάζει πανομοιότυπη με το αρχικό πρόβλημα, γι' αυτό διαγιγνώσκεται λανθασμένα ως βλάβη του proxy.

Ορίστε την τεκμηριωμένη εξωτερική διεύθυνση URL της εφαρμογής και τις επιλογές proxy της, μετά κάντε την κεφαλίδα Host να συμφωνεί με τον εικονικό κεντρικό υπολογιστή και τις προσδοκίες του πιστοποιητικού. Ένα cookie περιορισμένο στο εσωτερικό όνομα δεν θα επιστρέψει μέσω του δημόσιου ονόματος, και ο βρόχος σύνδεσης που ακολουθεί διαβάζεται ως σφάλμα πιστοποίησης. Αλλάξτε πρώτα την εξωτερική διεύθυνση URL, δοκιμάστε ξανά από καθαρό προφίλ προγράμματος περιήγησης, και περιμένετε ότι ρυθμίσεις μισομεταναστευμένες θα παράγουν σύνδεση που πετυχαίνει και συνεδρία που πεθαίνει αμέσως.

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

Αποφασίστε ποιο σχέδιο έχετε πραγματικά

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

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

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

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

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