Γιατί το wg-quick ξαναγράφει το wg0.conf όταν σταματάτε τη διεπαφή
Το SaveConfig είναι αποθήκευση κατά τον τερματισμό, όχι συγχρονισμός στο παρασκήνιο. Επεξεργαστείτε το αρχείο όσο το τούνελ είναι ενεργό, και μια επανεκκίνηση μπορεί να ξαναγράψει την παλιά κατάσταση από πάνω του.
Προσθέτετε ένα peer στο /etc/wireguard/wg0.conf, εκτελείτε το systemctl restart wg-quick@wg0, και το peer εξαφανίζεται από το αρχείο όταν κοιτάξετε ξανά. Τίποτα δεν κατέστρεψε τίποτα. Μια επανεκκίνηση είναι ένα σταμάτημα που ακολουθείται από εκκίνηση, και το βήμα του σταματήματος μπορεί να γράψει την τρέχουσα κατάσταση εκτέλεσης πάνω στο αρχείο που μόλις επεξεργαστήκατε. Η ρύθμιση που ευθύνεται βρίσκεται στο ίδιο αρχείο που επεξεργαζόσασταν, και αυτό κάνει τον κύκλο τόσο μπερδεμένο την πρώτη φορά που τον συναντάτε.
Δύο καταστάσεις, ένα αρχείο και μια αποθήκευση κατά τον τερματισμό
Η κατάσταση εκτέλεσης του WireGuard και ένα αρχείο ρυθμίσεων του wg-quick σχετίζονται αλλά είναι διαφορετικά. Το αρχείο είναι είσοδος: το wg-quick το διαβάζει, δημιουργεί τη διεπαφή, ορίζει διευθύνσεις και διαδρομές και ρυθμίζει τα peers. Η συσκευή του πυρήνα είναι το ζωντανό αντικείμενο, και οι αλλαγές χαμηλού επιπέδου που γίνονται με το wg δεν γράφονται ποτέ πίσω στον εαυτό τους.
Εκτός από μία κατεύθυνση. Όταν το SaveConfig = true εμφανίζεται στην ενότητα της διεπαφής, το wg-quick αποθηκεύει τη ζωντανή ρύθμιση στο αρχείο ως μέρος του κατεβάσματος της διεπαφής. Το εγχειρίδιο του wg-quick προειδοποιεί ακριβώς γι’ αυτό: αλλαγές που γίνονται στο αρχείο όσο η διεπαφή είναι ενεργή μπορεί να αντικατασταθούν όταν αφαιρεθεί. Είναι αποθήκευση κατά τον τερματισμό, όχι χρονοδιακόπτης παρασκηνίου, οπότε ενεργοποιείται μόνο όταν κάτι σταματά τη διεπαφή.
| Action | What it writes | When it surprises you |
|---|---|---|
wg set on a live interface | Kernel state only | After reboot, when the file was never updated |
wg-quick down with SaveConfig | Live state into the file | Right after you edited the file |
wg syncconf | Kernel state only | Never; it does not touch the file |
wg-quick up | Kernel state from the file | If the file is stale, you get the old tunnel |
Διαβάστε τον πίνακα ως προειδοποίηση για τη σειρά. Κάθε τυχαία απώλεια σε αυτόν τον τομέα προέρχεται από μια επεξεργασία που έγινε πριν από μια αποθήκευση αντί μετά.
Πρώτα σταματήστε, μετά επεξεργαστείτε, τελευταία εκκινήστε
Αν το αρχείο είναι η πηγή αλήθειας σας, κάντε το αρχείο έγκυρο με κατασκευή και όχι με ελπίδα. Κατεβάστε τη διεπαφή, επιβεβαιώστε ότι έφυγε, μετά επεξεργαστείτε και μετά ανεβάστε την ξανά. Ο κανόνας είναι απλός: καμία επεξεργασία δεν υπάρχει όσο μπορεί ακόμη να εκτελεστεί μια αποθήκευση.
sudo cp -a /etc/wireguard/wg0.conf /root/wg0.conf.$(date +%F-%H%M)
sudo wg-quick down wg0
ls /sys/class/net/wg0 2>/dev/null || echo "interface is gone"
sudoedit /etc/wireguard/wg0.conf
sudo wg-quick up wg0
Η γραμμή αντιγράφου ασφαλείας δεν είναι τελετουργικό. Αν το τούνελ είναι ο τρόπος να φτάσετε σε αυτό το μηχάνημα, το βήμα του κατεβάσματος μπορεί να τερματίσει τη συνεδρία σας, και ένα αντίγραφο στον δίσκο συν μια κονσόλα ή μια διαδρομή εκτός ζώνης είναι η μόνη επαναφορά που λειτουργεί. Ελέγξτε αυτή τη δεύτερη γραμμή πριν την εμπιστευτείτε: ένα ξεπερασμένο όνομα διεπαφής σε ένα σενάριο που αποτυγχάνει σιωπηλά είναι ο τρόπος με τον οποίο οι άνθρωποι επεξεργάζονται ένα αρχείο που είναι ακόμη ζωντανό.
Η ρύθμιση SaveConfig = false πριν από ένα κανονικό κατέβασμα είναι η άλλη αποδεκτή διαδρομή, και πρέπει να γίνει στο αρχείο που διαβάζει πραγματικά το wg-quick. Αποτρέπει αυτή τη μία αυτόματη αποθήκευση. Δεν κάνει ένα ξεχωριστό προφίλ του NetworkManager, μια εξαγωγή δρομολογητή ή ένα σημείο εισόδου κοντέινερ να επαναφορτώσουν τις επεξεργασίες σας, γιατί αυτοί οι διαχειριστές δεν διαβάζουν καθόλου αυτό το αρχείο.
Εφαρμόστε αλλαγές peers χωρίς να σκίσετε τη διεπαφή
Δεν χρειάζεται κάθε επεξεργασία διακοπή. Οι αλλαγές σε επίπεδο peer μπορούν να εφαρμοστούν σε μια διεπαφή που εκτελείται μετατρέποντας το αρχείο σε ρύθμιση και συγχρονίζοντάς την, κάτι που αποφεύγει εντελώς το βήμα του κατεβάσματος και επομένως την αποθήκευση:
sudo wg syncconf wg0 <(sudo wg-quick strip wg0)
sudo wg show wg0 peers
sudo wg show wg0 latest-handshakes
Το βήμα strip έχει σημασία. Εκτυπώνει το αρχείο με τα κλειδιά που ανήκουν μόνο στο wg-quick αφαιρεμένα, ώστε οι διευθύνσεις, το DNS και οι οδηγίες δρομολόγησης να μην πηγαίνουν σε ένα εργαλείο που δεν τις καταλαβαίνει. Ο συγχρονισμός εφαρμόζει μετά τα peers και τα κλειδιά στη ζωντανή συσκευή χωρίς να ξαναδημιουργεί τη διεπαφή, οπότε οι υπάρχουσες συνεδρίες και διαδρομές επιβιώνουν.
Να είστε ακριβείς για τα όρια. Ο συγχρονισμός peers δεν αλλάζει τη διεύθυνση της διεπαφής, τις διαδρομές που πρόσθεσε το wg-quick ή τη ρύθμιση του resolver, γιατί κανένα από αυτά δεν ανήκει στη συσκευή WireGuard. Η προσθήκη ενός υποδικτύου στο AllowedIPs και η προσδοκία ότι ο πυρήνας θα το δρομολογήσει είναι η κλασική λανθασμένη ανάγνωση· η διαδρομή πρέπει να προστεθεί από το wg-quick κατά την ανύψωση ή από εσάς.
Ελέγξτε ποιος κατέχει τη διεπαφή πριν επεξεργαστείτε οτιδήποτε
Σε έναν υπολογιστή ή έναν διακομιστή που διαχειρίζεται σύστημα ρυθμίσεων, το αρχείο μπορεί να είναι έξοδος αντί για είσοδος. Μια σύνδεση NetworkManager, ένα προφίλ που δημιουργεί δρομολογητής ή ένα σενάριο εκκίνησης κοντέινερ μπορούν όλα να κατέχουν το ίδιο όνομα διεπαφής, και σε αυτή την περίπτωση μια άψογη ακολουθία wg-quick εξακολουθεί να επεξεργάζεται το λάθος τεχνούργημα.
systemctl status wg-quick@wg0 --no-pager
nmcli connection show | grep -i wireguard
sudo wg showconf wg0 | head -n 5
Η τρίτη εντολή εκτυπώνει τη ζωντανή ρύθμιση στην ίδια μορφή με το αρχείο, με το ιδιωτικό κλειδί, κάτι που είναι χρήσιμο για σύγκριση και επικίνδυνο σε ένα δελτίο. Αποκρύψτε το πριν το επικολλήσετε· ένα ιδιωτικό κλειδί σε ένα νήμα υποστήριξης είναι μόνιμη παραβίαση, όχι τυπογραφικό λάθος.
Αν η μονάδα υπηρεσίας είναι ανενεργή αλλά η διεπαφή υπάρχει, κάτι άλλο τη δημιούργησε και το αρχείο δεν είναι έγκυρο. Αυτή η μία παρατήρηση εξοικονομεί μια ώρα επεξεργασίας ενός αρχείου που δεν διαβάζει τίποτα.
Επαληθεύστε την επόμενη επανεκκίνηση και μετά κρατήστε μια επαναφορά
Το τεστ που πραγματικά αποδεικνύει τη διόρθωση είναι μια δεύτερη επανεκκίνηση, γιατί αυτή είναι η ακολουθία που απέτυχε την πρώτη φορά. Επιβεβαιώστε ότι το peer επιβιώνει και ότι η ζωντανή ρύθμιση εξακολουθεί να ταιριάζει με αυτό που υπάρχει στον δίσκο:
sudo systemctl restart wg-quick@wg0
sudo wg show wg0 latest-handshakes
sudo grep -c '^\[Peer\]' /etc/wireguard/wg0.conf
Εκτελέστε την επανεκκίνηση δύο φορές. Ένα μόνο καθαρό πέρασμα μπορεί να είναι τύχη: η πρώτη επανεκκίνηση μπορεί να καταναλώσει μια αλλαγή χρόνου εκτέλεσης που δεν είχε ακόμη αποθηκευτεί, οπότε η δεύτερη είναι αυτή που σας λέει ότι το αρχείο και η εκτέλεση συμφώνησαν στο τέλος της πρώτης.
Κρατήστε το αντίγραφο ασφαλείας από την αρχή της διαδικασίας μέχρι να κάνετε τη διπλή επανεκκίνηση, μετά διαγράψτε το ή μετακινήστε το έξω από τον κατάλογο ρυθμίσεων. Ένα αδέσποτο wg0.conf.bak δίπλα στο πραγματικό αρχείο είναι ακίνδυνο για το wg-quick και μπερδεύει τον επόμενο άνθρωπο, που τελικά θα επεξεργαστεί το λάθος.