OpenVPN μέσω SOCKS5: ταίριασμα έκδοσης, μεταφοράς και DNS
Η αλυσίδα SOCKS αποτυγχάνει όταν η έκδοση του proxy, η μεταφορά ή η διαδρομή DNS δεν συμφωνούν. Ταιριάξτε το SOCKS5, μεταφέρετε TCP και κρατήστε την αλυσίδα μέσα σε έναν χώρο ονομάτων.
Μία διαδρομή προς τα έξω από αυτόν τον σταθμό εργασίας είναι ένα proxy SOCKS, και το OpenVPN πίσω του αναφέρει λήξη χρόνου σύνδεσης χωρίς καμία χρήσιμη λεπτομέρεια. Το πρόγραμμα περιήγησης στο ίδιο μηχάνημα λειτουργεί μέσω αυτού του proxy, τα διαπιστευτήρια είναι σωστά και η θύρα απαντά. Τρία πράγματα διαφέρουν αρκετά συχνά ώστε να ελεγχθούν πρώτα: η έκδοση SOCKS που μιλά το proxy, η μεταφορά που επέλεξε ο πελάτης και το σημείο όπου γίνεται η επίλυση ονομάτων. Επιβεβαιώστε καθένα πριν κατηγορήσετε το τείχος προστασίας.
Ταιριάξτε την έκδοση SOCKS πριν από το τείχος προστασίας
Το OpenVPN κοινότητας μιλά SOCKS5 για το socks-proxy. Στρέψτε το σε proxy που προσφέρει μόνο SOCKS4 και η σύνδεση TCP ανοίγει και μετά κολλάει, γιατί ο πελάτης περιμένει απάντηση σε έναν χαιρετισμό που η άλλη πλευρά δεν αναλύει ποτέ. Από έξω, αυτή η κόλληση μοιάζει ακριβώς με φιλτραρισμένη θύρα, γι' αυτό το ερώτημα της έκδοσης έρχεται πριν από κάθε κανόνα τείχους προστασίας. Μία λήψη με γνώση SOCKS το λύνει με μία εντολή.
curl --socks5-hostname 127.0.0.1:9050 gw.lab.example
Ένα ολοκληρωμένο αίτημα αποδεικνύει δύο πράγματα μαζί: το proxy δέχτηκε το αίτημα SOCKS και έλυσε το όνομα. Δεν χρειάζεται σχήμα URL, γιατί το curl θεωρεί τον γυμνό κεντρικό υπολογιστή ως HTTP, κι αυτό αρκεί για αυτή τη δοκιμή.
Αυτή η λήψη αποκλείει και την αποτυχία που κρύβει το αρχείο καταγραφής του πελάτη. Το proxy μπορεί να επιτρέπει το πρόγραμμα περιήγησης και να αρνείται τον προορισμό VPN, οπότε η άρνηση γίνεται στο CONNECT, πριν από κάθε έλεγχο ταυτότητας VPN. Το OpenVPN αναφέρει μόνο λήξη χρόνου, άρα η απάντηση του ίδιου του proxy είναι η απόδειξη που χρειάζεστε.
Η μεταφορά πρέπει να είναι TCP και στις δύο πλευρές
Εδώ το SOCKS5 μεταφέρει ροή TCP, άρα η ίδια η σήραγγα χρειάζεται proto tcp-client. Ένα προφίλ που είναι ακόμη σε UDP δεν θα δουλέψει από αυτή τη διαδρομή, γιατί ο πελάτης δεν χρησιμοποιεί τη λειτουργία συσχέτισης UDP του πρωτοκόλλου. Η αναστροφή του προφίλ είναι πραγματική αλλαγή και όχι τυπικότητα: η μακρινή πλευρά πρέπει να ακούει TCP στην ίδια θύρα. Έπειτα το φορτίο γίνεται TCP μέσα σε TCP, όπου το χαμένο τμήμα αναμεταδίδεται δύο φορές και ο ρυθμός χειροτερεύει, κάτι που οι διαδραστικές συνεδρίες το αισθάνονται πολύ περισσότερο από τις μεγάλες μεταφορές.
proto tcp-client
remote gw.lab.example 8443
socks-proxy 127.0.0.1 9050
Η οδηγία δέχεται τον κεντρικό υπολογιστή του proxy, προαιρετική θύρα και προαιρετικό αρχείο διαπιστευτηρίων. Βάλτε τα στο ίδιο το προφίλ ώστε ένα αντίγραφο αλλού να συμπεριφέρεται ίδια.
Περιορίστε ολόκληρη την αλυσίδα σε ένα container
Το να κάνετε την αλυσίδα στον κεντρικό υπολογιστή σημαίνει να καταλάβετε την προεπιλεγμένη του διαδρομή και να αφήσετε τον επιλυτή σε κατάσταση που κανείς δεν θα εξηγήσει αργότερα. Ένας χώρος ονομάτων ή ένα container την περιορίζει αντί γι' αυτό, ώστε ο κεντρικός υπολογιστής να κρατά τη δική του διαδρομή ενώ το άλμα SOCKS και η σήραγγα ζουν μαζί. Τίποτα δεν σηκώνεται μέσα χωρίς συσκευή σήραγγας, δικαιώματα ρύθμισης αυτής της συσκευής και προσβάσιμο proxy. Μια υπηρεσία Compose το πετυχαίνει με cap_add: NET_ADMIN και bind-mounted /dev/net/tun.
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
Αυτό το ζεύγος είναι στενότερο από το να τρέχετε το container με πλήρη δικαιώματα, και είναι ολόκληρη η απαιτούμενη πρόσβαση στη συσκευή. Ένας πελάτης Tor ή ξεχωριστό container proxy μπορεί να παρέχει τον ακροατή. Και στις δύο περιπτώσεις δεσμεύστε το στο loopback και φτάστε σε αυτό από τον χώρο ονομάτων μέσω του κεντρικού υπολογιστή αντί να εκθέτετε το proxy στο δίκτυο.
Η επίλυση ονομάτων είναι το σημείο όπου αποτυγχάνει η απομόνωση
Μια σήραγγα που μεταφέρει πακέτα και ταυτόχρονα ρωτά τον επιλυτή του κεντρικού υπολογιστή δεν απομόνωσε τίποτα. Δύο πράγματα κάνουν την απομόνωση αληθινή: ο χώρος ονομάτων έχει δικό του επιλυτή και τα ερωτήματά του περνούν από το proxy ή τη σήραγγα, ποτέ από τη φυσική διεπαφή. Για τη δοκιμή χρησιμοποιήστε δύο ονόματα: ένα που υπάρχει μόνο πίσω από τη σήραγγα και ένα δημόσιο που πρέπει να ακολουθήσει την ίδια διαδρομή.
docker compose exec vpn cat /etc/resolv.conf
docker compose exec vpn getent hosts internal.lab.example
Αν το μακρινό όνομα λύνεται και το δημόσιο όχι, η αλυσίδα είναι επιλεκτική και όχι σπασμένη, και η διαφορά σας λέει ποια διαδρομή πήρε κάθε ερώτημα. Αν και τα δύο λύνονται από τον κεντρικό υπολογιστή αλλά κανένα μέσα στο container, το container δανείζεται ακόμη τον επιλυτή του κεντρικού υπολογιστή. Καταγράψτε το αρχείο επιλυτή που βρήκατε, γιατί αυτή είναι η ρύθμιση που πρέπει να αλλάξει.
Αποδείξτε κάθε άλμα με τη σειρά
Η λίστα είναι σύντομη. Ένα αίτημα SOCKS5 παίρνει απάντηση, η σήραγγα φτάνει στον ακροατή της μέσω του proxy και τα πακέτα που φεύγουν από τον χώρο ονομάτων κουβαλούν τη διεύθυνση που περιμένει η μακρινή πλευρά. Επιβεβαιώστε ένα-ένα αντί να προσθέτετε κι άλλη ρύθμιση. Όταν ο πελάτης λέει συνδεδεμένο και τίποτα δεν κινείται, η διακοπή είναι σχεδόν πάντα στο δεύτερο ή το τρίτο γεγονός.
curl --socks5-hostname 127.0.0.1:9050 gw.lab.example
docker compose exec vpn ip route get 203.0.113.10
docker compose exec vpn getent hosts internal.lab.example
Γράψτε τον συνδυασμό που δούλεψε: έκδοση SOCKS, μεταφορά, επιλυτής και ρυθμίσεις χώρου ονομάτων. Το να λύσετε ξανά αυτή την αλυσίδα από μνήμης κοστίζει περισσότερο από τη σημείωση. Κρατήστε τα τέσσερα αυτά γεγονότα στο δελτίο και όχι στη συνομιλία.
Μια αλυσίδα που αναφέρει συνδεδεμένο και δεν περνά τίποτα συνήθως απέτυχε στο άλμα που δεν έχετε αποδείξει ακόμη. Δοκιμάστε αυτό το άλμα πριν προσθέσετε άλλο επίπεδο.