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

Δύο μορφές, ένα σημείο συνάντησης

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

ssh -N -R 8081:127.0.0.1:8080 -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 [email protected]

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

Καμία από τις δύο μορφές δεν είναι ασφαλέστερη εκ κατασκευής. Και οι δύο εκθέτουν μια θύρα υπηρεσίας σε όποιον μπορεί να φτάσει τη δημόσια διεύθυνση του διακομιστή, και οι δύο εξαρτώνται ακόμη από την ταυτοποίηση της ίδιας της υπηρεσίας.

Συνθήκη πρώτη: πρέπει η θύρα να ζήσει περισσότερο από τη συνεδρία

Μια αντίστροφη προώθηση ζει ακριβώς όσο η συνεδρία SSH που τη δημιούργησε. Όταν πέσει ο σύνδεσμος, ο ακροατής εξαφανίζεται και ο συνάδελφος βλέπει άρνηση σύνδεσης αντί για αργή διαδρομή. Η εποπτεία της εντολής με μονάδα systemd και πολιτική επανεκκίνησης το διορθώνει, και το ExitOnForwardFailure=yes κάνει αμέσως ορατή μια αποτυχημένη δέσμευση αντί να αφήνει συνεδρία χωρίς προώθηση.

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

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

Συνθήκη δεύτερη: ποιος κατέχει το τείχος προστασίας και τα αρχεία καταγραφής

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

sudo ss -ltn '( sport = :8081 )'
sudo grep -E '^(GatewayPorts|AllowTcpForwarding)' /etc/ssh/sshd_config

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

sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8081 -j DNAT --to-destination 10.88.0.6:8080
sudo iptables -t nat -A POSTROUTING -o tun0 -m conntrack --ctstate DNAT -j SNAT --to-source 10.88.0.1

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

Συνθήκη τρίτη: μία θύρα ή πολλές, και ποιος κατέχει το όνομα

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

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

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

Αποφασίστε και μετά δοκιμάστε από έξω

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

sudo iptables -t nat -L PREROUTING -n -v
sudo tcpdump -ni any 'tcp port 8081' -c 20

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

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

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