Οι εικόνες κοντέινερ μπορούν να μεταφέρουν κάθε δυαδικό αρχείο και αρχείο ρυθμίσεων του OpenVPN που χρειάζονται και παρ’ όλα αυτά να αποτύχουν στην πρώτη κλήση δικτύου. Το σφάλμα αναφέρει το /dev/net/tun επειδή η εφαρμογή ζήτησε από τον πυρήνα μια διεπαφή TUN και το κοντέινερ δεν είχε ούτε τον κόμβο συσκευής ούτε τη δυνατότητα να δημιουργήσει έναν. Πρόκειται για δύο ξεχωριστές άδειες, και η διόρθωση της μίας αφήνει την άλλη ακριβώς εκεί που ήταν.

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

Ο κόμβος συσκευής και η δυνατότητα είναι δύο πόρτες

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

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

Αναπαράγετέ το έξω από το αρχείο Compose

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

ls -l /dev/net/tun
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun:/dev/net/tun alpine sh -c 'apk add -q iproute2 && ip tuntap add dev tun9 mode tun && ip link show tun9'

Η απουσία κόμβου στον κεντρικό υπολογιστή σημαίνει ότι η μονάδα tun δεν είναι διαθέσιμη, κάτι που είναι διόρθωση στην πλευρά του κεντρικού υπολογιστή και όχι του κοντέινερ. Ένας κόμβος που υπάρχει αλλά δεν ανοίγει μέσα στο κοντέινερ υποδεικνύει πρόσβαση στη συσκευή, και το μήνυμα θα λέει permission denied αντί για no such file. Η σειρά αυτών των δύο αποτυχιών είναι ολόκληρη η διάγνωση. Σημειώστε ποια είδατε πριν αλλάξετε κάποια σημαία.

Τα σφάλματα μετά το TUN είναι διαφορετικά προβλήματα

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

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

Επαληθεύστε τη διεπαφή μέσα στο κοντέινερ

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

ls -l /dev/net/tun
capsh --print | grep -i net_admin
ip link add dev tun9 type tun && ip link show tun9

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

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

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