Όταν προσθέτετε ένα πρόθεμα IPv6 σε ένα τούνελ τοποθεσίας-προς-τοποθεσία, το πακέτο δεν ταξιδεύει όπως υποδηλώνει το διάγραμμα. Η τοπική πύλη παίρνει ολόκληρο το πακέτο IPv6, το κρυπτογραφεί και βάζει μπροστά μια εξωτερική κεφαλίδα IP της οποίας η οικογένεια διευθύνσεων καθορίζεται από τις διευθύνσεις των άκρων, όχι από το περιεχόμενο. Η απομακρυσμένη πύλη αφαιρεί αυτή την εξωτερική κεφαλίδα και προωθεί το αρχικό πακέτο στο LAN της, όπου είναι πάλι ένα συνηθισμένο πακέτο IPv6. Εξωτερικό τούνελ και εσωτερική κίνηση είναι δύο ξεχωριστές συνομιλίες που μοιράζονται ένα κλειδί, ένα ζεύγος άκρων και τίποτα άλλο.

Δύο κεφαλίδες, δύο οικογένειες διευθύνσεων

Στη λειτουργία τούνελ IPsec το εσωτερικό πακέτο IPv6 γίνεται το ωφέλιμο φορτίο πίσω από μια κεφαλίδα ESP. Η εξωτερική κεφαλίδα που μεταφέρει αυτό το πακέτο ESP μπορεί να είναι IPv4 ή IPv6 και ακολουθεί τα local_addrs και remote_addrs. Το WireGuard κάνει το ίδιο με λιγότερη τελετουργία: το εσωτερικό πακέτο είναι το ωφέλιμο φορτίο ενός datagram UDP προς το άκρο του ομότιμου. Και τα δύο αφήνουν την εσωτερική κεφαλίδα άθικτη, γι' αυτό η απομακρυσμένη πλευρά μπορεί να το δρομολογήσει μετά την αποσυσκευασία.

Η διαδρομή μεταξύ των τοποθεσιών βλέπει μόνο UDP 4500 όταν το IPsec χρησιμοποιεί διάσχιση NAT, ή UDP 51820 για έναν προεπιλεγμένο ακροατή WireGuard. Κάθε δρομολογητής στη διαδρομή μπορεί να είναι μόνο IPv4 και η κίνηση IPv6 περνά παρ' όλα αυτά, επειδή ποτέ δεν εμφανίζεται ως πακέτο IPv6 σε αυτή τη διαδρομή. Αυτό δίνει έναν καθαρό πρώτο διαχωρισμό: tcpdump -ni eth0 udp port 51820 δείχνει την κρυπτογραφημένη διαδρομή, tcpdump -ni wg0 ip6 δείχνει την εσωτερική κίνηση. Μια γεμάτη εξωτερική καταγραφή με σιωπηλή εσωτερική σημαίνει ότι ο πυρήνας δεν βάζει IPv6 στο τούνελ· αυτό είναι δρομολόγηση ή πολιτική, όχι κατάσταση ζεύξης.

Η πύλη μειώνει επίσης το εσωτερικό Hop Limit όταν προωθεί, οπότε τα άκρα μετράνε ως δρομολογητές στη διαδρομή IPv6. Ο εξωτερικός αριθμός αλμάτων και το εσωτερικό Hop Limit κινούνται ανεξάρτητα, και ένα πακέτο που πεθαίνει στην απομακρυσμένη πύλη πέθανε στην προώθηση, όχι στην κρυπτογράφηση.

Οι επιλογείς και τα AllowedIPs είναι η λίστα αδειών

Το IKEv2 διαπραγματεύεται ποια εσωτερικά προθέματα μπορεί να μεταφέρει ένα child SA. Στο strongSwan 5.9 και μετά, η γραφή τους στο swanctl.conf μοιάζει έτσι:

children {
  net6 {
    local_ts  = 2001:db8:aa::/48
    remote_ts = 2001:db8:bb::/48
    mode = tunnel
    esp_proposals = aes256gcm16-prfsha384-ecp384
    start_action = trap
  }
}

Αν παραλείψετε τα local_ts και remote_ts, το strongSwan τα παράγει από τα υποδίκτυα της διεπαφής που επιλέγει. Σε κεντρικό υπολογιστή διπλής στοίβας αυτή η συντόμευση δίνει συχνά ζεύγος μόνο IPv4: το SA ανεβαίνει και το IPv6 απορρίπτεται πριν φτάσει στον κώδικα ESP. Γράφοντας και τα δύο προθέματα το SA γίνεται ικανό να τα μεταφέρει, και το start_action = trap το ανεβάζει στο πρώτο πακέτο που ταιριάζει.

