Βάλτε μια υπηρεσία σε φορητό υπολογιστή πίσω από NAT επιπέδου παρόχου, στρέψτε αυτόν τον φορητό σε ένα VPS μέσω VPN, και κανείς έξω δεν μπορεί να το φτάσει. Προσθέτετε έναν κανόνα NAT προορισμού στο VPS και παίρνετε κάτι χειρότερο από σιωπή: οι συνδέσεις ανοίγουν και μετά κολλάνε. Η απάντηση δεν λείπει, φεύγει από την προεπιλεγμένη διαδρομή του ίδιου του πελάτη, που σημαίνει ότι ο διακομιστής δεν τη βλέπει ποτέ. Περάστε αυτούς τους πέντε ελέγχους με σειρά και σταματήστε στον πρώτο που δεν στέκει.

Επιβεβαιώστε ότι ο διακομιστής θα προωθήσει καθόλου

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

sysctl net.ipv4.ip_forward
sysctl -w net.ipv4.ip_forward=1

Το να το θέσετε σε έναν πυρήνα που τρέχει δεν είναι το ίδιο με το να το θέσετε μέσα από επανεκκίνηση. Γράψτε το net.ipv4.ip_forward=1 σε ένα αρχείο κάτω από το /etc/sysctl.d/, εκτελέστε το sysctl --system και μετά διαβάστε την τιμή πίσω αντί να εμπιστευτείτε ότι το αρχείο έγινε δεκτό. Ένα κοντέινερ που διαχειρίζεται τον δικό του χώρο ονομάτων δικτύου χρειάζεται την ίδια τιμή μέσα σε αυτόν τον χώρο, όχι μόνο στον κεντρικό υπολογιστή.

Αν η ανάγνωση είναι ακόμη μηδέν, σταματήστε εδώ. Τίποτα πιο κάτω δεν θα δουλέψει.

Καρφιτσώστε τη διεύθυνση της σήραγγας πριν την αναφέρει οποιοσδήποτε κανόνας

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

client-config-dir /etc/openvpn/ccd
ifconfig-push 10.77.0.14 10.77.0.13

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

Αν η διεύθυνση αλλάξει μετά από επανασύνδεση, σταματήστε. Ένας κανόνας NAT που ακολουθεί κινούμενο στόχο θα αποτυγχάνει κατά διαστήματα και δεν θα σας μάθει τίποτα.

Μεταφράστε και προς τις δύο κατευθύνσεις

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

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 29443 -j DNAT --to-destination 10.77.0.14:29443
iptables -t nat -A POSTROUTING -d 10.77.0.14 -p tcp --dport 29443 -j SNAT --to-source 10.77.0.13

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

Διαβάστε και τους δύο κανόνες πίσω με το iptables -t nat -S και επιβεβαιώστε ότι το όνομα διεπαφής είναι αυτό που φέρει τη δημόσια διεύθυνση. Σε έναν κεντρικό υπολογιστή που φιλτράρει ήδη με nftables, γράψτε τη μετάφραση σε αλυσίδα NAT του nftables της αντίστοιχης οικογένειας διευθύνσεων αντί να αναμειγνύετε εργαλεία.

Αφήστε τον πίνακα φίλτρων να περάσει

Οι πίνακες NAT ξαναγράφουν κεφαλίδες, δεν δίνουν άδεια. Με προεπιλεγμένη πολιτική DROP η προωθούμενη ροή χρειάζεται τη δική της αποδοχή, συν την κατεύθυνση επιστροφής που οι περισσότερες πολιτικές καλύπτουν ήδη με κανόνα established,related.

iptables -A FORWARD -i eth0 -o tun0 -p tcp --dport 29443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Ελέγξτε την πολιτική της αλυσίδας FORWARD πριν προσθέσετε οτιδήποτε, γιατί η σειρά ενός πρώιμου DROP καθορίζει αν ο κανόνας σας θα ερωτηθεί ποτέ. Σε έναν κεντρικό υπολογιστή του οποίου το φιλτράρισμα ζει στο nftables, προσθέστε τον ισοδύναμο κανόνα στο άγκιστρο forward του πίνακα inet και επιβεβαιώστε ότι η βασική αλυσίδα βλέπει πράγματι προωθούμενη κίνηση και όχι μόνο τοπική είσοδο. Αν ένας μετρητής πακέτων στον νέο κανόνα μένει στο μηδέν ενώ οι μετρητές NAT ανεβαίνουν, το πακέτο απορρίπτεται πριν από τον κανόνα σας. Αυτό είναι το σήμα να διαβάσετε τη σειρά των αλυσίδων, όχι να προσθέσετε δεύτερο αντίγραφο του ίδιου κανόνα.

Αποδείξτε το από εξωτερικό δίκτυο

Δοκιμάστε από ένα άσχετο δίκτυο. Ένας έλεγχος από άλλο μηχάνημα στο ίδιο LAN μπορεί να περάσει μέσα από υποστήριξη hairpin NAT και να μην ασκήσει ποτέ τη διαδρομή που χρησιμοποιεί ένας απομακρυσμένος πελάτης, οπότε ένα πράσινο αποτέλεσμα εκεί αποδεικνύει το λάθος πράγμα.

tcpdump -ni any port 29443
conntrack -L | grep 29443

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

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

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