Εφαρμογή μέσα σε χώρο ονομάτων VPN δεν είναι προσβάσιμη από το LAN
Ένας χώρος ονομάτων δικτύου δίνει σε ένα πρόγραμμα το δικό του τούνελ και το δικό του loopback. Δημοσιεύστε μόνο τη θύρα του με ένα άλμα socat ή ένα ζεύγος veth αντί για τον κεντρικό υπολογιστή.
Η υπηρεσία σας λειτουργεί στο μηχάνημα, το τούνελ είναι ενεργό, και όμως το πρόγραμμα περιήγησης στο γραφείο σας περιμένει ακόμη απάντηση. Τίποτα δεν είναι χαλασμένο με τη συνηθισμένη έννοια: η εφαρμογή ακούει μέσα σε έναν χώρο ονομάτων δικτύου, και αυτή η στοίβα είναι αόρατη στο LAN. Το loopback της ανήκει στον χώρο ονομάτων, οπότε ένας πελάτης σε άλλο μηχάνημα δεν έχει διεύθυνση που φτάνει στη θύρα. Ένα σκόπιμο άλμα, ή ένα ζεύγος veth, το διορθώνει χωρίς να μετακινήσετε το υπόλοιπο μηχάνημα.
Γιατί τίποτα δεν απαντά στη διεύθυνση του LAN
Ένας χώρος ονομάτων είναι πλήρης στοίβα δικτύου: διεπαφές, διαδρομές, κανόνες τείχους προστασίας και ένα ιδιωτικό loopback. Μια διεργασία που εκκινείται μέσω ip netns exec βλέπει αυτή τη στοίβα και τίποτα άλλο, οπότε η διεύθυνση στην οποία δεσμεύεται επιλύεται μόνο μέσα στον χώρο ονομάτων. Το δικό του 127.0.0.1 του κεντρικού υπολογιστή είναι εντελώς διαφορετικό loopback.
Γι' αυτό το curl στον κεντρικό υπολογιστή αποτυγχάνει, ενώ η ίδια εντολή μέσα στον χώρο ονομάτων πετυχαίνει. Η εφαρμογή είναι υγιής· η διεύθυνση απλώς δεν υπάρχει στη στοίβα του κεντρικού υπολογιστή.
Δημοσιεύστε μία θύρα με ένα άλμα socat
Το socat γεφυρώνει τις δύο στοίβες στον χώρο χρήστη, κάτι που αρκεί όταν μια μόνο θύρα TCP πρέπει να περάσει. Η πλευρά του κεντρικού υπολογιστή ακούει στο LAN και, για κάθε αποδεκτή σύνδεση, ξεκινά ένα δεύτερο socat μέσα στον χώρο ονομάτων που συνδέεται με το loopback της εφαρμογής. Η εσωτερική διεργασία φτάνει στην εφαρμογή ακριβώς όπως θα έκανε ένας τοπικός πελάτης. Τίποτα στην δρομολόγηση του χώρου ονομάτων δεν αλλάζει, οπότε η εφαρμογή συνεχίζει να χρησιμοποιεί το τούνελ ως μοναδική έξοδο.
socat TCP-LISTEN:9100,reuseaddr,fork EXEC:'ip netns exec vpn socat STDIO tcp-connect:127.0.0.1:9100',nofork
Η εξωτερική διεργασία χρειάζεται root ή την ικανότητα να εισέλθει στον χώρο ονομάτων. Αν πέσει το VPN, η εφαρμογή χάνει τη διαδρομή της και η δημοσιευμένη θύρα αποτυγχάνει κλειστή, που είναι η συμπεριφορά που θέλετε από μια φυλακή.
Χρησιμοποιήστε ένα ζεύγος veth όταν περνούν περισσότερες από μία θύρες
Ένα ζεύγος veth είναι η σωστή απάντηση όταν πρέπει να περάσουν πολλές θύρες ή πρωτόκολλα, ή όταν άλλοι κεντρικοί υπολογιστές πρέπει να ξεκινούν συνδέσεις. Το ένα άκρο μένει στον κεντρικό υπολογιστή, το άλλο μετακινείται στον χώρο ονομάτων, και ένα μικρό /30 δίνει και στις δύο πλευρές σταθερή διεύθυνση. Μια διαδρομή κεντρικού υπολογιστή στέλνει τότε τη διεύθυνση του χώρου ονομάτων μέσω του ζεύγους.
ip link add veth0 type veth peer name veth1
ip link set veth1 netns vpn
ip addr add 10.77.0.1/30 dev veth0
ip link set veth0 up
ip netns exec vpn ip addr add 10.77.0.2/30 dev veth1
ip netns exec vpn ip link set veth1 up
Μην προσθέσετε προεπιλεγμένη διαδρομή μέσω του κεντρικού υπολογιστή, εκτός αν σκοπεύετε να σπάσετε τη φυλακή. Το τούνελ πρέπει να παραμείνει η έξοδος, οπότε μέσω του ζεύγους είναι προσβάσιμη μόνο η δημοσιευμένη διεύθυνση υπηρεσίας. Δώστε στον χώρο ονομάτων και δικό του αρχείο resolver, γιατί το ip netns exec διαβάζει το /etc/netns/vpn/resolv.conf και χωρίς αυτό η επίλυση ονομάτων μέσα στη φυλακή είναι κενή.
Δοκιμάστε από άλλο μηχάνημα, όχι από τον κεντρικό υπολογιστή
Εκτελέστε τη δοκιμή από δεύτερο μηχάνημα, γιατί ο κεντρικός υπολογιστής μπορεί να φτάσει σε τοπικό ακροατή μέσω διαδρομών που δεν λένε τίποτα για το LAN. Ελέγξτε πρώτα σε τι δεσμεύτηκε πραγματικά η εφαρμογή μέσα στον χώρο ονομάτων και μετά συνδεθείτε στη δημοσιευμένη διεύθυνση από έξω. Η δέσμευση σε κάθε διεύθυνση εκεί δεν διευρύνει τη φυλακή, γιατί ο μπαλαντέρ εξακολουθεί να ανήκει στον χώρο ονομάτων και το LAN δεν μπορεί να τον δει.
ip netns exec vpn ss -lntp
Αν η σύνδεση από τον κεντρικό υπολογιστή λειτουργεί και αυτή από το LAN όχι, το κομμάτι που λείπει είναι το άλμα ή η διαδρομή, όχι η διεύθυνση δέσμευσης. Εκκινήστε το OpenVPN μέσα στον χώρο ονομάτων αντί να μεταφέρετε εκεί μια ζωντανή συσκευή tun, αφού η μεταφορά της διεπαφής την απενεργοποιεί και μπορεί να σβήσει διαδρομές που δεν θα μπορείτε να επισκευάσετε από έξω. Κρατήστε τις εντολές ανάκτησης στην κονσόλα, όχι μέσα στη φυλακή.