Κάντε τον κανόνα ip rule να επιβιώνει μετά από επανασύνδεση με το systemd-networkd
Ένας κανόνας ip που προστέθηκε από το κέλυφος εξαφανίζεται στο επόμενο συμβάν του συνδέσμου. Δηλώστε τον κανόνα, τον πίνακα και τις διαδρομές του στο systemd-networkd ώστε να αναδημιουργείται η πολιτική.
Προσθέστε έναν κανόνα πολιτικής με ip rule και λειτουργεί μέχρι να χαθεί ο σύνδεσμος, οπότε απλώς δεν υπάρχει πια. Τίποτα δεν απέτυχε με θόρυβο: η κατάσταση του πυρήνα άλλαξε και κανένας ιδιοκτήτης ρύθμισης δεν ήξερε ότι ο κανόνας έπρεπε να υπάρχει. Αυτή είναι όλη η διαφορά ανάμεσα σε έναν κανόνα που επιβιώνει και σε έναν που δεν επιβιώνει. Σε κεντρικό υπολογιστή με systemd-networkd, η λύση είναι να δώσετε στον κανόνα έναν ιδιοκτήτη αντί να ξανατρέχετε την εντολή μετά από κάθε επανασύνδεση.
Ένας κανόνας υπάρχει μόνο αν κάποιος τον κατέχει
Η πολιτική δρομολόγησης του πυρήνα είναι κατάσταση και όχι ρύθμιση. Ζει στο σύστημα που τρέχει, και οτιδήποτε κατεδαφίζει τη διεπαφή από την οποία εξαρτάται μπορεί να την πάρει μαζί του. Μια εντολή στο κέλυφος αλλάζει αυτή την κατάσταση και δεν αφήνει κανένα αρχείο της πρόθεσης.
Οι διαχειριστές δικτύου δουλεύουν αντίστροφα: διαβάζουν τη ρύθμιση, την εφαρμόζουν και την εφαρμόζουν ξανά όταν ένα συμβάν στον σύνδεσμο ακυρώσει την προηγούμενη κατάσταση. Ένας κανόνας που δηλώνεται στη ρύθμισή τους αναδημιουργείται, ενώ ένας κανόνας που προστίθεται δίπλα τους είναι ξένο αντικείμενο χωρίς ιδιοκτήτη.
Αυτή η διάκριση έχει όνομα στο networkd και αξίζει να τη διαβάσετε πριν ενεργοποιήσετε οτιδήποτε. Οι ξένοι κανόνες αφαιρούνται από προεπιλογή στις πρόσφατες εκδόσεις, κάτι που εκπλήσσει όσους περίμεναν ότι οι χειροκίνητες καταχωρίσεις τους θα έμεναν.
Διαβάστε την έκδοση πριν εμπιστευτείτε μια ρύθμιση
Η συμπεριφορά ιδιοκτησίας ελέγχεται από μια ρύθμιση στο networkd.conf, και αυτή η ρύθμιση δεν υπάρχει σε παλαιότερες εκδόσεις του systemd. Ελέγξτε την εγκατεστημένη έκδοση πριν σχεδιάσετε γύρω της, γιατί ένας παλαιότερος υπολογιστής συμπεριφέρεται διαφορετικά από την τεκμηρίωση που διαβάζετε.
Δύο τιμές μετράνε. Η μία αποφασίζει αν αφαιρούνται οι κανόνες που δεν δηλώνονται στη ρύθμιση του networkd, και η άλλη κάνει το ίδιο για τις διαδρομές. Και οι δύο αφορούν την ιδιοκτησία και όχι το περιεχόμενο της πολιτικής, και οι δύο από προεπιλογή επιλέγουν την αυστηρότερη συμπεριφορά στις τρέχουσες εκδόσεις. Αν τις απενεργοποιήσετε καθολικά, κάθε ξένος κανόνας μένει ζωντανός, που είναι πολύ ευρύτερη απόφαση από το να δηλώσετε μία επιθυμητή πολιτική VPN.
systemctl --version | head -1
networkctl --version | head -1
grep -R "ManageForeign" /etc/systemd/ /usr/lib/systemd/ 2>/dev/null
Αυτό το grep σας λέει τι έχει οριστεί τοπικά και ποια είναι η προεπιλογή του κατασκευαστή. Και η απουσία είναι πληροφορία, γιατί σημαίνει ότι ισχύει η μεταγλωττισμένη προεπιλογή. Γράψτε την προεπιλογή στις σημειώσεις σας ώστε ο επόμενος άνθρωπος να μη χρειαστεί να την ανακαλύψει ξανά.
Δηλώστε τον κανόνα και τον πίνακα στον οποίο δείχνει
Ένας κανόνας σε αρχείο .network ονομάζει έναν πίνακα, και αυτό είναι το μόνο που κάνει ένα όνομα. Δεν δημιουργεί τις διαδρομές μέσα σε αυτόν τον πίνακα και δεν ελέγχει αν έχουν νόημα. Το να δηλώσετε τον κανόνα χωρίς τις διαδρομές παράγει μια πολιτική που ταιριάζει την κίνηση και μετά την απορρίπτει.
Δηλώστε τις διαδρομές στο ίδιο αρχείο, με προσβάσιμα επόμενα άλματα και τον σωστό πίνακα. Κρατήστε την προτεραιότητα στον δηλωμένο κανόνα ώστε να πέσει εκεί που περιμένετε στην ταξινομημένη λίστα. Ένας κανόνας που φτάνει στον λάθος πίνακα νωρίτερα από το προβλεπόμενο αλλάζει περισσότερη κίνηση από την υπηρεσία που θέλατε να διορθώσετε. Διαβάστε το απόσπασμα παρακάτω ως σχήμα και όχι ως πλήρες αρχείο, γιατί η ιδιοκτησία της διεπαφής και το υπόλοιπο της σύνδεσης πρέπει ακόμη να υπάρχουν.
[RoutingPolicyRule]
Family=ipv4
IPProtocol=tcp
SourcePort=443
Table=100
Priority=1000
[Route]
Destination=10.80.0.0/24
Gateway=10.80.0.1
Table=100
Έπειτα επαναφορτώστε και διαβάστε την κατάσταση του πυρήνα αντί για το αρχείο. Μια ρύθμιση που αναλύθηκε καθαρά μπορεί ακόμη να παραγάγει έναν κανόνα που δεν θέλατε, και οι δύο όψεις συμφωνούν μόνο όταν η δήλωση ήταν πλήρης.
Διαλέξτε έναν ιδιοκτήτη για τη διεπαφή
Δύο διαχειριστές σε ένα τούνελ παράγουν μια διαμάχη που μοιάζει με σφάλμα και στους δύο. Η εισαγωγή μιας υπάρχουσας ρύθμισης wg-quick στο networkd είναι μετεγκατάσταση και όχι προσθήκη, και το να τρέχουν και τα δύο αφήνει τη διεπαφή και τους κανόνες της κάτω από δύο ιδιοκτήτες.
Κάντε τη μετεγκατάσταση σε ένα πέρασμα: σταματήστε την παλιά μονάδα, απενεργοποιήστε την, δηλώστε τη διεπαφή και τις διαδρομές της στο networkd και έπειτα επαναφορτώστε. Ελέγξτε ότι η παλιά μονάδα δεν μπορεί να επιστρέψει στην εκκίνηση. Μια υπολειπόμενη μονάδα που επανενεργοποιείται μετά από επανεκκίνηση αντικαθιστά την κατάσταση που μόλις δηλώσατε. Κρατήστε το παλιό αρχείο ρύθμισης μέχρι το νέο να επιβιώσει από μια επανασύνδεση και μετά αποσύρετέ το.
Η ιδιοκτησία του σημάνδρου αξίζει την ίδια φροντίδα: αν ένας κανόνας ταιριάζει με σήμανδρο τείχους προστασίας, κάτι πρέπει να θέτει αυτόν τον σήμανδρο. Ένας κανόνας που αναφέρεται σε σήμανδρο που κανείς δεν θέτει είναι νεκρή ρύθμιση που μοιάζει σκόπιμη.
Δοκιμάστε τα συμβάντα του κύκλου ζωής
Η ρύθμιση αξίζει όσο η συμπεριφορά της στα συμβάντα. Κατεβάστε τον σύνδεσμο, ανεβάστε τον, επανεκκινήστε την υπηρεσία και ανανεώστε τη διεύθυνση. Μετά από καθένα, διαβάστε τη λίστα κανόνων και το περιεχόμενο του πίνακα.
sudo networkctl reload
ip rule show
ip route show table 100
sudo systemctl restart systemd-networkd
Το επιδιωκόμενο αποτέλεσμα είναι η ίδια πολιτική με ιδιοκτήτη να αναδημιουργείται και η παρωχημένη κατάσταση να αποσύρεται, κάτι πιο ανθεκτικό από το να ξαναπροσθέτετε έναν κανόνα κελύφους μετά από κάθε επανασύνδεση. Κρατήστε μία γραμμή στο αρχείο αλλαγών που ονομάζει το αρχείο που κατέχει τον κανόνα και την έκδοση που τον υποστηρίζει. Τότε ο επόμενος μηχανικός μπορεί να βρει την πολιτική χωρίς να ψάχνει ιστορικό κελύφους. Ένας κανόνας που δεν τον κατέχει κανείς είναι κανόνας που θα χαθεί ξανά.