Πλήρες τούνελ WireGuard: το AllowedIPs 0.0.0.0/0 δεν αρκεί
Τα 0.0.0.0/0 και ::/0 επιλέγουν μόνο τι μεταφέρει ο κόμβος. Ο διαχειριστής πελάτη, η προώθηση στην πύλη, το DNS και η πολιτική αποτυχίας πρέπει ακόμη να ρυθμιστούν.
Το να βάλεις 0.0.0.0/0, ::/0 στο AllowedIPs ενός κόμβου είναι το βήμα που όλοι θυμούνται, και αποφασίζει μόνο ποια κίνηση επιτρέπεται να μεταφέρει ο κόμβος. Αυτά τα προθέματα δεν δημιουργούν διαδρομές, δεν προωθούν τίποτα στην άλλη πλευρά και αφήνουν τον resolver κάθε εφαρμογής ακριβώς εκεί που ήταν. Τέσσερα ξεχωριστά πράγματα πρέπει να ισχύουν ταυτόχρονα για να είναι ένα πλήρες τούνελ πλήρες, και καλύτερα ελέγχονται με τη σειρά παρακάτω, γιατί ένας μεταγενέστερος έλεγχος δεν μπορεί να σώσει έναν προηγούμενο. Κάθε έλεγχος παρακάτω είναι ένα γεγονός που το διαβάζεις από μηχανή, όχι μια ρύθμιση που ελπίζεις ότι εφαρμόστηκε.
Τι επιλέγει το πρόθεμα του κόμβου και τι όχι
Το AllowedIPs είναι ταυτόχρονα επιλογέας και εξουσιοδότηση. Λέει στην τοπική πλευρά ποιοι προορισμοί μπορούν να σταλούν σε αυτόν τον κόμβο, και λέει στην πλευρά υποδοχής ποιες διευθύνσεις προέλευσης επιτρέπεται να παρουσιάσει αυτός ο κόμβος. Αυτή είναι όλη η δουλειά. Τίποτα σε αυτή την περιγραφή δεν δημιουργεί διαδρομή στον υπολογιστή, δεν ενεργοποιεί προώθηση στην απομακρυσμένη πλευρά και δεν αγγίζει την επίλυση ονομάτων.
Γι’ αυτό μια ρύθμιση μπορεί να φαίνεται πλήρης και να συμπεριφέρεται σαν τούνελ διαχωρισμού. Το πρόθεμα λέει ότι ο κόμβος θα δεχόταν τα πάντα· ο πίνακας δρομολόγησης του υπολογιστή αποφασίζει τι φτάνει πραγματικά εκεί, και η πύλη αποφασίζει αν βγαίνει τίποτα. Καμία από αυτές τις τρεις αποφάσεις δεν ζει στο τμήμα του κόμβου.
Δρομολόγηση του πελάτη, όχι μόνο της λίστας κόμβων
Διαχειριστές όπως το wg-quick προγραμματίζουν τον πίνακα δρομολόγησης του υπολογιστή για σένα, γι’ αυτό δύο πανομοιότυπα αρχεία ρύθμισης συμπεριφέρονται διαφορετικά ανάλογα με το πώς ανέβηκε η διεπαφή. Ένα ελάχιστο προφίλ είναι αρκετά σύντομο ώστε να διαβαστεί με μια ματιά:
[Interface]
Address = 10.8.0.2/32
DNS = 10.8.0.1
[Peer]
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = vpn.example.net:51820
Δύο λεπτομέρειες κάνουν τη δουλειά. Το πεδίο Address είναι ένα μόνο πρόθεμα υπολογιστή και όχι υποδίκτυο που ο πελάτης νομίζει ότι κατέχει, και ο διαχειριστής είναι αυτός που μετατρέπει το προεπιλεγμένο AllowedIPs σε πραγματική προεπιλεγμένη διαδρομή. Ανέβασε το ίδιο αρχείο με ip link και wg setconf και δεν θα εμφανιστεί καμία διαδρομή, κάτι που μοιάζει με χαλασμένο τούνελ και είναι ένα υγιές με το βήμα δρομολόγησης να έχει παραλειφθεί. Το εγχειρίδιο του wg-quick τεκμηριώνει τη δρομολόγηση και τη Table συμπεριφορά που προσθέτουν αυτοί οι διαχειριστές.
Διάβασε το αποτέλεσμα αντί για το αρχείο: ip route get 1.1.1.1 θα πρέπει να ονομάζει τη διεπαφή του τούνελ, και wg show θα πρέπει να αναφέρει πρόσφατη χειραψία με μετρητή μεταφοράς που κινείται. Χειραψία χωρίς διαδρομή σημαίνει ότι ο διαχειριστής δεν έτρεξε ποτέ, και η επεξεργασία του προφίλ ξανά δεν θα το διορθώσει. Ξεκίνα τη διεπαφή όπως θα την ξεκινήσει ο χρήστης, αλλιώς το τεστ μετρά το κέλυφός σου αντί για την ανάπτυξη.
Κρατώντας το τελικό σημείο έξω από το τούνελ
Ένα πλήρες τούνελ πιάνει κάθε προορισμό, μαζί με αυτόν με τον οποίο πρέπει να μιλήσει για να υπάρχει. Οι διαχειριστές το αντιμετωπίζουν προσθέτοντας διαδρομή υπολογιστή για το τελικό σημείο μέσω της αρχικής πύλης, γι’ αυτό μια σωστή ρύθμιση περιέχει σχεδόν πάντα μία σκόπιμη εξαίρεση. Το να εφαρμόσεις τη μισή ρύθμιση με διαχειριστή και την άλλη μισή με το χέρι είναι ο συνήθης τρόπος να χαθεί αυτή η εξαίρεση.
Αν το τελικό σημείο είναι όνομα υπολογιστή που επιλύεται σε πολλές διευθύνσεις, ή σε οικογένεια που δεν μεταφέρεις, η εξαίρεση γερνά άσχημα και το τούνελ μπορεί να αποτύχει μετά από επανασύνδεση που φαινόταν ρουτίνα. Καρφίτσωσε το τελικό σημείο σε διεύθυνση που ελέγχεις, ή επιβεβαίωσε ότι ο διαχειριστής το επαναξιολογεί, και ξαναδιάβασε τη διαδρομή υπολογιστή μετά από κάθε αλλαγή δικτύου.
Ο ίδιος μηχανισμός εξηγεί γιατί ένα πλήρες τούνελ και μια πύλη αιχμαλώτισης μαλώνουν. Η πύλη περιμένει να υποκλέψει την κίνηση που πιάνει τώρα το τούνελ σου, οπότε σε δίκτυα ξενοδοχείων και αεροδρομίων ανεβάζεις το τούνελ μετά τη σύνδεση στην πύλη, ποτέ πριν.
Προώθηση και διαδρομή επιστροφής στην πύλη
Στην πύλη, ενεργοποίησε την προώθηση για την οικογένεια που μεταφέρεις, επέτρεψε την αλυσίδα forward και προς τις δύο κατευθύνσεις όταν μεταφράζεις, και επιβεβαίωσε τη διαδρομή επιστροφής με αναζήτηση ειδική για την προέλευση. Τίποτα από αυτά δεν προκύπτει από επιτυχή χειραψία, γιατί η χειραψία αποδεικνύει μόνο ότι οι δύο κόμβοι μπορούν να ανταλλάσσουν UDP. Δεν λέει τίποτα για το τι συμβαίνει μετά στο αποκαψυκωμένο πακέτο.
sysctl net.ipv4.ip_forward net.ipv6.conf.all.forwarding
ip route get 1.1.1.1 from 10.8.0.2
Η αναζήτηση τρέχει στην πύλη και όχι στον πελάτη, αλλιώς θα διαβάζεις άλλον πίνακα δρομολόγησης. Αν ονομάσει λάθος διεπαφή, ή αναφέρει ότι δεν υπάρχει διαδρομή, τότε καμία αλλαγή στην πλευρά του πελάτη δεν θα παραγάγει έξοδο στο διαδίκτυο. Όταν η πύλη μεταφράζει τις διευθύνσεις των πελατών στην έξοδο, η απάντηση εξαρτάται από αυτή την κατάσταση μετάφρασης, οπότε ο κανόνας πρέπει να υπάρχει και για τις δύο κατευθύνσεις της ροής και όχι μόνο για την εξερχόμενη.
DNS και η κατάσταση αποτυχίας, ελεγμένα χωριστά
Το πρωτόκολλο ίδιο δεν ρυθμίζει τον resolver καμίας εφαρμογής. wg-quick εφαρμόζει τη γραμμή DNS μέσω της ενσωμάτωσης resolver της διανομής, κοντέινερ και περιηγητές με δικές τους στοίβες μπορεί να την αγνοήσουν, και γι’ αυτό ένα όνομα μπορεί να αποτύχει ενώ το τούνελ μεταφέρει πακέτα τέλεια. Δοκίμασε με όνομα υπολογιστή αντί για διεύθυνση, και σημείωσε ποιος διακομιστής απάντησε αντί να υποθέσεις ότι ήταν αυτός του προφίλ.
Οι οικογένειες διευθύνσεων είναι ξεχωριστό τεστ με ξεχωριστή απάντηση. Μια προεπιλεγμένη διαδρομή v4 δεν λέει τίποτα για το τι θα κάνει η σύνδεση v6 μιας εφαρμογής, και ένα τούνελ που διαρρέει σιωπηλά τη δεύτερη οικογένεια είναι χειρότερο από ένα που αποτυγχάνει δυνατά. Ρώτησε ένα όνομα μέσα από κάθε οικογένεια, διάβασε τη διεπαφή που χρησιμοποίησε κάθε αίτημα, και έλεγξε τους μετρητές μετάφρασης πριν και μετά, γιατί ένας κανόνας που δεν ταιριάζει με τίποτα μοιάζει ίδιος με έναν κανόνα που λείπει.
Τέλος, δοκίμασε την κατάσταση που θέλεις όταν το τούνελ σταματήσει. Ένα πλήρες τούνελ θα πρέπει να αποτυγχάνει κλειστά για την κίνηση που διεκδικεί: αν η διεπαφή πέσει και οι εφαρμογές συνεχίσουν ήσυχα μέσω της φυσικής ζεύξης, το σχέδιο είναι τούνελ διαχωρισμού με επιπλέον βήματα. Γράψε τη σκόπιμη συμπεριφορά αποτυχίας, έλεγξέ την επίτηδες, και τελείωσε καταγράφοντας τις τέσσερις απαντήσεις — ποιος διαχειριστής ανεβάζει τη διεπαφή, ποια διαδρομή μεταφέρει την προεπιλεγμένη, ποιος προωθεί και μεταφράζει στην πύλη, και ποιος resolver απαντά.