Το WireGuard έχει μία λίστα που κάνει δύο δουλειές. Στο μπλοκ του ομότιμου, το AllowedIPs = 2001:db8:bb::/48, fd00:bb::/48 είναι και η διαδρομή που εγκαθίσταται κατά την αποστολή και το φίλτρο που εφαρμόζεται κατά τη λήψη: ένα αποκρυπτογραφημένο πακέτο του οποίου η εσωτερική πηγή πέφτει έξω από τη λίστα αυτού του ομότιμου απορρίπτεται σιωπηλά. Το wg-quick προσθέτει διαδρομή για κάθε καταχώριση, οπότε το μπλοκ ομότιμου παρακάτω δεν χρειάζεται ξεχωριστή εντολή ip -6 route.

[Interface]
Address = 2001:db8:aa:ff::1/64, fd00:aa:ff::1/64
ListenPort = 51820

[Peer]
PublicKey = <site-b-public-key>
Endpoint = 203.0.113.20:51820
AllowedIPs = 2001:db8:bb::/48, fd00:bb::/48

Και οι δύο λίστες πρέπει να είναι κατοπτρικές: η τοποθεσία B δέχεται το πρόθεμα της τοποθεσίας A ως απομακρυσμένο επιλογέα και το δρομολογεί πίσω, και το τούνελ λειτουργεί μόνο όταν οι δύο κατευθύνσεις συμφωνούν. Μια ασύμμετρη λίστα δίνει το σύμπτωμα που κοστίζει τον περισσότερο χρόνο — μια υγιής χειραψία, μετρητές που κινούνται στη μία πλευρά, και ένα ping από το A στο B που πετυχαίνει ενώ τίποτα από το B δεν φτάνει στο A.

Προώθηση, διαδρομές και το πρόθεμα επιστροφής

Το Linux δεν προωθεί IPv6 μέχρι να το πείτε, και η ρύθμιση είναι ανά χώρο ονομάτων και όχι ανά διεπαφή:

sysctl -w net.ipv6.conf.all.forwarding=1
ip -6 route add 2001:db8:bb::/48 dev wg0
ip -6 route get 2001:db8:bb::10 from 2001:db8:aa::10

Η δεύτερη γραμμή είναι αυτή που ξεχνούν οι άνθρωποι στα σχέδια που βασίζονται σε διαδρομές. Το IPsec βάσει πολιτικής εγκαθιστά μια πολιτική XFRM που ταιριάζει με τα προθέματα, αλλά μια ρύθμιση βασισμένη σε διαδρομές με vti6 ή WireGuard χρειάζεται πραγματική διαδρομή IPv6 που δείχνει σε εκείνη τη συσκευή. Κρατήστε το sysctl στο /etc/sysctl.d/· αλλιώς μια επανεκκίνηση επαναφέρει σιωπηλά την προώθηση στο κλειστό.

Η προώθηση έχει μια παρενέργεια που αξίζει να τη γνωρίζετε: ο πυρήνας τότε αγνοεί τις ανακοινώσεις δρομολογητή εκτός αν το net.ipv6.conf.<wan>.accept_ra είναι 2, οπότε μια πύλη της οποίας η διεύθυνση WAN έρχεται μέσω SLAAC μπορεί να χάσει την προεπιλεγμένη διαδρομή της τη στιγμή που ενεργοποιείτε την προώθηση. Ρυθμίστε το accept_ra = 2 σε εκείνη τη διεπαφή στο ίδιο αρχείο και η διαδρομή επιβιώνει. Ο πυρήνας της τοποθεσίας B πρέπει επίσης να μάθει το 2001:db8:aa::/48 από την πύλη του τούνελ, με στατική διαδρομή ή πρωτόκολλο δρομολόγησης πάνω από το τούνελ, αλλιώς η απάντηση πεθαίνει μέσα στο δίκτυο του B.

Έλεγχος τεσσάρων βημάτων που εντοπίζει τη διακοπή

