Κατά την εκκίνηση, μια μονάδα socket που δεσμεύει σταθερή διεύθυνση VPN μπορεί να αποτύχει πριν η σήραγγα την εκχωρήσει, και η υπηρεσία πίσω της δεν ξεκινά ποτέ. Δύο διακόπτες μοιάζουν με λύσεις και λύνουν διαφορετικά μισά αυτού του προβλήματος. Το FreeBind επιτρέπει στο systemd να δημιουργήσει τον ακροατή ενώ η διεύθυνση ακόμη λείπει. Το After= απλώς ταξινομεί εργασίες, οπότε αλλάζει πότε ξεκινούν τα πράγματα χωρίς να κάνει τη διεύθυνση να φτάσει νωρίτερα.

Δύο διαφορετικά προβλήματα, δύο διαφορετικοί διακόπτες

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

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

FreeBind: ο ακροατής υπάρχει πριν από τη διεύθυνση

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

[Socket]
ListenStream=
ListenStream=10.8.0.1:8443
FreeBind=yes

Η κενή εκχώρηση καθαρίζει τις καταχωρίσεις ακρόασης που κληρονομήθηκαν από τη μονάδα του προμηθευτή πριν προστεθεί η νέα, κάτι που εμποδίζει έναν εναπομείναντα ακροατή wildcard να απαντά σε κάθε διεπαφή. Αντικαταστήστε τη διεύθυνση και τη θύρα με τις δικές σας και επαληθεύστε την ενεργή μονάδα και όχι μόνο το αρχείο drop-in. Χρησιμοποιήστε drop-in με το όνομα της μονάδας αντί να επεξεργαστείτε ένα αρχείο πακέτου επί τόπου, γιατί η επόμενη ενημέρωση πακέτου θα αντικαταστήσει την αλλαγή και δεν θα αφήσει ίχνος της πρόθεσης. Έπειτα εφαρμόστε το μέσω της διαδικασίας επαναφόρτωσης και επανεκκίνησης που περιμένει η μονάδα socket.

Η αναφορά socket του systemd τεκμηριώνει τη συμπεριφορά IPv4 και IPv6 πίσω από αυτή την επιλογή, και η σημαντική λεπτομέρεια είναι ότι αφορά τη δέσμευση και όχι τη δρομολόγηση. Τίποτα σε αυτή δεν εκχωρεί διεύθυνση ή ξεκινά VPN. Το FreeBind είναι άδεια που δίνεται στον ακροατή, όχι υποκατάστατο της διεπαφής.

After= και Wants=: η σειρά δεν είναι ετοιμότητα

Η σειρά και η απαίτηση είναι ξεχωριστοί άξονες, και η σύγχυσή τους παράγει μονάδες που ξεκινούν με τη σωστή σειρά και παρόλα αυτά αποτυγχάνουν. Το After=vpn-client.service σημαίνει μόνο ότι, αν ξεκινήσουν και οι δύο εργασίες, αυτή περιμένει να ξεκινήσει η άλλη. Δεν τραβά το VPN και δεν περιμένει το VPN να ολοκληρώσει τη σύνδεση.

Οι οδηγίες απαίτησης όπως το Wants= και το Requires= χειρίζονται την ενεργοποίηση και διαφέρουν στο τι συμβαίνει όταν η εξάρτηση αποτυγχάνει: η μία συνεχίζει, η άλλη σταματά. Καμία από τις δύο δεν ξέρει τι σημαίνει συνδεδεμένη σήραγγα. Μια διεργασία VPN μπορεί να είναι ενεργή χωρίς εκχωρημένη διεύθυνση, ή με εκχωρημένη διεύθυνση και χωρίς διαδρομή προς τον ομότιμο, και οι δύο καταστάσεις ικανοποιούν την εξάρτηση. Αν η εφαρμογή χρειάζεται να υπάρχει η διεύθυνση, μοντελοποιήστε ρητά αυτή τη συνθήκη αντί να θεωρείτε την εκκίνηση της διεργασίας απόδειξη ετοιμότητας.

Ελέγξτε τι δηλώνει πραγματικά η μονάδα με το systemctl cat και το systemctl show -p After -p Wants -p Requires. Drop-in από τρεις διαφορετικούς καταλόγους μπορούν να προσθέσουν οδηγίες που δεν γράψατε ποτέ, και το systemd διαβάζει μόνο την ενεργή μονάδα.

Τι δεν κάνει το network-online.target

Μια μονάδα που έχει ταξινομηθεί μετά το network-online.target περιμένει ο διαχειριστής δικτύου να δηλώσει το δίκτυο χρησιμοποιήσιμο, που είναι σημείο συγχρονισμού κατά την εκκίνηση και όχι διαρκής συνθήκη. Δεν λέει τίποτα για το αν μια συγκεκριμένη σήραγγα είναι ενεργή, και δεν θα ενεργοποιηθεί ξανά όταν ένα VPN επανασυνδεθεί το απόγευμα. Το να το αντιμετωπίζετε ως παρακολούθηση επανασύνδεσης είναι η πιο κοινή παρερμηνεία αυτού του στόχου.

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

Δοκιμάστε τον κύκλο ζωής που επιλέξατε πραγματικά

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

systemd-analyze verify myapp.socket
systemctl cat myapp.socket
ss -ltn "sport = :8443"

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

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

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