Μια σύνδεση strongSwan που λειτουργεί για ένα ιδιωτικό υποδίκτυο δεν θα μεταφέρει κίνηση διαδικτύου μόνο επειδή κάποιος επεξεργάστηκε μία γραμμή. Το πλήρες τούνελ είναι μια συμφωνία μεταξύ δύο πλευρών για το ποιες διευθύνσεις προστατεύει το child SA, και κάθε πλευρά ονομάζει την άλλη σε σχέση με τον εαυτό της. Κάντε τη μία πλευρά σωστή και την άλλη λάθος, και το child SA είτε δεν ανεβαίνει είτε ανεβαίνει στενότερο από το προβλεπόμενο. Οι πέντε έλεγχοι παρακάτω ακολουθούν αυτή τη συμφωνία από τον πελάτη, μέσα από την πύλη και έξω προς το διαδίκτυο.

Ελέγξτε πρώτα τον επιλογέα του πελάτη

Ο πελάτης περιγράφει τι θέλει να προστατεύσει στην απέναντι πλευρά ως remote_ts, και ό,τι στέλνει προέρχεται από τη δική του εκχωρημένη διεύθυνση. Για κίνηση διαδικτύου αυτή η τιμή πρέπει να καλύπτει τους προορισμούς που θα φτάσει πραγματικά ο χρήστης, που στην πράξη σημαίνει ολόκληρο τον χώρο IPv4. Ένας πελάτης που εξακολουθεί να απαριθμεί ένα υποδίκτυο ζητά τούνελ διαχωρισμού, όπως κι αν ονομάζεται το προφίλ στη διεπαφή. Η πλευρά προέλευσης είναι συνήθως dynamic επειδή η διεύθυνση εκχωρείται κατά τη σύνδεση. Μια σταθερή προέλευση γραμμένη εκεί σπάει μόλις αλλάξει η δεξαμενή διευθύνσεων.

children {
    net {
        local_ts  = dynamic
        remote_ts = 0.0.0.0/0
    }
}

Το απόσπασμα δεν είναι πλήρες αρχείο σύνδεσης, και αυτό υποθέτει ότι ο έλεγχος ταυτότητας, οι ταυτότητες και η δεξαμενή εικονικών διευθύνσεων έχουν ήδη ρυθμιστεί. Ο επιλογέας προέλευσης του πελάτη και η διεύθυνση που εκχωρεί ο διακομιστής πρέπει ακόμη να συμφωνούν, αλλιώς το child SA ανεβαίνει με εύρος που καμία πλευρά δεν περίμενε. Φορτώστε το με swanctl --load-all και διαβάστε την έξοδο πριν υποθέσετε επιτυχία. Ένα αρχείο που αναλύεται μπορεί ακόμη να απορριφθεί για έναν επιλογέα που δεν επικαλύπτεται με την πρόταση της άλλης πλευράς.

Ελέγξτε τον επιλογέα της πύλης στην πλευρά της

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

children {
    rw {
        local_ts  = 0.0.0.0/0
        remote_ts = 10.77.0.0/24
    }
}

Η αντιγραφή του αποσπάσματος πελάτη στο αρχείο της πύλης παράγει ένα ζεύγος επιλογέων που δεν περιγράφει τίποτα χρήσιμο, επειδή και οι δύο πλευρές θα διεκδικούσαν τον ίδιο ρόλο. Ο οδηγός προώθησης του strongSwan τεκμηριώνει ρητά το ζεύγος πελάτη και πύλης, και αξίζει να διαβαστεί δίπλα στο αρχείο σύνδεσης και όχι μετά την αποτυχία. Το αρχείο της πύλης χρειάζεται επίσης τον ορισμό της δεξαμενής στην οποία αναφέρεται το remote_ts. Ένας επιλογέας που ονομάζει ανύπαρκτη δεξαμενή φορτώνεται χωρίς παράπονο και αποτυγχάνει κατά τη σύνδεση.

Το παλιό ipsec.conf χρησιμοποιεί ρόλους αριστερά και δεξιά με διαφορετικά κλειδιά, και μια γραμμή rightsubnet δεν είναι άμεση αντικατάσταση της τιμής swanctl. Κρατήστε τις δύο συντάξεις σε ξεχωριστά αρχεία αντί να κολλάτε τη μία μέσα στην άλλη. Η ανάμειξή τους σε έναν κατάλογο είναι ο τρόπος με τον οποίο μια λειτουργική σύνδεση γυρίζει ήσυχα μετά από επανεκκίνηση.

Ελέγξτε το διαπραγματευμένο child SA, όχι το αρχείο

Μια αποθηκευμένη διαμόρφωση αποδεικνύει την πρόθεση και τίποτα περισσότερο. Η άλλη πλευρά μπορεί να στενέψει το ζητούμενο, και ένα υπάρχον child SA δεν αντικαθίσταται μόνο επειδή άλλαξε το αρχείο από κάτω του. Επιβεβαιώστε τι είναι πραγματικά εγκατεστημένο πριν αλλάξετε οτιδήποτε άλλο.

