Το client-config-dir αγνοείται αφού το OpenVPN έγινε υπηρεσία
Ένα σχετικό client-config-dir επιλύεται ως προς τον κατάλογο εργασίας του δαίμονα. Διάβασε τη μονάδα, έλεγξε τις άδειες της διαδρομής και μετά επιβεβαίωσε την αναζήτηση στο αρχείο καταγραφής.
Η σήραγγα σηκώνεται και ο πελάτης συνδέεται, αλλά η σταθερή διεύθυνση και οι δρομολογήσεις που όρισες για αυτόν τον έναν χρήστη λείπουν. Το αρχείο καταγραφής δεν λέει “file not found”, και αυτό ακριβώς στέλνει τους ανθρώπους να ξαναφτιάξουν πιστοποιητικά. Στις περισσότερες από αυτές τις περιπτώσεις ο δαίμονας τρέχει από διαφορετικό κατάλογο από το κέλυφος όπου δοκίμασες, και client-config-dir δεν επιλύθηκε ποτέ όπως υπέθεσες. Η διόρθωση είναι διόρθωση διαδρομής, όχι επαναφορά διαπιστευτηρίων.
Διάβασε τη μονάδα πριν αγγίξεις τη διαμόρφωση
Ξεκίνα από τη διεργασία που τρέχει πραγματικά, όχι από το αρχείο που επεξεργάστηκες. Ρώτησε το systemd για τη γραμμή εκτέλεσης, τον κατάλογο εργασίας και τον λογαριασμό στον οποίο υποβιβάζεται. Αυτές οι τρεις απαντήσεις εξηγούν τις περισσότερες αποτυχίες αυτής της κατηγορίας:
systemctl show openvpn-server@server -p ExecStart -p WorkingDirectory -p User -p RootDirectoryΈνα κενό WorkingDirectory σημαίνει ότι η μονάδα ξεκινά στον /, άρα ένα σχετικό client-config-dir ccd αναζητείται στο /ccd. Αυτός ο κατάλογος σχεδόν ποτέ δεν υπάρχει, και ο δαίμονας δεν θεωρεί την απουσία του μοιραία.
Σύγκρινε το με την αλληλεπιδραστική εκκίνηση που χρησιμοποίησες κατά τη δοκιμή, όπου ο τρέχων κατάλογος του κελύφους σου ήταν πιθανότατα ο κατάλογος διαμόρφωσης. Ίδιο αρχείο, ίδιες λέξεις-κλειδιά, δύο διαφορετικά αποτελέσματα.
Ως προς τι επιλύεται μια σχετική διαδρομή
Η λέξη-κλειδί επιλύεται ως προς τον κατάλογο εργασίας της διεργασίας τη στιγμή που χρησιμοποιείται η επιλογή. Δεν σημαίνει “δίπλα στο αρχείο διαμόρφωσης που πέρασα με --config”. Το OpenVPN θα διαβάσει ευχαρίστως μια διαμόρφωση από απόλυτη διαδρομή και θα επιλύσει πάλι τις σχετικές τιμές αλλού, και αυτή είναι ακριβώς η παγίδα εδώ. Το εγχειρίδιο του OpenVPN 2.6 διατυπώνει τον κανόνα στο --client-config-dir και ξανά στο --cd.
Η λέξη-κλειδί cd αλλάζει αυτό το πλαίσιο πριν διαβαστούν άλλα αρχεία, οπότε μια μονάδα που ορίζει cd /etc/openvpn/server και μετά client-config-dir ccd επιλύεται στο /etc/openvpn/server/ccd. Αν προσθέσεις cd, έλεγξε τη σειρά των οδηγιών και θυμήσου ότι επηρεάζει κάθε άλλη σχετική αναφορά στο ίδιο αρχείο.
Περπάτησε τη διαδρομή ως λογαριασμός του δαίμονα
Μια διαδρομή μπορεί να είναι σωστή και παρ' όλα αυτά μη αναγνώσιμη. Μετά την πτώση προνομίων ο δαίμονας δεν είναι πια root, άρα κάθε γονικός κατάλογος χρειάζεται άδεια αναζήτησης για αυτόν τον λογαριασμό, και το αρχείο του πελάτη χρειάζεται άδεια ανάγνωσης. Ένα bit εκτέλεσης που λείπει από έναν γονικό κατάλογο αρκεί για να κρύψει το αρχείο, και το σφάλμα εμφανίζεται μόνο ως πελάτης που παίρνει ήσυχα την προεπιλεγμένη δεξαμενή.
Το namei εκτυπώνει την άδεια κάθε τμήματος με σειρά, που είναι πιο γρήγορο από το να ελέγχεις τους καταλόγους έναν-έναν:
namei -l /etc/openvpn/server/ccd/client1Μετά δοκίμασε την ανάγνωση ως λογαριασμός της υπηρεσίας αντί ως εσύ:
runuser -u openvpn -- test -r /etc/openvpn/server/ccd/client1 && echo readableΑν η μονάδα χρησιμοποιεί chroot, ο κατάλογος πρέπει να υπάρχει μέσα στη φυλακή, και η διαδρομή στη διαμόρφωση ερμηνεύεται αφού εφαρμοστεί το chroot. Ένα αρχείο που υπάρχει στον κεντρικό υπολογιστή έξω από τη φυλακή είναι αόρατο από μέσα.
Επιβεβαίωσε την αναζήτηση αντί να μαντεύεις
Ανέβασε το επίπεδο καταγραφής για μία επανεκκίνηση και διάβασε τι λέει ο διακομιστής για τις επιλογές ανά πελάτη. Στο verb 4 ο δαίμονας αναφέρει τη διαμόρφωση ανά πελάτη που εισήγαγε, άρα μια γραμμή που λείπει είναι άμεση απόδειξη ότι δεν διαβάστηκε κανένα αρχείο για αυτή τη σύνδεση.
openvpn --config /etc/openvpn/server.conf --verb 4 --client-config-dir /etc/openvpn/server/ccdΤρέξε το στο προσκήνιο σε μια εφεδρική θύρα και σύνδεσε έναν πελάτη. Αυτό βγάζει το systemd τελείως από την εικόνα: αν οι παρακάμψεις εμφανιστούν εδώ και όχι κάτω από την υπηρεσία, η διαφορά είναι στο πλαίσιο της μονάδας, όχι στο αρχείο.
Αποφάσισε τι πρέπει να συμβεί όταν δεν ταιριάζει κανένα αρχείο. Χωρίς ccd-exclusive ο πελάτης γίνεται δεκτός μόνο με τις καθολικές ρυθμίσεις της δεξαμενής, και αυτή είναι η σιωπηλή αποτυχία που περιγράφηκε πιο πάνω. Με αυτό, ένα αρχείο που λείπει γίνεται σύνδεση που απορρίπτεται, και αυτή η απόρριψη είναι πιο εύκολο να την προσέξεις αλλά πιο δύσκολο να την εντοπίσεις υπό φορτίο.
Διόρθωσε, επανεκκίνησε, επαλήθευσε
Κάνε τον κατάλογο απόλυτο στη διαμόρφωση και κράτησέ τον έτσι. Οι σχετικές διαδρομές είναι ασφαλείς μόνο όταν η μονάδα καρφιτσώνει τον κατάλογο εργασίας, και το καρφίτσωμα είναι ένα επιπλέον κινούμενο μέρος που κάποιος θα αφαιρέσει αργότερα.
client-config-dir /etc/openvpn/server/ccd
ccd-exclusiveΕπανεκκίνησε το στιγμιότυπο, συνδέσει ξανά έναν γνωστό πελάτη και διάβασε τη διεύθυνση που πήρε μαζί με τις δρομολογήσεις που του στάλθηκαν. Αν η διεύθυνση ταιριάζει με τη γραμμή ifconfig-push στο αρχείο αυτού του πελάτη, η αναζήτηση δούλεψε. Αν ο πελάτης προσγειώνεται ακόμη στη γενική δεξαμενή, γύρνα στο πλήθος των γραμμών του αρχείου καταγραφής: μηδέν εισαγωγές σημαίνει ότι η διαδρομή ή η ταυτότητα είναι λάθος, μία εισαγωγή με λάθος περιεχόμενο σημαίνει ότι επεξεργάζεσαι άλλο αρχείο από αυτό που διαβάζει ο δαίμονας.
Κάνε επαναφορά επαναφέροντας μαζί την προηγούμενη μονάδα και τη διαμόρφωση και μετά επανεκκίνησε. Τα πιστοποιητικά δεν χρειάζεται να επανεκδοθούν για τίποτα από αυτά, και το να αντιμετωπίζεις ένα πρόβλημα καταλόγου ως πρόβλημα διαπιστευτηρίων είναι ο τρόπος με τον οποίο μια διόρθωση πέντε λεπτών γίνεται παράθυρο συντήρησης.