Το systemd σταματά την υπηρεσία VPN: ταιριάξτε το Type= με τον πελάτη
Μια μονάδα VPN κατά την εκκίνηση γίνεται ανενεργή όταν το Type= δεν ταιριάζει με τη διάρκεια ζωής του πελάτη. Ταιριάξτε τον τύπο, διορθώστε την ιδιοκτησία και βάλτε την υπηρεσία μετά τη σήραγγα.
Οι μονάδες μπορεί να φαίνονται σωστές, το systemctl start μπορεί να αναφέρει επιτυχία, και δέκα δευτερόλεπτα αργότερα η υπηρεσία κάθεται ανενεργή. Ή επανεκκινεί κάθε μισό λεπτό μέχρι να τη σταματήσει το όριο εκκίνησης. Καμία από τις δύο συμπεριφορές δεν είναι βλάβη δικτύου: η μονάδα περιγράφει διάρκεια ζωής διεργασίας που δεν ταιριάζει με αυτό που κάνει πραγματικά ο πελάτης. Ο πελάτης μπορεί να κάνει fork και να βγει, ή να ρυθμίσει τη συνεδρία και να βγει αμέσως.
Γιατί η μονάδα γίνεται ανενεργή δευτερόλεπτα μετά από επιτυχή εκκίνηση
Το systemd συνάγει την κατάσταση από τη διεργασία που εκκίνησε, άρα το Type= είναι ισχυρισμός για αυτή τη διεργασία, όχι τεκμηρίωση. Με το Type=simple η μονάδα μετρά ως ενεργή όσο εκτελείται η εντολή και γίνεται ανενεργή όταν επιστρέψει. Ένας πελάτης που παραδίδει τη σύνδεση σε βοηθό και βγαίνει φαίνεται επομένως σαν κατάρρευση, ακόμη και όταν η σήραγγα είναι ενεργή. Το ημερολόγιο δείχνει τότε ένα μοτίβο εκκίνησης και στάσης που διαβάζεται σαν ελαττωματικό εκτελέσιμο.
Διαβάστε τον τύπο της μονάδας δίπλα στη συμπεριφορά του πελάτη πριν αγγίξετε τη διαμόρφωση δικτύου.
Επιλέξτε τον τύπο που ταιριάζει με τον πελάτη
Δύο μοτίβα καλύπτουν τα περισσότερα CLI κατασκευαστών: μια εντολή που ρυθμίζει μια συνεδρία και βγαίνει, και μια εντολή που κάνει fork έναν βοηθό πριν επιστρέψει. Καθένα χρειάζεται διαφορετικό σχήμα μονάδας.
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/bin/protonvpn-cli connect -f
ExecStop=/usr/bin/protonvpn-cli disconnectΤο oneshot με το RemainAfterExit=true κρατά τη μονάδα ενεργή αφού επιστρέψει η εντολή, κάτι που ταιριάζει με το μοτίβο ρύθμισε-και-βγες, και η εντολή τερματισμού δίνει στην υπηρεσία καθαρό κλείσιμο. Ένας πελάτης που κάνει fork κρατά το ίδιο σχήμα αλλά χρειάζεται Type=forking ώστε το systemd να ακολουθεί το παιδί. Ορίστε Restart=on-failure, RestartSec=30 και ένα πεπερασμένο StartLimitBurst, ώστε μια διακοπή παρόχου να μην μετατραπεί σε βρόχο επανεκκινήσεων που θάβει το σφάλμα.
Μην αφήνετε ποτέ έναν εποπτευόμενο πελάτη να δαιμονοποιηθεί
Οι επόπτες έξω από το systemd χτυπούν τον ίδιο τοίχο. Ένα σενάριο runit που εκκινεί έναν δαιμονοποιημένο πελάτη επιστρέφει αμέσως στον επόπτη, ο οποίος διαβάζει την επιστροφή ως κατάρρευση και ξεκινά άλλο αντίγραφο. Κάθε επόπτης περιμένει να κατέχει τη διεργασία προσκηνίου, όπως το sshd -D μένει μπροστά. Αφαιρέστε τη σημαία δαίμονα για τις εποπτευόμενες εντολές και αφήστε τον επόπτη να κάνει τη δουλειά του παρασκηνίου. Σενάρια περιτυλίγματος που επιστρέφουν πριν υπάρξει η σήραγγα προκαλούν την ίδια σύγχυση.
Μια διεργασία που αποσπάται από μόνη της είναι αόρατη σε ό,τι υποτίθεται πως την παρακολουθούσε.
Η συνεδρία τελειώνει και παίρνει τη σήραγγα μαζί της
Μια συνεδρία επιφάνειας εργασίας κατέχει τον πελάτη που εκκινεί. Τερματίστε τη σύνδεση και ο δίαυλος της συνεδρίας εξαφανίζεται, παίρνοντας τη σήραγγα μαζί του, κάτι που εξηγεί γιατί η σύνδεση ενός γραφικού πελάτη συχνά πέφτει όταν κλείνει το τελευταίο παράθυρο. Οι διακομιστές πρέπει να χρησιμοποιούν μονάδα συστήματος ή προφίλ NetworkManager που ανεβαίνει μόνο του. Μια μονάδα χρήστη έχει νόημα μόνο όταν η σήραγγα πρέπει να τελειώσει με τη σύνδεση, οπότε δέστε την στον στόχο της γραφικής συνεδρίας και δηλώστε το στην περιγραφή της.
Ο χρήστης της υπηρεσίας είναι το άλλο μισό του ίδιου προβλήματος. Ένα κλειδί που ανήκει στο root με λειτουργία 0600 είναι μη αναγνώσιμο για μονάδα που εκτελείται με άλλο λογαριασμό, ό,τι και αν πέτυχε το sudo στο κέλυφός σας.
systemctl cat openvpn-server@work
sudo chown -R openvpn:network /etc/openvpn/server
sudo find /etc/openvpn -type f -perm /077 -lsΤακτοποιήστε τα εξαρτώμενα αφού υπάρξει η διεύθυνση
Όταν ένας δαίμονας δεσμεύεται σε διεύθυνση σήραγγας που δεν έχει δημιουργηθεί ακόμη, βγαίνει με Cannot assign requested address. Η διόρθωση είναι ρητή σειρά, όχι βρόχος επαναλήψεων.
[Unit]
After=network.target [email protected]
Requires=sys-devices-virtual-net-wg0.deviceΤο After= τακτοποιεί τις εργασίες, ενώ το Requires= στη μονάδα της συσκευής δένει το εξαρτώμενο με την ύπαρξη της διεπαφής, κάτι ισχυρότερο από το να περιμένεις μόνο τον στόχο δικτύου. Επαναφορτώστε τον διαχειριστή μετά την επεξεργασία και επανεκκινήστε την εξαρτώμενη υπηρεσία, μετά διαβάστε το ημερολόγιό της αντί να υποθέσετε ότι η σειρά εφαρμόστηκε. Στείλτε την έξοδο του πελάτη στο ημερολόγιο με το StandardOutput=journal ή μια επιλογή καταγραφής, γιατί ένας εποπτευόμενος πελάτης που γράφει σε αρχείο που κανείς δεν ανοίγει μοιάζει ίδιος με έναν που δεν ξεκίνησε ποτέ.
Έπειτα επανεκκινήστε μία φορά και επιβεβαιώστε ότι η μονάδα είναι ενεργή αφού εμφανιστεί η συσκευή σήραγγας. Μια διόρθωση που επαληθεύτηκε μόνο με systemctl start δεν δοκίμασε τη σειρά εκκίνησης που έπρεπε να διορθώσει.