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

Γιατί ο πελάτης δεν μπορεί να το προσφέρει

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

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

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

Linux: σημάνετε τη διεργασία και μετά δρομολογήστε το σημάδι

Η πιο καθαρή προσέγγιση συνδέει την απόφαση με τη διεργασία που κατέχει το socket. Η αντιστοίχιση owner λειτουργεί για τοπικά παραγόμενη κίνηση στην αλυσίδα OUTPUT, οπότε ένα σημάδι που εφαρμόζεται εκεί μπορεί να επιλέξει ξεχωριστό πίνακα:

iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 0x1
ip rule add fwmark 0x1 table 200
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.0 table 200
ip route add default via 192.168.1.1 dev eth0 table 200

Τα πακέτα από τον χρήστη 1001 συμβουλεύονται τότε τον πίνακα 200 και βγαίνουν από τη συνηθισμένη πύλη, ενώ ο κύριος πίνακας εξακολουθεί να στέλνει όλα τα άλλα στη σήραγγα. Η αντιστοίχιση owner ισχύει μόνο για τοπικά παραγόμενα πακέτα, που είναι ακριβώς η κίνηση που σας ενδιαφέρει εδώ, και δεν μπορεί να ταξινομήσει πακέτα που προωθούνται για άλλον υπολογιστή. Επαληθεύστε με τα εργαλεία και όχι με την πρόθεση: το ss -tnp δείχνει την τοπική διεύθυνση και τη διεργασία που κατέχει τις εγκατεστημένες συνδέσεις, και το ip route get 1.1.1.1 mark 0x1 δείχνει ποιον πίνακα επιλέγει το σημάδι.

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

ip netns add novpn
ip link add veth-host type veth peer name veth-ns
ip link set veth-ns netns novpn
ip addr add 10.200.0.1/24 dev veth-host
ip netns exec novpn ip addr add 10.200.0.2/24 dev veth-ns
ip netns exec novpn ip route add default via 10.200.0.1

Windows: ο προορισμός αποφασίζει ακόμη

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

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

Μεταφέρετε την απόφαση όταν μία διεργασία είναι η λάθος μονάδα

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

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

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