IPv6 τοπική διεύθυνση ζεύξης δεν λειτουργεί μέσω VPN: γιατί το fe80 σταματά στη ζεύξη
Μια διεύθυνση fe80:: σημαίνει κάτι μόνο σε μία ζεύξη. Δείτε γιατί ένα δρομολογημένο VPN δεν μπορεί να τη μεταφέρει, πώς φαίνεται η αποτυχία και ποια διεύθυνση να χρησιμοποιήσετε αντί γι' αυτή.
Ανεβάζετε τη σήραγγα, κάνετε ping στο fe80::1 με τη σήραγγα ως διεπαφή προέλευσης και δεν επιστρέφει τίποτα. Δεν είναι κανόνας τείχους προστασίας που ξεχάσατε. Μια τοπική διεύθυνση ζεύξης σημαίνει κάτι μόνο στη μία ζεύξη όπου σχηματίστηκε, και ένα δρομολογημένο VPN δεν είναι αυτή η ζεύξη. Το fe80::1 του απομακρυσμένου δρομολογητή ζει στο απομακρυσμένο τμήμα LAN· εσείς βρίσκεστε ένα άλμα μακριά σε διαφορετικό τμήμα, και το IPv6 δεν έχει κανέναν μηχανισμό ώστε ένας δρομολογητής να προωθεί καθόλου πακέτα τοπικής ζεύξης.
Το πρόθεμα fe80 περιγράφει εύρος ισχύος, όχι περιοχή διευθύνσεων
Η unicast τοπικής ζεύξης είναι fe80::/10, και το καθοριστικό γνώρισμα δεν είναι ο αριθμός αλλά το εύρος. Η διεύθυνση ισχύει μόνο σε μία ζεύξη, και κάθε διεπαφή σχηματίζει μία από το δικό της αναγνωριστικό· γι' αυτό δύο άσχετα μηχανήματα σε δύο άσχετα δίκτυα μπορούν και τα δύο να απαντούν στο fe80::1 χωρίς την παραμικρή σύγκρουση. Το πρόθεμα λέει βασικά «σε κάποια ζεύξη»· η ίδια η ζεύξη προκύπτει από το πλαίσιο.
Σε έναν κεντρικό υπολογιστή, αυτό το πλαίσιο είναι η ζώνη, ή το αναγνωριστικό εύρους, που προσθέτετε μετά από ένα σύμβολο τοις εκατό: fe80::1%eth0 στο Linux, fe80::1%3 ή fe80::1%12 στα Windows και σε εργαλεία που εκθέτουν δείκτες διεπαφής. Ο πυρήνας επιλύει τη διεύθυνση μαζί με τον δείκτη διεπαφής και μετά στέλνει. Αν αφαιρέσετε τη ζώνη, ο προορισμός γίνεται ασαφής, οπότε η στοίβα δεν έχει τρόπο να επιλέξει τμήμα.
Γιατί μια δρομολογημένη σήραγγα δεν μπορεί να την παραδώσει
Ένα δρομολογημένο VPN είναι διεπαφή σημείου προς σημείο που μεταφέρει τις δικές της διευθύνσεις, συνήθως ένα /64 μοναδικού-τοπικού ή ιδιωτικού χώρου IPv6 μέσα στη σήραγγα. Το απομακρυσμένο LAN είναι ξεχωριστή ζεύξη, που προσεγγίζεται από το άκρο της σήραγγας που δρομολογεί και προωθεί για λογαριασμό σας. Είναι δύο διακριτά τμήματα, οπότε μια διεύθυνση από το ένα δεν είναι έγκυρος προορισμός στο άλλο.
Ο κανόνας προώθησης είναι ρητός στο πρότυπο και όχι ιδιοτροπία του πελάτη σας: οι δρομολογητές δεν προωθούν πακέτα με προέλευση ή προορισμό τοπικής ζεύξης. Γι' αυτό το πακέτο πεθαίνει ακόμη και όταν ο πίνακας δρομολόγησης φαίνεται σωστός. Προσθέστε διαδρομή για το fe80::/64 προς τη σήραγγα και μια στοίβα συμβατή με το πρότυπο είτε θα την απορρίψει είτε θα τη δεχτεί και θα πετάξει κάθε πακέτο που ταιριάζει: το εύρος του προορισμού λέει «μόνο αυτή η ζεύξη», και η διεπαφή εξόδου δεν είναι αυτή η ζεύξη.
Η ανακάλυψη γειτόνων ενισχύει το ίδιο όριο. Οι κεντρικοί υπολογιστές επιλύουν τα επόμενα άλματα τοπικής ζεύξης με αίτημα γείτονα που στέλνεται σε multicast εύρους ζεύξης με όριο άλματος 255, ώστε οι δρομολογητές να μπορούν να απορρίπτουν ό,τι προωθείται. Το να δουλέψει αυτό μέσα από σήραγγα θα σήμαινε διαμεσολάβηση της ανακάλυψης για απομακρυσμένο τμήμα, που είναι γεφύρωση επιπέδου 2 με άλλο καπέλο.
Υπάρχει και μια πιο ήσυχη δεύτερη αποτυχία, που σκοντάφτει όσους προσπαθούν να επιβάλουν τη διαδρομή ούτως ή άλλως: η ζώνη. Όποια ζώνη κι αν πληκτρολογήσετε τοπικά, ονομάζει τη διεπαφή της σήραγγας, ενώ η διεύθυνση που θέλετε είναι δεσμευμένη στη διεπαφή του απομακρυσμένου LAN. Οι δύο δεν ταιριάζουν ποτέ, οπότε το πακέτο δεν μπορεί να κατευθυνθεί στη σωστή διεπαφή στο μακρινό άκρο.
Πώς φαίνεται η αποτυχία στην πράξη
Η έξοδος εργαλείων για λάθος εύρους διαβάζεται σαν σφάλμα δρομολόγησης ή τείχους προστασίας, και γι' αυτό ακριβώς οι άνθρωποι περνούν ένα απόγευμα στο λάθος επίπεδο.
| What you run | What you see | What it means |
|---|---|---|
| ping fe80::1 with no zone | Invalid argument on Linux, or a transmit failure on Windows | The stack cannot pick an interface for an ambiguous destination |
| ping -6 -I tun0 fe80::1 | Destination unreachable, or a silent timeout | The address is not on the tunnel link, so there is nothing on-link to answer |
| ssh user@fe80::1 after the tunnel is up | Hangs, then no route to host | The SYN never left the machine in a deliverable form; the server logs nothing |
| ip -6 neigh show dev tun0 | Empty table | No neighbor entry can exist for a link-local host that is not on this link |
| fe80::/64 inside AllowedIPs or route-ipv6 | Config accepted, traffic still dropped | The tunnel carried the packet; the receiving stack refused to forward it |
Η τρίτη γραμμή σπαταλά τον περισσότερο χρόνο, γιατί ένας πελάτης ssh χωρίς έξοδο μοιάζει με πρόβλημα υπηρεσίας που ακούει. Αν έχετε οποιονδήποτε τρόπο πρόσβασης, κοιτάξτε την απέναντι πλευρά και επιβεβαιώστε αν το sshd είναι δεσμευμένο σε όλες τις διευθύνσεις ή μόνο σε μία.
Χρησιμοποιήστε μια διεύθυνση που προοριζόταν για δρομολόγηση
Για ό,τι χρειάζεται να φτάσετε μέσω της σήραγγας, χρησιμοποιήστε τη διεύθυνση που δόθηκε στην υπηρεσία γι' αυτόν ακριβώς τον σκοπό: μια παγκόσμια unicast διεύθυνση, ή μια μοναδική-τοπική διεύθυνση από το fc00::/7, το εύρος που είναι δεσμευμένο ακριβώς για αυτή την εσωτερική περίπτωση. Επιβεβαιώστε ότι ο ακροατής τη δεσμεύει πραγματικά, και ελέγξτε τη διαδρομή επιστροφής και κάθε κανόνα τείχους προστασίας του κεντρικού υπολογιστή.
Κοιτάξτε τον απομακρυσμένο κεντρικό υπολογιστή αντί να μαντεύετε. Το ip -6 addr show απαριθμεί τις διευθύνσεις που υπάρχουν, και το ss -6 -ltn απαριθμεί σε τι ακούει ο δαίμονας. Μια υπηρεσία δεσμευμένη μόνο στο fe80:: είναι προσβάσιμη μόνο από το δικό της τμήμα, που συνήθως είναι μια προεπιλογή που κανείς δεν επέλεξε επίτηδες και μπορεί να αλλάξει με τη σύμφωνη γνώμη του διαχειριστή.
Όταν η υπηρεσία πραγματικά δεν μπορεί να δεσμευτεί ξανά, ανεβάστε τη γέφυρα στο επίπεδο εφαρμογής αντί στο επίπεδο δικτύου. Ένας αναμεταδότης στον απομακρυσμένο κεντρικό υπολογιστή που ακούει σε δρομολογήσιμη διεύθυνση και συνδέεται με την τοπική ζεύξης λύνει το πρόβλημα χωρίς να επεκτείνει κανένα τμήμα:
socat TCP6-LISTEN:8080,bind=[fd00:1:2::10] TCP6:[fe80::1%eth0]:80Εδώ η ζώνη βρίσκεται στη σωστή πλευρά, στον κεντρικό υπολογιστή που έχει πραγματικά το eth0 σε αυτή τη ζεύξη. Ο πελάτης σας μιλά στο fd00:1:2::10, που δρομολογείται κανονικά, και ο αναμεταδότης κάνει το άλμα τοπικής ζεύξης τοπικά. Το ίδιο κόλπο δουλεύει για διεπαφή web μιας συσκευής ή ένα παλιό BMC που διαφημίζει μόνο μια τοπική διεύθυνση ζεύξης.
Πότε η γεφύρωση είναι πραγματικά η απάντηση, και τι να ελέγξετε
Ορισμένες εγκαταστάσεις χρειάζονται πραγματικά ένα κοινό τμήμα: μια συσκευή που μιλά μόνο ανακάλυψη τοπικής ζεύξης, μια συσκευή που εξαρτάται από multicast, ένα εργαστήριο που αναπαράγει ένα επίπεδο LAN. Αυτό είναι πρόβλημα επιπέδου 2 και χρειάζεται απάντηση επιπέδου 2, όπως μια συσκευή tap γεφυρωμένη στην απομακρυσμένη διεπαφή ή ένα προϊόν πελάτη με ρητή λειτουργία γεφύρωσης. Σας κοστίζει κίνηση broadcast και multicast που διασχίζει τη σήραγγα, συν ανακάλυψη γειτόνων που πρέπει να δουλεύει από άκρη σε άκρη.
Μην το προσεγγίσετε προσθέτοντας το fe80::/64 σε ένα δρομολογημένο προφίλ. Αυτό παράγει τη χειρότερη κατάσταση απ' όλες: η διαμόρφωση φαίνεται τελειωμένη, ο πίνακας δρομολόγησης δείχνει καταχώριση, και κάθε πακέτο εξακολουθεί να απορρίπτεται κάπου ανάμεσα σε δύο στοίβες που και οι δύο συμπεριφέρονται σωστά.
Επαληθεύστε με τη διεπαφή και όχι με το ping. Το ip -6 addr show tun0 σας λέει αν η ζεύξη της σήραγγας σχημάτισε δική της τοπική διεύθυνση ζεύξης, και το ip -6 route get fe80::1%tun0 λέει τι θα έκανε πραγματικά ο πυρήνας με προορισμό εύρους. Όταν ο πυρήνας λέει ότι ο προορισμός είναι απρόσιτος σε αυτή τη διεπαφή, καμία ρύθμιση σήραγγας δεν θα το αλλάξει, και είναι ώρα να σταματήσετε να επεξεργάζεστε το προφίλ.
Μια σύντομη ακολουθία που λύνει το ζήτημα:
- Διαβάστε τη διεύθυνση στον απομακρυσμένο κεντρικό υπολογιστή και σημειώστε αν είναι fe80:: ή δρομολογήσιμο πρόθεμα.
- Αν είναι fe80::, δεσμεύστε ξανά την υπηρεσία, αναμεταδώστε σε αυτόν τον κεντρικό υπολογιστή ή γεφυρώστε το τμήμα· αν είναι δρομολογήσιμο, διορθώστε τη διαδρομή, το τείχος προστασίας ή τη διεύθυνση δέσμευσης.
- Ελέγχετε τη ζώνη κάθε φορά που επαναλαμβάνετε τη δοκιμή, γιατί μια αντιγραμμένη εντολή συνήθως κρατά τη λάθος διεπαφή.