Προώθηση θύρας σε peer του WireGuard πίσω από NAT: DNAT και SNAT
Το DNAT παραδίδει το αίτημα, αλλά η απάντηση φεύγει από λάθος διεύθυνση. Προσθέστε έναν αντίστοιχο κανόνα SNAT και τοποθετήστε και τους δύο αφού ρυθμιστεί η σήραγγα.
Ένα πρόγραμμα περιήγησης ζητά https://203.0.113.10:8443, ο διαμεσολαβητής δέχεται τη σύνδεση και η υπηρεσία στον peer του WireGuard δεν απαντά ποτέ. Ο κανόνας DNAT κάνει τη δουλειά του· το κομμάτι που αποτυγχάνει είναι η απάντηση. Ακολουθήστε το πακέτο και στις δύο μεταφράσεις και ο κανόνας που λείπει γίνεται προφανής. Η διόρθωση είναι μία ακόμη δήλωση NAT στο σωστό hook, όχι νέα σήραγγα.
Ακολουθήστε ένα αίτημα από άκρη σε άκρη
Το αίτημα φτάνει στη δημόσια διεπαφή του διαμεσολαβητή με τη δημόσια διεύθυνση του πελάτη ως πηγή και τη διεύθυνση του διαμεσολαβητή ως προορισμό. Στο nat PREROUTING ο κανόνας DNAT ξαναγράφει τον προορισμό στη διεύθυνση σήραγγας του peer, 10.90.0.2. Στη συνέχεια η απόφαση δρομολόγησης στέλνει το πακέτο έξω από το wg0 και η διαδρομή προώθησης ολοκληρώνεται.
Στον peer το πακέτο φέρει τώρα την αρχική δημόσια διεύθυνση πηγής, επειδή τίποτα δεν την ξανάγραψε. Η υπηρεσία δέχεται τη σύνδεση και στέλνει την απάντησή της στην προεπιλεγμένη πύλη της, που είναι ο οικιακός δρομολογητής μπροστά από τον peer. Αυτός ο δρομολογητής δεν έχει κατάσταση για μια ροή που δεν είδε ποτέ και είτε απορρίπτει το πακέτο είτε το μεταφράζει στη δική του δημόσια διεύθυνση, κάτι που ο πελάτης δεν θα δεχτεί.
Η ασυμμετρία είναι όλο το πρόβλημα: το αίτημα περνά από τον διαμεσολαβητή και η απάντηση προσπαθεί να πάει ευθεία. Η παρακολούθηση συνδέσεων του διαμεσολαβητή βοηθά μόνο αν η απάντηση επιστρέφει μέσω του διαμεσολαβητή, και δεν μπορεί να επιστρέψει εκεί όσο η διεύθυνση πηγής δείχνει ακόμη στον αρχικό πελάτη.
Προσθέστε την αντίστροφη μετάφραση
Ξαναγράψτε την πηγή της προωθούμενης ροής στη διεύθυνση σήραγγας του διαμεσολαβητή πριν φύγει για τον peer. Η υπηρεσία απαντά τότε στο 10.90.0.1, ο διαμεσολαβητής το λαμβάνει και η παρακολούθηση συνδέσεων αντιστρέφει και τις δύο μεταφράσεις πριν το πακέτο επιστρέψει στον πελάτη.
iptables -t nat -A PREROUTING -p tcp -m multiport --dports 8080,8443 -j DNAT --to-destination 10.90.0.2
iptables -t nat -A POSTROUTING -d 10.90.0.2 -o wg0 -p tcp -m multiport --dports 8080,8443 -j SNAT --to-source 10.90.0.1Ο κανόνας POSTROUTING είναι σκόπιμα στενός: ταιριάζει με τον μεταφρασμένο προορισμό και τη διεπαφή σήραγγας, ώστε να μην ξαναγράφει άσχετη κίνηση που τυχαίνει να φεύγει από το wg0. Ένας ευρύς κανόνας masquerade θα έκρυβε επίσης τη διεύθυνση του πελάτη, αλλά θα το έκανε για κάθε ροή και θα έκανε τον πίνακα NAT δυσκολότερο στον έλεγχο.
Τοποθετήστε τους κανόνες εκεί όπου υπάρχει η σήραγγα
Οι κανόνες που αναφέρονται στη διεύθυνση ή τη διεπαφή της σήραγγας πρέπει να εκτελούνται αφού το wg-quick τη ρυθμίσει. Η διεπαφή δημιουργείται πριν από το PreUp, αλλά οι διευθύνσεις, το MTU, το DNS και οι διαδρομές εφαρμόζονται μετά, και το PostUp εκτελείται όταν όλα αυτά είναι στη θέση τους. Βάλτε τις προσθήκες στο PostUp και τις διαγραφές στο PreDown.
PostUp = iptables -t nat -A PREROUTING -p tcp -m multiport --dports 8080,8443 -j DNAT --to-destination 10.90.0.2
PostUp = iptables -t nat -A POSTROUTING -d 10.90.0.2 -o wg0 -p tcp -m multiport --dports 8080,8443 -j SNAT --to-source 10.90.0.1
PreDown = iptables -t nat -D PREROUTING -p tcp -m multiport --dports 8080,8443 -j DNAT --to-destination 10.90.0.2
PreDown = iptables -t nat -D POSTROUTING -d 10.90.0.2 -o wg0 -p tcp -m multiport --dports 8080,8443 -j SNAT --to-source 10.90.0.1Οι διαγραφές πρέπει να ταιριάζουν με τις προσθήκες token προς token, συμπεριλαμβανομένων των αντιστοιχίσεων multiport και διεπαφής. Μια διαγραφή που διαφέρει κατά μία αντιστοίχιση δεν αφαιρεί τίποτα και η επόμενη επανασύνδεση προσθέτει δεύτερο αντίγραφο του κανόνα. Μετά από μερικές επανασυνδέσεις ο πίνακας περιέχει διπλότυπα που δύσκολα αποδίδονται σε μια γραμμή διαμόρφωσης.
Ελέγξτε το αποτέλεσμα με iptables -t nat -S μετά από επανασύνδεση. Αν ο ίδιος κανόνας εμφανιστεί δύο φορές, η γραμμή PreDown δεν ταιριάζει και ο καθαρισμός αποτυγχάνει σιωπηλά.
Προώθηση, φιλτράρισμα και το άλλο NAT
Ενεργοποιήστε μόνιμα την προώθηση IPv4 και μετά επιτρέψτε την προωθούμενη ροή στον πίνακα φίλτρου. Το DNAT συμβαίνει πριν από την αλυσίδα FORWARD, οπότε ο κανόνας φίλτρου ταιριάζει με τον μεταφρασμένο προορισμό και όχι με τη δημόσια διεύθυνση. Αν το UFW διαχειρίζεται το firewall, εκφράστε την άδεια ως κανόνα δρομολόγησης· ένας απλός κανόνας host δεν καλύπτει προωθούμενη κίνηση.
Δύο άλλα επίπεδα NAT μπορούν ακόμη να σπάσουν τη διαδρομή ακόμη και όταν οι κανόνες του διαμεσολαβητή είναι σωστοί. Σε οικιακή σύνδεση η δημόσια διεύθυνση ανήκει στον δρομολογητή και το άνοιγμα της θύρας στο firewall του δεν είναι το ίδιο με τη δημιουργία καταχώρισης προώθησης θύρας που στέλνει αυτή τη θύρα στον διαμεσολαβητή. Μια θύρα που φαίνεται ανοιχτή από έξω ενώ τίποτα δεν απαντά συνήθως λείπει ακριβώς αυτή η αντιστοίχιση.
Σε NAT VPS ο πάροχος αντιστοιχίζει μια δημόσια θύρα σε ιδιωτική διεύθυνση. Η αντιστοίχιση πρέπει να συμφωνεί με τη θύρα που διαφημίζετε, και μια ασυμφωνία φαίνεται ίδια με σπασμένη σήραγγα. Επιβεβαιώστε την αντιστοίχιση του παρόχου πριν αλλάξετε τη διαμόρφωση του WireGuard.
Επαληθεύστε τη διαδρομή επιστροφής και δεχτείτε το κόστος
Συνδεθείτε από δίκτυο που δεν είναι το LAN του διαμεσολαβητή και μετά εξετάστε το ζεύγος μετάφρασης όσο η σύνδεση είναι ανοιχτή:
conntrack -L -p tcp --dport 8080
tcpdump -ni any tcp port 8080Η καταχώριση conntrack θα πρέπει να δείχνει την αρχική πλειάδα, τη μεταφρασμένη πλειάδα και την κατεύθυνση της απάντησης. Αν λείπει η απάντηση, ο peer δεν στέλνει μέσω της σήραγγας, που συνήθως σημαίνει ότι ο κανόνας SNAT δεν εφαρμόστηκε ή ότι το δικό του firewall του peer απέρριψε τη ροή.
Κάντε επανεκκίνηση μία φορά για να αποδείξετε ότι το PostUp εφαρμόζει ξανά τους κανόνες, μετά σταματήστε τη σήραγγα και επιβεβαιώστε ότι το PreDown τους αφαίρεσε. Οι νεκροί κανόνες που επιβιώνουν από αποσύνδεση είναι ο λόγος που μια μεταγενέστερη αλλαγή συμπεριφέρεται απρόβλεπτα.
Τέλος, δεχτείτε τι κοστίζει το SNAT. Η υπηρεσία βλέπει κάθε αίτημα σαν να προέρχεται από τον διαμεσολαβητή, οπότε τα αρχεία καταγραφής πρόσβασης, τα όρια ρυθμού ανά πελάτη και οι λίστες επιτρεπόμενων διευθύνσεων δεν ξεχωρίζουν πια χρήστες. Η περίπτωση hairpin χρειάζεται τη δική της μετάφραση πηγής για πελάτες στο LAN του διαμεσολαβητή. Αν ο peer χρειάζεται πραγματικές διευθύνσεις πελατών, η εναλλακτική είναι μια διαδρομή επιστροφής προς το δίκτυο του πελάτη, που είναι περισσότερη δουλειά αλλά διατηρεί την πληροφορία.