Δυναμική προώθηση SSH ως διαμεσολαβητής SOCKS πάνω από το VPN σας
Μια εφαρμογή που μιλά μόνο SOCKS δεν έχει σημείο διαμεσολαβητή σε ένα απλό VPN. Δύο άλματα, ένας τοπικός ακροατής και μια αναζήτηση ονόματος που πρέπει να κάνει ο ίδιος ο διακομιστής SSH.
Μια εφαρμογή που μιλά μόνο SOCKS δεν έχει με τι να μιλήσει σε ένα απλό VPN, γιατί η σήραγγα μεταφέρει πακέτα και η εφαρμογή θέλει σημείο διαμεσολαβητή. Το OpenSSH μπορεί να δώσει αυτό το σημείο όταν το επιτρέπει ο κάτοχος της πρόσβασης, αφού η δυναμική προώθηση μετατρέπει μία συνεδρία SSH σε τοπικό διαμεσολαβητή. Έπειτα υπάρχουν δύο άλματα που πρέπει να κρατηθούν ξεχωριστά: η σήραγγα που φτάνει στον κεντρικό υπολογιστή SSH και η σύνδεση που ανοίγει εκείνος στη συνέχεια. Ο διαχωρισμός τους εξηγεί και γιατί δουλεύει η διάταξη και τι δεν θα κάνει ποτέ.
Τι γίνεται ο ακροατής SSH και τι δεν γίνεται
Η δυναμική προώθηση κάνει τον πελάτη SSH να ακούει τοπικά και να μιλά SOCKS4 ή SOCKS5 με ό,τι συνδέεται. Κάθε αίτημα ονομάζει έναν προορισμό και ο διακομιστής SSH ανοίγει τη σύνδεση προς τα εκεί, γι’ αυτό η αναζήτηση του προορισμού μπορεί να γίνει στην απέναντι πλευρά. Αυτή είναι προώθηση TCP σε επίπεδο εφαρμογής, όχι VPN για όλη τη συσκευή. Δεν μεταφέρει σύζευξη UDP, ούτε ICMP, ούτε τίποτα για εφαρμογές που αγνοούν εντελώς τις ρυθμίσεις διαμεσολαβητή. Το άλμα από τον διακομιστή SSH στην εφαρμογή δεν είναι επίσης μέσα στη σήραγγά σας, κάτι που μετρά όταν ο προορισμός δέχεται κίνηση μόνο από γνωστά δίκτυα.
Οι προϋποθέσεις είναι πραγματικές: μια διαδρομή προς τον κεντρικό υπολογιστή SSH, ένας εξουσιοδοτημένος λογαριασμός, ένα επαληθευμένο κλειδί κεντρικού υπολογιστή του διακομιστή και άδεια για προώθηση. Καμία δεν τη δημιουργεί ο διαμεσολαβητής, και η τελευταία λείπει συνήθως πρώτη. Επιβεβαιώστε και τις τέσσερις πριν εντοπίσετε οτιδήποτε άλλο, γιατί η αποτυχία φαίνεται ίδια από τον πελάτη, όποια κι αν λείπει.
Ξεκινήστε το στο loopback με ρητή θύρα
Διαλέξτε μια αχρησιμοποίητη τοπική θύρα και δεσμεύστε την ρητά στο loopback αντί να παραλείψετε τη διεύθυνση. Οι τρεις επιλογές παρακάτω υπάρχουν καθεμία για έναν λόγο.
ssh -D 127.0.0.1:1080 -NT -o ControlPath=none -o ExitOnForwardFailure=yes \
[email protected]
Το -N παραλείπει την απομακρυσμένη εντολή και το -T παραλείπει το ψευδοτερματικό, ώστε η συνεδρία να υπάρχει μόνο για προώθηση. Το ExitOnForwardFailure κάνει τον πελάτη να βγει όταν ο ακροατής δεν μπορεί να δημιουργηθεί, αντί να τρέχει χωρίς την προώθηση που ζητήσατε. Το ControlPath=none κρατά τη συνεδρία έξω από μια υπάρχουσα πολυπλεγμένη σύνδεση που μπορεί να προσθέσει δικές της προωθήσεις. Το loopback κρατά τον ακροατή έξω από το LAN, αλλά σε κοινόχρηστο μηχάνημα δεν είναι όριο εξουσιοδότησης, γιατί μπορούν να το φτάσουν και άλλες τοπικές διεργασίες. Η αναφορά του πελάτη OpenSSH τεκμηριώνει όλες αυτές τις επιλογές, και η προειδοποίηση για το loopback προκύπτει από το τι είναι ένα socket που ακούει.
Στείλτε τα ονόματα μέσα από τον διαμεσολαβητή, όχι γύρω του
Ένας πελάτης SOCKS5 μπορεί να αναλύσει ο ίδιος τον προορισμό ή να ζητήσει από τον διαμεσολαβητή να το κάνει, και αυτή η επιλογή καθορίζει ποιος επιλυτής απαντά. Με το socks5h το curl στέλνει το όνομα κεντρικού υπολογιστή μέσα από τον διαμεσολαβητή, άρα η αναζήτηση γίνεται στον διακομιστή SSH. Με το απλό socks5 ο φορητός αναλύει πρώτος και ταξιδεύει μόνο η σύνδεση, κάτι που υπονομεύει σιωπηλά τον σκοπό όταν το όνομα είναι εσωτερικό. Το αίτημα παρακάτω καθαρίζει επίσης τη λίστα χωρίς διαμεσολαβητή, ώστε μια κληρονομημένη τιμή NO_PROXY να μην μπορεί να το οδηγήσει γύρω από αυτόν.
curl -sS --noproxy '' --proxy socks5h://127.0.0.1:1080 https://app.corp.example/health
Η επικύρωση πιστοποιητικού και η δική της σύνδεση της εφαρμογής ισχύουν ακόμη, γιατί ο διαμεσολαβητής δεν αντικαθιστά κανένα από τα δύο. Απομένουν δύο αναζητήσεις: ο φορητός πρέπει να φτάσει τον κεντρικό υπολογιστή SSH μέσω της επιτρεπόμενης διαδρομής VPN και DNS, και ο διακομιστής SSH πρέπει να αναλύσει ο ίδιος το όνομα της εφαρμογής. Η δεύτερη μπορεί να δοκιμαστεί μόνη της πριν περάσει οποιαδήποτε κίνηση από τον διαμεσολαβητή.
ssh [email protected] getent hosts app.corp.example
Αποδείξτε έναν επιτρεπόμενο προορισμό και μετά κλείστε τη συνεδρία
Δοκιμάστε έναν προορισμό που επιτρέπει η πολιτική και έναν που θα έπρεπε να αρνηθεί, γιατί μια προώθηση που δουλεύει αποδεικνύει μόνο ότι δουλεύει ο ακροατής και τίποτα παραπάνω. Η εφαρμογή βλέπει τη διεύθυνση προέλευσης που διαλέγει ο διακομιστής SSH, και αυτή δεν είναι η διεύθυνση σήραγγας του φορητού σας. Όπου η απέναντι πλευρά καταγράφει συνδέσεις κατά προέλευση, αυτή η διαφορά είναι το πρώτο που πρέπει να ελεγχθεί όταν απορρίπτεται ένα αίτημα.
Σταματήστε τη συνεδρία μέσω της διεργασίας που την κατέχει αντί να σκοτώσετε ένα άσχετο κέλυφος. Μετά επιβεβαιώστε ότι ο ακροατής έφυγε, γιατί μια θύρα που απαντά ακόμη είναι συνεδρία που δεν κλείσατε πραγματικά. Αφαιρέστε μόνο τη ρύθμιση διαμεσολαβητή που εισήγαγε αυτή η άσκηση, και αφήστε την υπόλοιπη διαμόρφωση της εφαρμογής ήσυχη. Ένα τερματικό χωρίς επίβλεψη που κρατά κανόνα προώθησης δεν είναι υπηρεσία, και ένας μόνιμος διαμεσολαβητής χρειάζεται εγκεκριμένο κύκλο ζωής, όχι ένα ξεχασμένο παράθυρο.
ss -ltn | grep 1080
Αστοχίες που αυτή η διάταξη δεν μπορεί να διορθώσει
Κάποια συμπτώματα δείχνουν κατευθείαν στα όρια παραπάνω, και η έγκαιρη αναγνώρισή τους γλιτώνει ένα απόγευμα αποσφαλμάτωσης του διαμεσολαβητή. Ο πίνακας αντιστοιχίζει αυτό που βλέπετε με αυτό που συνήθως σημαίνει. Οτιδήποτε στην τελευταία στήλη είναι ζήτημα σχεδίασης και όχι λάθος διαμόρφωσης.
| What you see | What it usually means | Where to look |
|---|---|---|
| The app connects and nothing follows | It ignores proxy settings entirely | Its own network settings, not the SSH session |
| A name resolution error for the destination | The SSH server cannot resolve it | Server resolver and search domains |
| A UDP-only application fails | Dynamic forwarding carries TCP only | This arrangement cannot serve it |
| curl works, the browser does not | The browser is not using the socks5h endpoint | Browser proxy configuration |
| The listener answers after the session ended | Another process owns port 1080 | The ss output, then the owning process |
Οι τρεις πρώτες γραμμές είναι αυτές που οι άνθρωποι διαγιγνώσκουν λάθος, γιατί καθεμία παράγει μια προσπάθεια σύνδεσης αντί για σφάλμα σχετικά με τον ίδιο τον διαμεσολαβητή. Ένα όνομα που αναλύεται στον φορητό δεν λέει τίποτα για τον επιλυτή του διακομιστή, και η αποτυχία διαβάζεται αντ’ αυτού ως πρόβλημα πιστοποιητικού ή χρονικού ορίου. Οι εφαρμογές μόνο με UDP στέκονται έξω από τη σχεδίαση, όχι σπασμένες μέσα της, και καμία πρόσθετη επιλογή ssh δεν το αλλάζει. Η γραμμή του περιηγητή είναι η συνηθισμένη υπενθύμιση ότι οι ρυθμίσεις διαμεσολαβητή είναι ανά εφαρμογή. Η τελευταία γραμμή είναι ο λόγος που υπάρχει ο έλεγχος κλεισίματος: μια θύρα που ακούει ακόμη σημαίνει ότι τώρα την κατέχει κάτι άλλο.