Hook client-connect του OpenVPN: πού πηγαίνει πραγματικά η διεύθυνσή σας
Ένα σενάριο client-connect δεν μπορεί να επιστρέψει διεύθυνση εκτυπώνοντάς την. Δείτε πώς το προσωρινό αρχείο του hook, η κατάσταση εξόδου και η τοπολογία καθορίζουν τη διεύθυνση IP του πελάτη.
Η επιστροφή μιας διεύθυνσης από ένα σενάριο client-connect μοιάζει να πρέπει να ορίζει τη διεύθυνση IP του πελάτη. Δεν το κάνει: το μόνο κανάλι του hook προς τον διακομιστή είναι ένα προσωρινό αρχείο του οποίου η διαδρομή φτάνει ως τελευταίο όρισμα του σεναρίου, και η διεύθυνση πρέπει να γραφτεί εκεί με σύνταξη ifconfig-push. Ένα σενάριο που εκτυπώνει τη διεύθυνση ή εξέρχεται με μηδέν χωρίς να γράψει τίποτα παράγει έναν συνδεδεμένο πελάτη με διεύθυνση από τη δεξαμενή, και το αρχείο καταγραφής του διακομιστή φαίνεται απολύτως υγιές.
Η σύγχυση είναι λογική, επειδή αρκετά άλλα hook απαντούν πράγματι μέσω κωδικών εξόδου ή μεταβλητών περιβάλλοντος. Αυτό έχει το δικό του συμβόλαιο, και το συμβόλαιο αρχίζει με ένα όνομα αρχείου.
Το hook γράφει αρχείο, όχι τιμή επιστροφής
Η δήλωση είναι δύο γραμμές: script-security 2 για να επιτραπεί η κλήση, έπειτα client-connect /etc/openvpn/server/assign-address.sh. Όταν ένας πελάτης αυθεντικοποιείται, ο διακομιστής εκτελεί αυτό το σενάριο με τη διαδρομή του παραγόμενου αρχείου προσαρτημένη ως τελευταίο όρισμα, το οποίο είναι $1 μόνο αν η δήλωση δεν περνά δικά της πρόσθετα ορίσματα. Ό,τι εφαρμόζεται σε αυτόν τον πελάτη πηγαίνει σε εκείνο το αρχείο ως συνηθισμένες οδηγίες, μία ανά γραμμή, ακριβώς όπως θα εμφανίζονταν σε μια διαμόρφωση. Ένα περιτύλιγμα που προσθέτει τις δικές του παραμέτρους μετατοπίζει τη θέση, και το κλασικό σύμπτωμα είναι ένα σενάριο που γράφει σε διαδρομή που μοιάζει με --verbose.
Η κατάσταση εξόδου είναι το άλλο μισό του συμβολαίου. Μηδέν σημαίνει αποδοχή και ανάγνωση του αρχείου· οτιδήποτε άλλο απορρίπτει τη σύνδεση, και έτσι μια μη αντιστοιχισμένη ταυτότητα απορρίπτεται αντί να πέφτει ήσυχα πίσω στη δεξαμενή. Γράψτε την πλήρη οδηγία πριν επιστρέψετε επιτυχία, ώστε ένα μισογραμμένο αρχείο να μην γίνει ποτέ διαμόρφωση πελάτη.
Δύο οδηγίες αξίζουν προσοχή επειδή αλληλεπιδρούν με όλα τα άλλα. Το ifconfig-push καθορίζει τη διεύθυνση, ενώ ένα route που ωθείται λέει στον πελάτη τι είναι προσβάσιμο μέσω της σήραγγας· επιστρέψτε το πρώτο και ξεχάστε το δεύτερο και παίρνετε πελάτη με διεύθυνση και πουθενά να πάει. Η σειρά μέσα στο αρχείο δεν έχει σημασία, η πληρότητα όμως έχει. Ένα hook που ωθεί διαδρομή για πρόθεμα που κανένας ομότιμος δεν μπορεί να φτάσει είναι το ίδιο λάθος ιδωμένο από την άλλη άκρη.
Οι είσοδοι φτάνουν μέσω μεταβλητών περιβάλλοντος: common_name, trusted_ip, ifconfig_pool_remote_ip και τα υπόλοιπα. Αντιμετωπίστε τα όλα ως συμβολοσειρές από έξω από τον διακομιστή, ποτέ ως τμήματα κελύφους.
Η αντιστοίχιση διευθύνσεων είναι πολιτική, όχι αριθμητική
Μια δελεαστική συντόμευση είναι να αναλύσετε το όνομα του πιστοποιητικού και να χρησιμοποιήσετε τα ψηφία του ως τελευταίο οκτέτο. Αυτό δεν είναι κατανεμητής, και αποτυγχάνει με συνηθισμένους τρόπους: δύο ονόματα με το ίδιο επίθημα συγκρούονται, ένα όνομα που τελειώνει σε 300 δεν είναι διεύθυνση, και ένα πιστοποιητικό που μετονομάζει ένας διαχειριστής μετακινεί ήσυχα μια συσκευή. Επικυρώστε τη συμμετοχή στο υποδίκτυο, το εύρος φιλοξενούντων που μπορεί να χρησιμοποιηθεί, τις δεσμευμένες διευθύνσεις και τη μοναδικότητα σε κάθε κλήση, και κρατήστε την αντιστοίχιση σε πίνακα που μπορεί να διαβάσει άνθρωπος.
Όποιος ελέγχει το όνομα ελέγχει τη διεύθυνση, οπότε αποφασίστε τι πραγματικά αντιπροσωπεύει το common_name σε αυτή την ανάπτυξη. Με ενεργοποιημένο το username-as-common-name, η ταυτότητα είναι η σύνδεση και όχι το υποκείμενο του πιστοποιητικού. Ποτέ μην περνάτε αυτή την τιμή σε αξιολόγηση κελύφους, και ποτέ μην αφήνετε τον πελάτη να επηρεάσει διαδρομή αρχείου.
Ένας κατανεμητής που βασίζεται σε μητρώο πρέπει να αντέχει τη συγχρονικότητα. Δεσμεύστε τη διεύθυνση ατομικά, χειριστείτε μια αποτυχημένη εγγραφή χωρίς να δεχτείτε πελάτη μισοδιαμορφωμένο, και σημάνετε κάθε εκχώρηση με τη σύνδεση που την κατέχει, ώστε μια καθυστερημένη αποσύνδεση παλαιότερης συνεδρίας να μην μπορεί να ελευθερώσει διεύθυνση που κρατά ήδη μια νεότερη. Πολλαπλές παρουσίες διακομιστή που μοιράζονται μία δεξαμενή κάνουν αυτή την απαίτηση πιο αιχμηρή παρά προαιρετική.
Η τοπολογία καθορίζει τι σημαίνει ifconfig-push
Με topology subnet στο 10.77.0.0/24, το ifconfig-push 10.77.0.20 255.255.255.0 είναι μια διεύθυνση συν τη μάσκα δικτύου της. Υπό topology net30 το δεύτερο όρισμα δεν είναι καθόλου μάσκα αλλά η διεύθυνση του ομοτίμου, οπότε η αντιγραφή της μορφής υποδικτύου σε διακομιστή net30 σας δίνει πελάτη που συνδέεται και δεν μπορεί να περάσει κίνηση. Αλλάξτε την τοπολογία σκόπιμα, ποτέ για να φαίνεται συνεπές ένα παράδειγμα. Ένας διακομιστής που ήδη εκτελεί net30 έχει ζωντανούς πελάτες στην παλιά διευθυνσιοδότηση, οπότε η αλλαγή είναι μετεγκατάσταση με παράθυρο συντήρησης, όχι επεξεργασία μιας γραμμής.
Οι στατικές διευθύνσεις πρέπει να βρίσκονται έξω από τη δυναμική δεξαμενή και έξω από κάθε άλλη στατική εκχώρηση, συμπεριλαμβανομένων εκείνων που δίνουν τα συνηθισμένα αρχεία client-config-dir. Αν δύο μηχανισμοί μπορούν να παράγουν την ίδια διεύθυνση για διαφορετικούς πελάτες, ένας από αυτούς τελικά θα το κάνει.
Δοκιμάστε τέσσερις περιπτώσεις πριν το εμπιστευτείτε
Εκτελέστε τους ίδιους ελέγχους σε μια αντιστοιχισμένη ταυτότητα, μια μη αντιστοιχισμένη, μια επανασύνδεση και μια προσομοιωμένη αποτυχία μητρώου. Το openvpn --config client.ovpn --verb 4 δείχνει τη διεύθυνση που εκχωρήθηκε στην απάντηση push, και στον διακομιστή το grep -A2 PUSH_REPLY /var/log/openvpn/openvpn.log επιβεβαιώνει τι στάλθηκε πραγματικά. Για τη μη αντιστοιχισμένη ταυτότητα το αναμενόμενο αποτέλεσμα είναι απόρριψη σύνδεσης, όχι διεύθυνση από τη δεξαμενή.
Στη συνέχεια εξετάστε τον κατάλογο στον οποίο ο δαίμονας γράφει αυτά τα προσωρινά αρχεία. Το σενάριο εκτελείται στο υποβαθμισμένο περιβάλλον υπηρεσίας, οπότε μια διαδρομή εγγράψιμη από το root αλλά όχι από τον δαίμονα μετατρέπει κάθε σύνδεση σε απόρριψη με σφάλμα άδειας θαμμένο αρκετές γραμμές πιο κάτω στο αρχείο καταγραφής.
Η εκχώρηση δεν είναι εξουσιοδότηση: μια καρφιτσωμένη διεύθυνση εξακολουθεί να μην παρέχει πρόσβαση σε κάθε προορισμό πίσω από τον διακομιστή. Κρατήστε την πολιτική δρομολόγησης και τείχους προστασίας στο δικό της επίπεδο, και επαληθεύστε την έναντι της διεύθυνσης που μόλις καθορίσατε.