Δεν υπάρχει τίποτα λάθος με την εφαρμογή και τίποτα λάθος με τη σήραγγα, και όμως ο πίνακας ελέγχου δεν φορτώνει. Όταν μια υπηρεσία τρέχει με network_mode: service:vpn, μοιράζεται τον χώρο ονομάτων δικτύου του κοντέινερ VPN, που σημαίνει ότι ο ακροατής και οι δημοσιευμένες θύρες της ανήκουν σε αυτόν τον χώρο ονομάτων και όχι στην υπηρεσία. Από αυτό προκύπτουν τρεις αποφάσεις: πού δεσμεύεται η εφαρμογή, ποιο κοντέινερ δημοσιεύει τη θύρα και πόσο στενή είναι η διαδρομή διαχείρισης. Βάλτε τις σε λάθος σειρά και κάθε μεμονωμένη ρύθμιση φαίνεται σωστή, ενώ ο συνδυασμός δεν μπορεί να δουλέψει.

Ποιος κατέχει τον χώρο ονομάτων της θύρας

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

services:
  vpn:
    image: vpn-client-image
    cap_add: [NET_ADMIN]
    ports:
      - "127.0.0.1:8080:8080"
  app:
    network_mode: "service:vpn"

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

Κάντε την εφαρμογή να ακούει εκεί που περιμένει ο χώρος ονομάτων

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

docker compose exec app ss -lntp
docker port vpn
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/

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

Επιλέξτε πώς μπαίνει η διαδρομή διαχείρισης

Υπάρχουν τρεις λογικές διατάξεις. Δημοσιεύστε στο κοντέινερ VPN και φτάστε το από τον κεντρικό υπολογιστή ή το τοπικό δίκτυο. Βάλτε έναν αντίστροφο διακομιστή μεσολάβησης μπροστά από τον χώρο ονομάτων και δώστε του τη μόνη εκτεθειμένη θύρα. Ή κρατήστε τον πίνακα ελέγχου προσβάσιμο μόνο από μέσα στον χώρο ονομάτων μέσω συνεδρίας exec ή σήραγγας SSH, που είναι η μικρότερη έκθεση και η λιγότερη ευκολία.

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

Ανοίξτε τη θύρα διαχείρισης χωρίς να ανοίξετε τα πάντα

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

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

Επαληθεύστε από τη συσκευή διαχείρισης και επαληθεύστε ξανά αργότερα

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

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

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