WireGuard σε χώρο ονομάτων δικτύου: γιατί το socket έμεινε πίσω
Η μετακίνηση της διεπαφής δεν μετακινεί το κρυπτογραφημένο socket UDP, το οποίο παραμένει στον χώρο ονομάτων όπου δημιουργήθηκε η συσκευή. Δημιουργήστε το στον στόχο.
Η διεπαφή εμφανίζεται στον χώρο ονομάτων που θέλατε, η εφαρμογή είναι συνδεδεμένη σε αυτήν, και όμως δεν εμφανίζεται ποτέ κίνηση σήραγγας. Αυτό είναι το χαρακτηριστικό μιας συσκευής WireGuard του πυρήνα Linux που δημιουργήθηκε σε έναν χώρο ονομάτων και μετακινήθηκε σε άλλον: η διεπαφή μετακινήθηκε και το κρυπτογραφημένο socket UDP της δεν μετακινήθηκε. Και τα δύο πρέπει να βρίσκονται στο σωστό μέρος πριν η εσωτερική κίνηση έχει σημασία. Ο έλεγχος είναι γρήγορος μόλις μάθετε να κοιτάτε δύο περιβάλλοντα αντί για ένα.
Το σύμπτωμα: σωστός χώρος ονομάτων, χωρίς πακέτα
Μέσα στον χώρο ονομάτων η σήραγγα φαίνεται υγιής. Η συσκευή υπάρχει, οι διευθύνσεις έχουν εκχωρηθεί και η διαμόρφωση του ομοτίμου είναι παρούσα. Έξω, η αναμενόμενη ανταλλαγή UDP δεν εμφανίζεται ποτέ στη διεπαφή που παρακολουθούσατε, και η απέναντι πλευρά αναφέρει ότι δεν υπάρχει χειραψία.
Ο λόγος είναι ότι τα εσωτερικά πακέτα της εφαρμογής φτάνουν στη μετακινημένη συσκευή, και η συσκευή προσπαθεί να τα στείλει μέσω ενός socket που ανήκει σε διαφορετικό περιβάλλον δικτύου. Η υποκείμενη διαδρομή που χρησιμοποιεί, και κάθε κανόνας τείχους προστασίας που εφαρμόζεται σε αυτήν, είναι εκείνοι στον χώρο ονομάτων όπου δημιουργήθηκε η συσκευή.
Αυτό δεν είναι σφάλμα στη μετακίνηση και δεν είναι λανθασμένη διαμόρφωση του ομοτίμου. Έτσι λειτουργεί η υλοποίηση του πυρήνα, και η τεκμηρίωση χώρων ονομάτων για το WireGuard περιγράφει απευθείας τον κανόνα δημιουργίας.
Γιατί το socket έχει τόπο γέννησης
Μια συσκευή WireGuard κατέχει ένα socket UDP για την κρυπτογραφημένη μεταφορά της, και αυτό το socket ανοίγει στον χώρο ονομάτων όπου δημιουργείται η συσκευή. Η μετακίνηση της διεπαφής με εντολή ζεύξης μετατοπίζει την ορατή συσκευή αλλά αφήνει τη μεταφορά εκεί όπου ξεκίνησε. Τότε τα δύο αντικείμενα έχουν διαφορετικούς ιδιοκτήτες.
Η συνέπεια περνά εύκολα απαρατήρητη επειδή τα δύο μισά εξετάζονται σε διαφορετικά σημεία. Η εσωτερική διαδρομή αποφασίζεται στον χώρο ονομάτων όπου εκτελείται η εφαρμογή, και η εξωτερική διαδρομή αποφασίζεται εκεί όπου ζει το socket. Ο έλεγχος μόνο του ενός δίνει ένα σίγουρο αλλά λάθος συμπέρασμα. Ο έλεγχος και των δύο συνήθως τελειώνει την έρευνα σε ένα πέρασμα.
Δημιουργήστε το εκεί που θέλετε το socket
Η λύση είναι να δημιουργήσετε τη συσκευή μέσα στον χώρο ονομάτων προορισμού αντί να τη δημιουργήσετε έξω και να τη μετακινήσετε. Υποθέτοντας ότι υπάρχει ήδη εγκεκριμένος χώρος ονομάτων και ότι το όνομα είναι αχρησιμοποίητο:
ip netns exec vpn-apps ip link add wg-demo type wireguard
ip netns exec vpn-apps wg show
Τώρα τόσο η διεπαφή όσο και το socket της ανήκουν σε αυτό το περιβάλλον, άρα η υποκείμενη διαδρομή και οι εφαρμοστέοι κανόνες φιλτραρίσματος είναι εκείνοι που έχουν ρυθμιστεί εκεί. Αν ο σχεδιασμός χρειάζεται την καθαρή πλευρά αλλού, τοποθετήστε πρώτα την υποκείμενη διεπαφή στον χώρο ονομάτων και μετά δημιουργήστε τη σήραγγα. Η σειρά είναι μέρος του σχεδιασμού, όχι λεπτομέρεια υλοποίησης.
Αντιμετωπίστε τις ως εντολές διαχείρισης δικτύου, όχι ως συνταγή. Δημιουργούν μια συσκευή και δείχνουν κατάσταση· τα κλειδιά, τα ομότιμα, οι διευθύνσεις και οι διαδρομές πρέπει ακόμη να προέρχονται από εγκεκριμένη διαμόρφωση, και μια υπάρχουσα διεπαφή παραγωγής δεν πρέπει ποτέ να υποκαθίσταται σε ένα παράδειγμα.
Διαβάστε και τις δύο πλευρές της διαδρομής
Όταν η συσκευή βρίσκεται στο σωστό μέρος, επαληθεύστε τις δύο αποφάσεις χωριστά. Ξεκινήστε με την εσωτερική ανάζητηση από το περιβάλλον της εφαρμογής και μετά ελέγξτε την εξωτερική διαδρομή από το περιβάλλον που κατέχει το socket:
ip netns exec vpn-apps ip route get 10.30.0.9
ip netns exec vpn-apps wg show
tcpdump -ni any udp port 51820
Αν η εσωτερική ανάζητηση επιλύεται μέσω της σήραγγας και η εξωτερική καταγραφή δείχνει την κρυπτογραφημένη ανταλλαγή, τα δύο μισά συμφωνούν. Αν η καταγραφή είναι κενή, το socket είναι ακόμη κάπου αλλού, ή η υποκείμενη διαδρομή στον χώρο ονομάτων του δεν φτάνει στο τελικό σημείο.
Ένας ακόμη έλεγχος ανήκει στην καταγραφή: πώς δημιουργείται η συσκευή μετά από επανεκκίνηση. Ένας διαχειριστής που αναδημιουργεί τη διεπαφή με διαφορετικό περιβάλλον δημιουργίας αλλάζει τον τόπο γέννησης του socket. Μια χειροκίνητη μετακίνηση που λειτούργησε μία φορά δεν είναι απόδειξη για τη διαχειριζόμενη διαδρομή.