Μετά την αλλαγή της IP του διακομιστή, ο κανόνας SNAT εξακολουθεί να δείχνει την παλιά
Ένα τούνελ μπορεί να συνδεθεί ενώ κάθε προωθημένο πακέτο κολλάει, επειδή ο κανόνας μετάφρασης εξακολουθεί να ξαναγράφει σε μια διεύθυνση που ο ξενιστής δεν κατέχει πλέον.
Ο διακομιστής μετακινήθηκε σε μια νέα διεύθυνση, οι πελάτες εξακολουθούν να συνδέονται, και τίποτα από όσα στέλνουν δεν φτάνει στο διαδίκτυο. Αυτός ο διαχωρισμός είναι το στοιχείο: η υποδοχή ακρόασης και η προώθηση θύρας επιβίωσαν της μετακίνησης, οπότε το τούνελ ανεβαίνει, ενώ η μετάφραση προέλευσης που εφαρμόζεται στα προωθημένα πακέτα εξακολουθεί να δείχνει μια διεύθυνση που ο ξενιστής δεν κατέχει πλέον. Οι απαντήσεις σε αυτά τα ξαναγραμμένα πακέτα πηγαίνουν σε ένα μηχάνημα που δεν υπάρχει πια.
Η σύνδεση και η προώθηση αποτυγχάνουν σε διαφορετικά σημεία
Η εγκαθίδρυση εξαρτάται από το τελικό σημείο που γνωρίζουν ήδη οι πελάτες: τη δημόσια διεύθυνση, την προώθηση θύρας μπροστά της και τον ακροατή στο εσωτερικό. Η προωθημένη κίνηση εξαρτάται από μια δεύτερη απόφαση που λαμβάνεται αφού το πακέτο μπει στο τούνελ, όταν ο ξενιστής ξαναγράφει την προέλευσή του ώστε οι απαντήσεις να βρουν τον δρόμο της επιστροφής.
Μια αλλαγή διεύθυνσης σπάει μόνο τη δεύτερη απόφαση, και γι' αυτό το σύμπτωμα διαβάζεται ως "συνδεδεμένο αλλά χωρίς διαδίκτυο". Εξηγεί επίσης γιατί οι συνήθεις έλεγχοι στην πλευρά του πελάτη φαίνονται υγιείς: η χειραψία ολοκληρώνεται, ο πελάτης λαμβάνει μια διεύθυνση, και ακόμη και ένα ping στη διεύθυνση τούνελ του διακομιστή μπορεί να απαντήσει. Ώρες ξοδεύονται στον πελάτη για μια βλάβη που ζει στην άλλη πλευρά, γι' αυτό ο πίνακας κανόνων είναι το πρώτο σημείο για να κοιτάξεις.
Διάβασε τον κανόνα και τους μετρητές του πριν από την επεξεργασία
Κατέγραψε τους κανόνες μετάφρασης με τους μετρητές τους και σύγκρινε τη ρυθμισμένη προέλευση με τις διευθύνσεις που κατέχει πραγματικά ο ξενιστής. Ένας κανόνας που ξαναγράφηκε σε μια νεκρή διεύθυνση συνήθως δείχνει κίνηση στην εισερχόμενη διαδρομή, επειδή τα πακέτα φτάνουν σε αυτόν και μεταφράζονται, και τίποτα στην επιστροφή.
sudo iptables -t nat -L POSTROUTING -n -v --line-numbers
ip -4 addr show
Έλεγξε τρία πεδία όσο είσαι εκεί: το σύνολο στην αντιστοίχιση προέλευσης, τη διεπαφή εξόδου αν ο κανόνας ονομάζει κάποια, και την εξαίρεση που εμποδίζει την κίνηση μεταξύ τούνελ να ξαναγραφτεί. Αυτή η εξαίρεση χάνεται εύκολα κατά την επεξεργασία, και η απώλειά της κάνει την κίνηση μεταξύ ομοτίμων να φαίνεται ότι λειτουργεί ενώ οι απαντήσεις της παίρνουν ένα παράξενο μονοπάτι.
Αν οι μετρητές μένουν στο μηδέν, τα πακέτα δεν φτάνουν ποτέ σε αυτόν τον κανόνα και η διεύθυνση δεν είναι το τρέχον πρόβλημα. Ψάξε για ανταγωνιστικό κανόνα νωρίτερα στην αλυσίδα, που συμβαίνει όταν κάποιος προσθέτει αντικατάσταση αντί να επεξεργαστεί το αρχικό. Σύγκρινε τους αριθμούς κανόνων με την έξοδο που κατέγραψες πριν από ένα λεπτό. Η σειρά είναι μέρος της διαμόρφωσης, όχι καλλυντική λεπτομέρεια.
Αντικατέστησε την προέλευση ή σταμάτα να ονομάζεις μία
Όταν ο ξενιστής έχει σταθερή διεύθυνση, αντικατέστησε τον κανόνα στη θέση του αντί να προσθέσεις άλλον. Η αντικατάσταση κατά αριθμό κανόνα διατηρεί τη σειρά από την οποία εξαρτάται η υπόλοιπη αλυσίδα.
sudo iptables -t nat -R POSTROUTING 1 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source 10.151.0.40
Όταν η διεύθυνση εκχωρείται δυναμικά, μην ονομάζεις καθόλου προέλευση και άφησε τον πυρήνα να επιλέξει την τρέχουσα από τη διεπαφή εξόδου. Αυτή η παραλλαγή επιβιώνει από την επόμενη μετακίνηση χωρίς επεξεργασία, με το κόστος να κρύβει ποια διεύθυνση χρησιμοποιήθηκε.
sudo iptables -t nat -R POSTROUTING 1 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -o eth0 -j MASQUERADE
Επιβεβαίωσε ότι η προώθηση IPv4 είναι ακόμη ενεργοποιημένη μέσω διαχειριζόμενης διαμόρφωσης και μετά κάνε τον κανόνα μόνιμο με τον μηχανισμό της ίδιας της διανομής. Μια αλλαγή που έγινε μόνο στον εκτελούμενο πυρήνα επιστρέφει με την επόμενη επανεκκίνηση, συνήθως σε ένα παράθυρο συντήρησης που κανείς δεν συνδέει με την αλλαγή.
Δύο τρόποι να κάνεις την αντικατάσταση λάθος
Η μετάφραση του συνόλου στη διεύθυνση τούνελ του διακομιστή αντί για τη διεύθυνση LAN του στέλνει τις απαντήσεις κατευθείαν πίσω στο τούνελ, όπου δρομολογούνται προς έναν πελάτη που δεν τις ζήτησε ποτέ. Η σύνδεση κολλάει με τρόπο που μοιάζει με βρόχο δρομολόγησης, γιατί είναι βρόχος.
Η στοίβαξη δεύτερης μετάφρασης πάνω στην παλιά είναι το άλλο λάθος. Κερδίζει ο πρώτος κανόνας που ταιριάζει, οπότε η παλιά καταχώριση συνεχίζει να χειρίζεται πακέτα μέχρι να διαγραφεί, και οι μετρητές του νέου κανόνα μένουν στο μηδέν ενώ όλοι κατηγορούν την αντικατάσταση. Διάγραψε το διπλότυπο πριν προσθέσεις οτιδήποτε νέο. Μετά διάβασε τη λίστα άλλη μία φορά και επιβεβαίωσε ότι ακριβώς μία μετάφραση ταιριάζει με το σύνολο.
Αν το τούνελ μεταφέρει και IPv6, επανάλαβε ολόκληρη την ανασκόπηση στη άλλη στοίβα. Μια προεπιλεγμένη διαδρομή IPv6 χωρίς μετάφραση και χωρίς δρομολογημένο πρόθεμα αποτυγχάνει εξίσου αθόρυβα, και είναι εύκολο να το ξεχάσεις γιατί όλα από πάνω μοιάζουν ίδια.
Οι εισερχόμενες υπηρεσίες χρειάζονται την αντίστροφη μετάφραση
Μια υπηρεσία σε πελάτη VPN που πρέπει να είναι προσβάσιμη από έξω χρειάζεται μετάφραση προορισμού, όχι προέλευσης: η δημόσια θύρα ξαναγράφεται στη διεύθυνση τούνελ του πελάτη πριν εισέλθει. Η διαδρομή προώθησης χρειάζεται τότε ρητό κανόνα που επιτρέπει αυτή την κίνηση.
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.9.8.2:8080
Μην μεταφράζεις ποτέ τη θύρα που μεταφέρει το ίδιο το τούνελ, γιατί αυτή η ξαναγραφή διακόπτει τη σύνδεση που κρατά την υπηρεσία προσβάσιμη. Κράτησε τη θύρα τούνελ εντελώς έξω από τους κανόνες προορισμού. Στο τέλος επαλήθευσε και από τις δύο πλευρές: μετρητές στον νέο κανόνα, μια σύντομη καταγραφή στη συσκευή τούνελ και ένα αίτημα σε διεύθυνση μέσα στο τούνελ πριν δοκιμάσεις τη δημόσια.