Το eth0:0 είναι ετικέτα, όχι συσκευή: διόρθωσε το ταίριασμα SNAT
Ένας μηδενικός μετρητής σημαίνει ότι ο κανόνας ονομάζει μια διεπαφή που δεν μπορεί να υπάρξει. Διάβασε την πραγματική συσκευή, διόρθωσε το ταίριασμα -o και μετά διάλεξε συνειδητά τη μεταφρασμένη διεύθυνση.
Ένας κανόνας NAT που υποτίθεται ότι δίνει σε μια πισίνα πελατών VPN τη δική της δημόσια διεύθυνση κάθεται στα μηδέν πακέτα, ενώ η ίδια πισίνα συνεχίζει να βγαίνει με λάθος πηγή. Ο κανόνας συνήθως δεν κάνει λάθος στη διεύθυνση· κάνει λάθος στη διεπαφή. -o eth0:0 αναφέρεται σε μια συσκευή που δεν υπάρχει, επειδή eth0:0 είναι μια ετικέτα προσαρτημένη σε μια διεύθυνση στη eth0. Το να κοιτάς τους μετρητές είναι ο πιο γρήγορος τρόπος να το επιβεβαιώσεις, και η διόρθωση είναι μικρότερη απ ό,τι υπονοεί η έρευνα.
Έλεγξε πώς ο πυρήνας ονομάζει τη συσκευή
Διάβασε τις δύο όψεις χωριστά πριν αλλάξεις οτιδήποτε:
ip link show
ip address show dev eth0
ip route get 203.0.113.20
Η λίστα συνδέσμων δείχνει διεπαφές. Η λίστα διευθύνσεων μπορεί να δείχνει μια δεύτερη διεύθυνση IPv4 που φέρει την ετικέτα eth0:0, και η συσκευή για αυτή τη διεύθυνση είναι ακόμα eth0. Το εγχειρίδιο διευθύνσεων του iproute2 αντιμετωπίζει την ετικέτα ως όνομα της διεύθυνσης, όχι ως δεύτερο σύνδεσμο, και αυτή είναι η διάκριση γύρω από την οποία περιστρέφεται όλο το πρόβλημα.
Η ιστορία εξηγεί τη σύγχυση. Η παλιά ifconfig eth0:0 σύνταξη έμοιαζε πραγματικά με νέα διεπαφή, και σενάρια εκείνης της εποχής εξακολουθούν να αναφέρονται σε μία. Σε ένα σύγχρονο σύστημα, το ψευδώνυμο είναι ετικέτα σε μια διεύθυνση, και τίποτα στη διαδρομή δρομολόγησης ή του netfilter δεν το αντιμετωπίζει ως ξεχωριστό σημείο εξόδου.
Έλεγξε τι πραγματικά ταίριαξε ο κανόνας
Διάβασε τους μετρητές μαζί με τη λίστα κανόνων αντί από μνήμης:
iptables -t nat -L POSTROUTING -v -n --line-numbers
Ένας κανόνας του οποίου ο μετρητής πακέτων μένει στο μηδέν ενώ ρέει ταιριαστή κίνηση δεν αξιολογείται, και μια συνθήκη διεπαφής εξόδου που ονομάζει eth0:0 είναι συνηθισμένη αιτία. Η συσκευή εξόδου που επέλεξε το δρομολόγιο είναι eth0, οπότε μια συνθήκη που ψάχνει άλλο όνομα δεν γίνεται ποτέ αληθινή, ανεξάρτητα από τη διεύθυνση πηγής που επέλεξε ο πυρήνας.
Άλλαξε τη συνθήκη στη σωστή συσκευή και άφησε την ετικέτα έξω από αυτήν. Αν πρέπει να ξεχωρίσεις δύο πισίνες πελατών που μοιράζονται αυτή τη συσκευή, ξεχώρισέ τις κατά πρόθεμα πηγής, όχι κατά όνομα διεπαφής που δεν μπορεί να υπάρξει. Δύο κανόνες με μη επικαλυπτόμενα -s ταιριάσματα είναι αναγνώσιμοι και ελέγξιμοι· ένας κανόνας με φανταστική συσκευή δεν είναι ούτε το ένα ούτε το άλλο. Δώσε σε κάθε κανόνα ένα σχόλιο που ονομάζει την πισίνα, γιατί σε έξι μήνες το πρόθεμα μόνο του δεν θα λέει σε κανέναν γιατί βρίσκεται εκεί.
Έλεγξε το δρομολόγιο που επέλεξε τη συσκευή
Το NAT postrouting εκτελείται αφού το δρομολόγιο έχει ήδη επιλέξει διεπαφή εξόδου, άρα η διεπαφή στον κανόνα πρέπει να είναι αυτή που επέλεξε το δρομολόγιο. Ρώτησε απευθείας τον πυρήνα με ip route get για μια αντιπροσωπευτική διεύθυνση πελάτη και διάβασε και τη συσκευή και την πηγή που αναφέρει.
Αν η απάντηση ονομάζει eth0, το τμήμα διεπαφής του κανόνα έχει κριθεί. Αν ονομάζει συσκευή σήραγγας, το πακέτο δεν φτάνει ποτέ στον κανόνα που επεξεργάζεσαι, και η έρευνα μετακινείται στον πίνακα δρομολόγησης και τις προτεραιότητές του. Ένας κανόνας που δεν ταιριάζει ποτέ επειδή το πακέτο έφυγε αλλού φαίνεται στην έξοδο μετρητών ίδιος με έναν κανόνα με λανθασμένη ονομασία συσκευής. Επιβεβαίωσε ποια από τις δύο περιπτώσεις έχεις πριν αλλάξεις οτιδήποτε, γιατί η δεύτερη χρειάζεται αλλαγή δρομολόγησης και όχι κειμένου.
Διάλεξε συνειδητά τη μεταφρασμένη πηγή
Μόλις η συσκευή είναι σωστή, η διεύθυνση πηγής είναι ξεχωριστή απόφαση. Αυτή είναι μόνο μια ενδεικτική πισίνα IPv4 και μια διεύθυνση παραδείγματος:
iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 \
-j SNAT --to-source 203.0.113.20
Το να γράψεις μια διεύθυνση στο --to-source δεν κάνει κανέναν να τη δρομολογήσει πίσω σε εσένα. Ο ανάντη πάροχος ή ο κάτοχος της διεύθυνσης πρέπει να παραδίδει τις απαντήσεις για αυτή τη διεύθυνση σε αυτόν τον υπολογιστή, και η διεύθυνση πρέπει να είναι μία που έχεις εξουσιοδότηση να χρησιμοποιείς. Αν δεν είναι, ο κανόνας θα ταιριάξει και θα μεταφράσει και οι απαντήσεις θα πάνε πάλι αλλού.
Η αλλαγή της διεύθυνσης πηγής δεν είναι το ίδιο με την αλλαγή της ανάντη ζεύξης. Όταν η πραγματική απαίτηση είναι διαφορετική φυσική διαδρομή, η πολιτική δρομολόγησης πρέπει πρώτα να επιλέξει αυτή τη διαδρομή· το SNAT μετά ξαναγράφει την πηγή στη συσκευή που επέλεξε η πολιτική. Περισσότερες ετικέτες στο eth0 δεν παρέχουν ούτε τη διαδρομή ούτε την εξουσιοδότηση.
Επαλήθευσε με μια σύνδεση που μόλις άνοιξες
Άνοιξε μια νέα σύνδεση πελάτη αντί να επαναχρησιμοποιήσεις μια υπάρχουσα. Η παρακολούθηση συνδέσεων κρατά τη μετάφραση που κατέγραψε όταν ξεκίνησε η ροή, οπότε μια παλιά συνεδρία μπορεί να συνεχίσει να χρησιμοποιεί την προηγούμενη διεύθυνση πηγής και να κάνει έναν σωστό νέο κανόνα να φαίνεται χαλασμένος. Παρατήρησε τον μετρητή να αυξάνεται και μετά δες τη μεταφρασμένη πηγή στο καλώδιο ή στο απομακρυσμένο άκρο.
Για πολλές πισίνες που μοιράζονται μία διεπαφή, δώσε σε καθεμία ρητό ταίριασμα πηγής και δική της διεύθυνση μετάφρασης, κράτησέ τες στη διαχειριζόμενη διαμόρφωση του τείχους προστασίας και σημείωσε τη σειρά με την οποία αξιολογούνται. Μετά κατέγραψε τι επαλήθευσες: τη συσκευή από ip route get, τον μετρητή που κινήθηκε και την πηγή που είδε η απομακρυσμένη πλευρά. Αυτή η καταγραφή απαντά στην επόμενη αναφορά χωρίς να επαναλαμβάνει τη σύγχυση του ψευδωνύμου.