Το κοντέινερ σήραγγας σας λειτουργεί, το docker compose exec vpn curl -s https://ifconfig.me απαντά με τη διεύθυνση του παρόχου, και όμως το πρόγραμμα περιήγησης στον υπολογιστή σας βγαίνει ακόμη μέσω του ISP σας. Αυτό το χάσμα είναι αναμενόμενο. Ένα κοντέινερ που εκτελεί πελάτη VPN κρατά χώρο ονομάτων δικτύου, διαδρομές και διεπαφή σήραγγας, και τίποτα που να μιλά HTTP ή SOCKS· η δημοσίευση θύρας πάνω του δεν μπορεί να δημιουργήσει ακροατή που δεν υπήρξε ποτέ.

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

Προσαρμόστε τη διάταξη στο σημείο όπου εκτελείται ο πελάτης

Κάντε μία ερώτηση πριν επεξεργαστείτε το Compose: μπορεί ο πελάτης να ξεκινήσει μέσα στον χώρο ονομάτων δικτύου του κοντέινερ VPN; Οτιδήποτε εκτελείται ήδη ως κοντέινερ Linux μπορεί. Ένα πρόγραμμα περιήγησης, ένα IDE ή ένα CLI στον υπολογιστή σας δεν μπορεί, γιατί η ρύθμιση μεσολάβησης περιμένει υπηρεσία πρωτοκόλλου, όχι χώρο ονομάτων.

ClientArrangementWhat must already exist
Another Compose serviceShares the vpn namespace via network_mode: service:vpnA working tunnel and correct start order
Host browser, IDE or CLIProxy listener inside the namespace, published to host loopbackA configured SOCKS or HTTP proxy and its access rules
Router, VM or phoneThe container as a layer-3 gatewayForwarding, NAT and a return route

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

Μοιραστείτε τον χώρο ονομάτων της σήραγγας με γειτονικό κοντέινερ

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

services:
  vpn:
    image: your-vpn-client
    cap_add:
      - NET_ADMIN
    healthcheck:
      test: ["CMD-SHELL", "ip link show tun0 >/dev/null"]
      interval: 10s
      retries: 5
  app:
    image: your-app
    network_mode: service:vpn
    depends_on:
      vpn:
        condition: service_healthy

Τρεις περιορισμοί προκύπτουν από το ότι ο χώρος ονομάτων ανήκει σε άλλη υπηρεσία. Η εφαρμογή δεν παίρνει δικό της κλειδί networks, γιατί δεν έχει χώρο ονομάτων για να προσκολληθεί. Η δημοσίευση θυρών ανήκει στο vpn, αφού εκεί ζει ο χώρος ονομάτων. Και η επαναδημιουργία του vpn καταστρέφει τον χώρο ονομάτων στον οποίο εισήλθε η εφαρμογή, οπότε το docker compose up -d --force-recreate vpn σας αφήνει να επαναδημιουργήσετε και το app· μια απλή επανεκκίνηση δεν αρκεί πάντα. Η αναφορά υπηρεσιών Compose καλύπτει αυτή τη διάταξη και τον περιορισμό της για τη δημοσίευση θυρών.

Μην υποθέσετε ότι ο επιλυτής έρχεται μαζί. Το /etc/resolv.conf είναι αρχείο ανά κοντέινερ και όχι μέρος του χώρου ονομάτων δικτύου, οπότε η εφαρμογή μπορεί ακόμη να ρωτά τον επιλυτή του κεντρικού υπολογιστή ενώ τα πακέτα της φεύγουν μέσα από τη σήραγγα. Διαβάστε το μέσα από το κοντέινερ και ορίστε το dns: στην εφαρμογή όταν ιδιωτικά ονόματα πρέπει να επιλύονται μέσα από τη σήραγγα.

docker compose exec app ip route
docker compose exec app cat /etc/resolv.conf
docker compose exec app curl -s https://ifconfig.me

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

Βάλτε πραγματικό ακροατή μεσολάβησης στον χώρο ονομάτων για πελάτες του κεντρικού υπολογιστή

Ένα πρόγραμμα περιήγησης επιφάνειας εργασίας δεν μπορεί να εισέλθει σε χώρο ονομάτων, οπότε η σήραγγα πρέπει να εκτεθεί ως υπηρεσία. Εκτελέστε πραγματικό μεσολαβητή SOCKS ή HTTP μέσα στον χώρο ονομάτων vpn και δημοσιεύστε μόνο τη θύρα του:

services:
  vpn:
    ports:
      - "127.0.0.1:1080:1080"
  proxy:
    image: your-proxy
    network_mode: service:vpn
    command: ["--socks", "0.0.0.0:1080"]

Η διεύθυνση στην πλευρά του κεντρικού υπολογιστή είναι το σημαντικό μισό αυτής της αντιστοίχισης. Το 127.0.0.1:1080 στα αριστερά κρατά τον ακροατή έξω από το LAN σας· ένα γυμνό "1080:1080" δημοσιεύει ανοιχτό μεσολαβητή σε κάθε συσκευή που μπορεί να φτάσει το μηχάνημά σας.

Η πλευρά του κοντέινερ έχει τη δική της παγίδα. Οι δημοσιευμένες θύρες παραδίδονται στη διεύθυνση του κοντέινερ στη γέφυρα, όχι στο loopback του, οπότε ένας μεσολαβητής που ξεκίνησε με --socks 127.0.0.1:1080 μέσα στον χώρο ονομάτων δέχεται συνδέσεις από γείτονες και απορρίπτει ό,τι φτάνει μέσω της δημοσιευμένης θύρας. Δέστε το στο 0.0.0.0 και βασιστείτε στη δέσμευση loopback στην πλευρά του κεντρικού υπολογιστή για απομόνωση. Ο ίδιος κανόνας ισχύει για τη διεύθυνση ακρόασης σε αρχείο ρυθμίσεων μεσολαβητή.

Μετά αποφασίστε πού επιλύονται τα ονόματα. Στο curl το --socks5 επιλύει το όνομα κεντρικού υπολογιστή τοπικά και το --socks5-hostname στέλνει το όνομα στον μεσολαβητή· τα προγράμματα περιήγησης εκθέτουν τον ίδιο διακόπτη με άλλη ετικέτα. Η τοπική επίλυση διαρρέει το ερώτημα ακόμη και όταν η σελίδα φορτώνει μέσα από τη σήραγγα.

Αντιμετωπίστε το κοντέινερ ως πύλη μόνο με διαδρομή επιστροφής

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

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

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

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

Επαληθεύστε τη διαδρομή εξόδου και μετά επιστρέψτε με τη σειρά

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

docker compose exec vpn curl -s https://ifconfig.me
curl -s -x socks5h://127.0.0.1:1080 https://ifconfig.me
curl -s -x socks5h://127.0.0.1:1080 http://internal.example/health

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

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

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

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