swanctl --list-conns
swanctl --list-sas
ip xfrm policy list

Η πρώτη εντολή δείχνει τι φόρτωσε ο δαίμονας, η δεύτερη δείχνει τα child SA που έχουν εγκατασταθεί, και η τρίτη δείχνει τις πολιτικές που θα εφαρμόσει ο πυρήνας. Αν το αρχείο λέει 0.0.0.0/0 και η λίστα δείχνει ένα υποδίκτυο, η διαπραγμάτευση περιόρισε το εύρος και το ξαναδιάβασμα του αρχείου δεν θα το εξηγήσει. Τερματίστε το child, επανεκκινήστε το και συγκρίνετε ξανά και τις τρεις εξόδους. Ένα child που επιστρέφει με το ίδιο στενό εύρος στενεύεται από την απέναντι πλευρά και όχι από το τοπικό αρχείο, και αυτό είναι συζήτηση με τον άλλο διαχειριστή αντί για τοπική αλλαγή.

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

Ελέγξτε την προώθηση και τη διαδρομή επιστροφής

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

sysctl net.ipv4.ip_forward
iptables -t nat -S | grep -i masq
ip route get 1.1.1.1

Οι ιδιωτικές διευθύνσεις πελατών χρειάζονται συνήθως σκόπιμη μετάφραση προέλευσης πριν μπορέσουν να εγκαταλείψουν μια δημόσια διεπαφή, ενώ μια ρητά δρομολογημένη εκχώρηση χρειάζεται διαφορετική μεταχείριση. Αν υπάρχει NAT, κρατήστε τις εξαιρέσεις που υποστηρίζει η υλοποίηση ώστε η κίνηση που πρέπει να επιθεωρήσει μια πολιτική ασφαλείας να μη μεταφράζεται παρακάμπτοντάς την. Ένας ευρύς κανόνας masquerade αντιγραμμένος από άλλη πύλη αλλάζει πολύ περισσότερες ροές απ' ό,τι σκόπευε ο συγγραφέας του. Γράψτε τον κανόνα μόνο για τη δεξαμενή πελατών και αφήστε ένα σχόλιο που εξηγεί γιατί υπάρχει.

Στον πελάτη, επιβεβαιώστε τις διαδρομές που εγκατέστησε το backend και όχι τις διαδρομές που υποθέσατε. Ένας διαχειριστής με απενεργοποιημένη εγκατάσταση διαδρομών χρειάζεται σχεδιασμό δρομολόγησης που συντηρείται με το χέρι, και αυτός ο σχεδιασμός πρέπει να ενημερώνεται κάθε φορά που αλλάζει το τούνελ. Ελέγξτε τον πίνακα δρομολόγησης μετά από επανασύνδεση, όχι μόνο μετά από καθαρή εκκίνηση.

Ελέγξτε τι εξακολουθεί να μην καλύπτει το τούνελ

Το ζεύγος επιλογέων καλύπτει το IPv4 και τίποτα άλλο. Το IPv6, το DNS και οποιαδήποτε πολιτική σε επίπεδο εφαρμογής είναι ξεχωριστές αποφάσεις που ένας ευρύς επιλογέας IPv4 αγνοεί σιωπηλά. Ένα τούνελ που μεταφέρει κάθε πακέτο IPv4 μπορεί ακόμη να διαρρέει κάθε αναζήτηση ονόματος.

Δηλώστε ρητά την προβλεπόμενη διαδρομή DNS, επειδή ένα πλήρες τούνελ που εξακολουθεί να επιλύει ονόματα μέσω του τοπικού resolver διαρρέει ερωτήματα έξω από το τούνελ και σπάει ιδιωτικά ονόματα. Αν στον πελάτη εκχωρηθεί διεύθυνση IPv6, αυτή η οικογένεια διευθύνσεων χρειάζεται την ίδια μεταχείριση, αλλιώς ο κεντρικός υπολογιστής θα προτιμήσει μια διαδρομή που το τούνελ δεν προστατεύει. Δοκιμάστε με ένα όνομα που μόνο η ιδιωτική πλευρά μπορεί να απαντήσει, και θεωρήστε μια δημόσια απάντηση ως διαρροή.

resolvectl query intranet.example.internal
traceroute -n 1.1.1.1

Επιβεβαιώστε την αλυσίδα με αυτές τις δύο εντολές και τους διαπραγματευμένους επιλογείς από την παραπάνω λίστα. Αν το traceroute δείχνει τον τοπικό δρομολογητή ως πρώτο άλμα, η κίνηση δεν χρησιμοποιεί το τούνελ ό,τι κι αν ισχυρίζονται οι επιλογείς. Η πρόσβαση στο διαδίκτυο είναι πλήρης μόνο όταν η επιλεγμένη κίνηση γίνεται δεκτή, προωθείται και επιστρέφει μέσω της σχεδιασμένης πύλης. Το να βρείτε το 0.0.0.0/0 σε ένα προφίλ είναι η αρχή αυτής της αλυσίδας και όχι η απόδειξή της.

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