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

Ένα σκριπτ που βγαίνει με μηδέν δεν σας είπε τίποτα για το αν επέστρεψε μια σήραγγα.

Το hook τρέχει, και μετά;

#!/bin/sh
case "$1" in
  pre)
    vpn-client disconnect
    ;;
  post)
    vpn-client connect
    ;;
esac

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

Αντιμετωπίστε το όρισμα φάσης ως μέρος του σχεδιασμού. Μια απόπειρα επανασύνδεσης στη φάση pre συμβαίνει ενώ το μηχάνημα πρόκειται να χάσει τα πάντα, και δεν μπορεί να πετύχει.

Root, ελάχιστο περιβάλλον, λάθος χρήστης

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

Γράψτε το hook με απόλυτες διαδρομές, κρατήστε το ιδιοκτησία του root και εκτελέσιμο, και καταγράψτε τι έκανε. Χωρίς αυτό το αρχείο, η επόμενη έρευνα ξεκινά από το μηδέν.

Η αυτόματη σύνδεση δεν είναι η διαδρομή του VPN

Το NetworkManager προσφέρει δύο μηχανισμούς ενεργοποίησης: μια σημαία αυτόματης σύνδεσης στο προφίλ και δευτερεύουσες συνδέσεις που ξεκινούν όταν ενεργοποιείται ένα κύριο προφίλ. Οι εγγενείς τύποι συσκευών υλοποιούν τον πρώτο· οι προσθήκες VPN ιστορικά έχουν υλοποιήσει μόνο τον δεύτερο, οπότε η επιλογή αυτόματης σύνδεσης σε ένα προφίλ OpenVPN μπορεί να μην έχει καμία απολύτως επίδραση. Εξετάστε και τις δύο ιδιότητες και μετά συνδέστε το VPN ως δευτερεύον του προφίλ Wi-Fi ή Ethernet.

[Unit]
PartOf=NetworkManager.service
Requires=NetworkManager-wait-online.service
After=NetworkManager-wait-online.service

Μια διεπαφή WireGuard που διαχειρίζεται μια μονάδα systemd χρειάζεται αυτό το drop-in αντί για hook, ταξινομημένο αφού το δίκτυο είναι συνδεδεμένο.

Περιμένετε το δίκτυο, με ένα όριο

timer=1
while ! ping -c1 -n -w1 203.0.113.1 >/dev/null; do
  sleep 1; timer=$((timer+1))
  [ $timer -ge 300 ] && exit 0
done
nmcli connection up "work-vpn"

Στη συνέχιση η σήραγγα μπορεί να ζητηθεί ενώ το Wi-Fi ακόμη επανασυνδέεται, κάτι που κάνει κάθε σταθερή αναμονή εικασία. Περιμένετε μια προσβάσιμη διεύθυνση, μετά ανεβάστε το προφίλ, και βάλτε όριο στην αναμονή ώστε ένα hook να μην μπορεί να κρατήσει τη διαδρομή συνέχισης ανοιχτή επ' αόριστον. Προτιμήστε το όνομα του προφίλ από έναν αριθμητικό δείκτη, και αν το σωστό προφίλ διαφέρει ανά δίκτυο, ας καταγράψει η υγιής σήραγγα την επιλογή της σε ένα αρχείο εκ των προτέρων.

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

Αναστείλετε μία φορά, μετά διαβάστε το ημερολόγιο για την έξοδο του ίδιου του hook. Αυτή είναι η μόνη δοκιμή που αποδεικνύει τη σειρά.

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