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

Ξεκινήστε από την οπτική του πελάτη

Ο πελάτης σε αυτό το παράδειγμα βρίσκεται στη δεξαμενή VPN 10.62.0.0/24 και συνδέεται στη 10.62.0.1 στη θύρα 8080. Αυτή η διεύθυνση ανήκει στην ίδια την πύλη, οπότε το πακέτο φτάνει στον πυρήνα της πύλης και όχι σε άλλο ομότιμο. Πίσω από την πύλη, το LAN είναι 172.21.4.0/24. Η πύλη κρατά τη 172.21.4.10 και η συσκευή που πραγματικά εξυπηρετεί HTTP είναι η 172.21.4.40.

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

Ορίστε σκόπιμα το εύρος της μετάφρασης προορισμού

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

iptables -t nat -A PREROUTING -i tun0 -s 10.62.0.0/24 -d 10.62.0.1 -p tcp --dport 8080 -j DNAT --to-destination 172.21.4.40:80

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

Αφήστε τα όρια προώθησης να συμφωνήσουν

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

iptables -A FORWARD -i tun0 -o lan0 -d 172.21.4.40 -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

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

Η συσκευή πρέπει κάπως να απαντήσει

Μετά τη μετάφραση η συσκευή βλέπει μια πηγή στο 10.62.0.0/24. Η απάντησή της πηγαίνει στην προεπιλεγμένη πύλη της, που είναι ο δρομολογητής του LAN, όχι η πύλη VPN, εκτός αν κάτι της πει διαφορετικά. Δύο ρυθμίσεις το διορθώνουν και δεν είναι ισοδύναμες. Μια διαδρομή στη συσκευή ή στον δρομολογητή του LAN στέλνει το 10.62.0.0/24 στη 172.21.4.10 διατηρώντας την πηγή του πελάτη. Μια περιορισμένη μετάφραση πηγής κρύβει αντ' αυτού τον πελάτη πίσω από τη διεύθυνση LAN της πύλης.

ip route add 10.62.0.0/24 via 172.21.4.10 dev eth1
iptables -t nat -A POSTROUTING -s 10.62.0.0/24 -d 172.21.4.40 -o lan0 -p tcp --dport 80 -j SNAT --to-source 172.21.4.10

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

Μην δοκιμάζετε από την ίδια την πύλη

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

conntrack -L | grep 172.21.4.40
tcpdump -ni any 'port 8080 or port 80'

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

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