Δουλέψτε με αυτή τη σειρά και σταματήστε στο πρώτο βήμα που αποτυγχάνει, γιατί κάθε επόμενο βήμα εξαρτάται από τα προηγούμενα.

  1. Επιλογείς: το swanctl --list-sas πρέπει να δείχνει το ζεύγος προθεμάτων IPv6 στο child SA, ή το wg show wg0 allowed-ips το απομακρυσμένο πρόθεμα με ένα πρόσφατο latest-handshakes.
  2. Διαδρομή πυρήνα: το ip -6 route get 2001:db8:bb::10 πρέπει να απαντά με τη συσκευή του τούνελ, όχι με τη διεπαφή WAN.
  3. Εσωτερική καταγραφή: tcpdump -ni wg0 ip6 ενώ κάνετε ping μεταξύ πραγματικών κεντρικών υπολογιστών LAN. Πακέτα που βγαίνουν αλλά κανένα δεν επιστρέφει δείχνουν τη διαδρομή ή το τείχος προστασίας του B· καθόλου πακέτα δείχνουν πίσω στο βήμα 1 ή 2.
  4. Προορισμός: στον κεντρικό υπολογιστή B, το ss -6 -ltn επιβεβαιώνει ότι η υπηρεσία ακούει σε IPv6, και οι τοπικοί μετρητές του τείχους προστασίας δείχνουν αν το πακέτο έγινε δεκτό ή απορρίφθηκε.

Το MTU ανήκει στο ίδιο πέρασμα. Οι δρομολογητές IPv6 δεν κατατμίζουν, οπότε ένα υπερμέγεθες πακέτο απορρίπτεται και το Packet Too Big επιστρέφει στον αποστολέα. Αν οι χειραψίες και τα μικρά ping δουλεύουν αλλά μια μεταφορά αρχείου κολλάει, μικρύνετε το ωφέλιμο φορτίο μέχρι να περάσει: ping -6 -s 1400 -c 3 2001:db8:bb::10. Οι διεπαφές WireGuard έχουν εξ ορισμού MTU 1420 byte και το IPsec πάνω από IPv4 αφαιρεί περισσότερα, οπότε το να ορίσετε το εσωτερικό MTU είναι καλύτερο από το να ελπίζετε σε ανακάλυψη MTU διαδρομής μέσα από ένα τείχος προστασίας που απορρίπτει ICMPv6.

Λειτουργίες αποτυχίας που μοιάζουν με προβλήματα τείχους προστασίας

Η πιο συνηθισμένη δεν είναι καθόλου τείχος προστασίας: η υπηρεσία δεσμεύεται στο 0.0.0.0 αντί για το ::, η εγγραφή AAAA υπάρχει, και ο πελάτης λαμβάνει γρήγορη άρνηση μέσω IPv6 που ένα πρόγραμμα περιήγησης διπλής στοίβας κρύβει πέφτοντας πίσω στο IPv4. Αν αποτυγχάνουν μόνο μερικές εφαρμογές, ελέγξτε την οικογένεια ακρόασης πριν αγγίξετε ένα σύνολο κανόνων.

Η δεύτερη είναι το φιλτράρισμα ICMPv6. Το Neighbor Discovery και το Packet Too Big είναι μέρος της κανονικής λειτουργίας, όχι της διάγνωσης, και μια πολιτική που απορρίπτει όλο το ICMPv6 παράγει ένα τούνελ που συνδέεται, πιστοποιείται και μετά κολλάει σε οτιδήποτε μεγαλύτερο από ένα μικρό πακέτο. Επιτρέψτε τους τύπους από τους οποίους εξαρτάται η διαδρομή και αφήστε τους μετρητές ανοιχτούς ώστε μια απόρριψη να είναι ορατή.

Η τρίτη είναι ένα πρόθεμα που προστίθεται στο τούνελ αλλά ποτέ στο σχέδιο διευθύνσεων της τοποθεσίας που το κατέχει, οπότε κανένας δρομολογητής δεν το αναγγέλλει και κανένας κεντρικός υπολογιστής δεν μπορεί να απαντήσει από αυτό. Ξεκινήστε με ένα πρόθεμα και ένα ζεύγος κεντρικών υπολογιστών, αποδείξτε και τις δύο κατευθύνσεις με τα τέσσερα βήματα και μετά προσθέστε τα υπόλοιπα· ένα σπασμένο πρόθεμα μένει μία γραμμή σε μια διαμόρφωση αντί για επανασχεδιασμό. Η μόνη επίσημη αναφορά που αξίζει να μένει ανοιχτή είναι RFC 8200, που ορίζει την κεφαλίδα που μεταφέρει το τούνελ.

Σχετικά άρθρα