Ο πελάτης σας είναι ρυθμισμένος σε UDP, ο διακομιστής Nginx έχει μπλοκ location που δείχνει στη θύρα του VPN και δεν φτάνει τίποτα. Αυτό είναι αναμενόμενο: ένα location του HTTP δεν μπορεί να μεταφέρει ένα datagram UDP, ό,τι όνομα κι αν έχει το front end. Το Nginx χρειάζεται έναν ακροατή stream γι' αυτό, και μόλις μεταφέρετε εκεί τη διαμόρφωση, ένα δεύτερο σύνολο λεπτομερειών κρίνει αν η συνεδρία επιβιώσει.

Το επίπεδο του proxy έρχεται πριν από τη διεύθυνση

Η ενότητα stream του Nginx προωθεί TCP και UDP χωρίς να αναλύει HTTP. Η ενότητα HTTP περιμένει γραμμή αιτήματος, κεφαλίδες και απάντηση, και τίποτα από αυτά δεν υπάρχει σε ένα γνήσιο OpenVPN datagram. Η επιλογή του επιπέδου είναι επομένως η πρώτη απόφαση και είναι ανεξάρτητη από το αν ο ακροατής είναι IPv4 ή IPv6.

Μια διαμόρφωση που φαίνεται να δουλεύει με TCP OpenVPN δεν λέει τίποτα για την περίπτωση UDP. Η μεταφορά εδώ είναι μέρος του πρωτοκόλλου, όχι λεπτομέρεια της ανάπτυξης.

Ο ακροατής και το backend

nginx -V 2>&1 | tr ' ' '\n' | grep stream

stream {
    server {
        listen [::]:1194 udp reuseport;
        proxy_pass [2001:db8::20]:1194;
    }
}

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

Και οι δύο διαδρομές και τα δύο τείχη προστασίας πρέπει να επιτρέπουν τα datagrams: η διαδρομή προς τον ακροατή και η διαδρομή από το proxy προς το backend. Ένας ακροατής IPv6 επίσης δεν δημιουργεί διαδρομή IPv4, οπότε αν κάποιοι πελάτες χρησιμοποιούν ακόμη IPv4, αυτός ο ακροατής είναι ξεχωριστή καταχώριση με τη δική της δοκιμή. Ελέγξτε το τείχος προστασίας του ίδιου του backend από τη διεύθυνση του proxy, όχι από το φορητό σας.

Τα χρονικά όρια συνεδρίας δεν είναι χρονικά όρια αιτήματος

Το proxy stream κρατά κατάσταση για μια συνεδρία UDP και την απορρίπτει σύμφωνα με το χρονικό όριο και τις ρυθμίσεις απόκρισης. Ένα σύντομο χρονικό όριο αντιγραμμένο από relay DNS ταιριάζει άσχημα σε ένα VPN που περιμένει να ανταλλάσσει datagrams για ώρες, και η αποτυχία εμφανίζεται ως σύνδεση που πεθαίνει ήσυχα και όχι ως μία που αρνείται να ξεκινήσει.

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

Τι αλλάζει το relay και τι όχι

Το proxy stream δεν τερματίζει το κανάλι ελέγχου TLS του OpenVPN ούτε το μετατρέπει σε HTTPS. Το backend παραμένει η υπηρεσία VPN και η σχέση πιστοποιητικού παραμένει μεταξύ του πελάτη και αυτής της υπηρεσίας. Η διατήρηση της προβλεπόμενης ταυτότητας του backend παραμένει δουλειά του πελάτη και του διακομιστή.

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

Επαληθεύστε από τον πελάτη, όχι από τη θύρα

Ένας τοπικός έλεγχος ότι η θύρα UDP είναι ανοιχτή αποδεικνύει ότι ο ακροατής υπάρχει. Δεν αποδεικνύει ότι ένας πελάτης μπορεί να ταυτοποιηθεί μέσω αυτού ή να συνεχίσει να ανταλλάσσει κίνηση. Ολοκληρώστε μια πραγματική σύνδεση από εγκεκριμένο πελάτη και μετά επιβεβαιώστε ότι η συνεδρία μένει ανοιχτή αρκετά ώστε να έχει σημασία.

Όταν κάποιος αναφέρει ότι το Nginx δεν μπορεί να κάνει UDP επειδή ένα απλό εργαλείο relay δούλεψε αντί γι' αυτό, τα δύο γεγονότα δεν σχετίζονται. Το εργαλείο απέδειξε ότι το backend απαντά· δεν είπε τίποτα για το τι υποστηρίζει το front end. Και τα δύο μπορεί να ισχύουν, και μόνο το ένα από αυτά είναι διαμόρφωση για αυτή την ανάπτυξη.

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