Σε ένα VPN δρομολογητή δεν υπάρχει διακόπτης ανά συσκευή· ο διακόπτης που ψάχνετε είναι μια συντόμευση που γράφει κανόνες δρομολόγησης πολιτικής για λογαριασμό σας. Τη στιγμή που ένα laptop, ένα εύρος θυρών, μία λίστα διευθύνσεων ή ένα τμήμα LAN πρέπει να χρησιμοποιήσει το τούνελ ενώ όλα τα άλλα μένουν στο WAN, χτίζετε μια διαδρομή πολιτικής και δεν ενεργοποιείτε μια λειτουργία. Η δουλειά έχει τρία κινούμενα μέρη και το καθένα αποτυγχάνει διαφορετικά: ένας επισημασμένος πίνακας χωρίς διαδρομή μοιάζει με σιωπή, ένα σημάδι που εφαρμόστηκε σε λάθος αλυσίδα μοιάζει σαν να μη συνέβη τίποτα, και ένας κανόνας NAT που λείπει μοιάζει με τούνελ που συνδέεται και δεν μεταφέρει τίποτα. Δύο ακόμη κομμάτια χάνονται επειδή δεν εμφανίζονται ποτέ στον κανόνα mangle, και αυτά είναι το DNS και το IPv6.

Ο μύθος: το τούνελ είναι ρύθμιση πελάτη

Ένας πελάτης VPN στην πλευρά του δρομολογητή κάνει καλά ένα χοντρό πράγμα: βάζει το 0.0.0.0/0 στον κύριο πίνακα δρομολόγησης και το δείχνει προς το τούνελ. Το WireGuard το παράγει από το AllowedIPs, το OpenVPN από ένα redirect-gateway που σπρώχνεται, και τα δύο αλλάζουν τη διαδρομή για κάθε host πίσω από τον δρομολογητή. Το στένεμα του AllowedIPs ή η προσθήκη route-nopull αλλάζει το τι εγκαθιστά ο πελάτης. Δεν αλλάζει σε ποιον ισχύει η εγκατάσταση, γιατί ο πελάτης δεν βλέπει ποτέ συσκευές. Βλέπει μόνο πακέτα.

Η επιλογή κατά πηγή ή προορισμό είναι απόφαση δρομολόγησης, άρα ανήκει στο επίπεδο πολιτικής του δρομολογητή: ένας κανόνας mangle συν δεύτερος πίνακας στο RouterOS, ένα MARK συν ip rule στο OpenWrt ή το DD-WRT, ή ένας κανόνας τείχους προστασίας του οποίου η πύλη είναι το τούνελ στο pfSense. Η συνταγή πελάτη WireGuard της Netgate είναι αυτή που πρέπει να διαβάσετε πριν μαντέψετε, γιατί σε αυτή την πλατφόρμα η πύλη του κανόνα, η ανάθεση διασύνδεσης και η καταχώριση εξερχόμενου NAT πρέπει όλα να συμφωνούν πριν ένας και μόνο πελάτης χρησιμοποιήσει το τούνελ.

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

Πρώτο κομμάτι: ένα τούνελ που δεν είναι η προεπιλεγμένη διαδρομή

Στο RouterOS, προσθέστε τον πελάτη χωρίς προεπιλεγμένη διαδρομή και δώστε στο τούνελ τον δικό του πίνακα. Η πρώτη διαδρομή είναι η επισημασμένη προεπιλογή· η δεύτερη είναι το μισό της αποτυχίας.

/ip route add dst-address=0.0.0.0/0 gateway=VPN_GATEWAY_IP routing-mark=vpn distance=1
/ip route add dst-address=0.0.0.0/0 type=unreachable routing-mark=vpn distance=2

Η διαδρομή unreachable είναι ο λόγος που ένας επισημασμένος πίνακας κερδίζει μια λίστα εξαιρέσεων στον κύριο πίνακα. Όταν πέσει το τούνελ, τα επισημασμένα πακέτα παίρνουν αμέσως unreachable αντί να γυρίσουν ήσυχα στο WAN, ώστε η αποτυχία να φαίνεται στο μήνυμα σφάλματος της εφαρμογής και όχι σε μια σελίδα γεωεντοπισμού που ελέγχετε μια ώρα αργότερα.

Το RouterOS 7 χωρίζει ό,τι κρατούσε μαζί το 6.x: δηλώνετε τον πίνακα με /routing table add name=vpn fib και μετά αναφέρεστε σε αυτόν με όνομα στη διαδρομή και στον κανόνα mangle. Ένα απόσπασμα 6.x που βάζει routing-mark ενσωματωμένο χωρίς να ορίζει τον πίνακα φορτώνει καθαρά και δεν ταιριάζει με τίποτα. Το άλλο κλασικό είναι δύο μισά 0.0.0.0/1, ή δύο προεπιλεγμένες διαδρομές στην ίδια απόσταση σε έναν πίνακα: ο πυρήνας διαλέγει μία, και η συμπεριφορά μπορεί να αλλάξει μετά από επανεκκίνηση.

Δεύτερο κομμάτι: σημάδεμα πριν την αναζήτηση διαδρομής

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

/ip firewall mangle add chain=prerouting src-address=192.168.88.50 action=mark-routing new-routing-mark=vpn
/ip firewall mangle add chain=prerouting dst-address-list=via-vpn action=mark-routing new-routing-mark=vpn
/ip firewall address-list add list=via-vpn address=203.0.113.10

Το firmware Linux κάνει το ίδιο με ένα σημάδι netfilter και έναν κανόνα που οδηγεί τα σημαδεμένα πακέτα σε πίνακα που έχετε γεμίσει:

iptables -t mangle -A PREROUTING -p tcp --dport 27000:27050 -j MARK --set-mark 0x200
ip route add default dev tun0 table 100
ip rule add fwmark 0x200 table 100

Η αλυσίδα δεν είναι επιλογή ύφους. Όταν ένα πακέτο φτάσει στο FORWARD, η αναζήτηση διαδρομής έχει ήδη γίνει, οπότε ένα MARK ή DROP εκεί μπορεί μόνο να ξαναγράψει ή να απορρίψει. Το σημάδι πρέπει να πέσει στο PREROUTING για προωθούμενη κίνηση και στο OUTPUT για κίνηση που δημιουργεί ο ίδιος ο δρομολογητής, γιατί εκεί ζουν το DNS, το NTP και οι έλεγχοι ενημερώσεων του δρομολογητή. Αυτή η διαδρομή εξόδου είναι ο συνηθισμένος λόγος που μια πλήρως τουνελοποιημένη εγκατάσταση απαντά ακόμη από τον resolver του ISP σε ένα τεστ διαρροής.

Η πολιτική συσκευής θέλει αντιστοίχιση που δεν μετατοπίζεται. Κρατήστε τη διεύθυνση στο DHCP ή αντιστοιχίστε μια διασύνδεση για αποκλειστικό τμήμα· μια διεύθυνση που αργότερα μετακινείται σε άλλη συσκευή εφαρμόζει ήσυχα το τούνελ στον λάθος πελάτη. Μια γέφυρα ανά SSID με δικό της υποδίκτυο είναι η πιο ανθεκτική εκδοχή της ίδιας ιδέας, και δίνει στους κανόνες IPv6 ένα μέρος να ζήσουν.

Τρίτο κομμάτι: NAT, DNS και η εξαίρεση LAN

Η κίνηση που φεύγει από το τούνελ χρειάζεται διεύθυνση πηγής στην οποία θα απαντήσει η μακρινή πλευρά. Περιορίστε τη μετάφραση στη διασύνδεση του τούνελ: out-interface=VPN_NAME στο RouterOS, -o tun0 στο Linux, αντίστοιχη καταχώριση εξερχόμενου NAT στο pfSense. Ένας κανόνας masquerade χωρίς αυτόν τον περιορισμό ξαναγράφει κίνηση που θέλατε να αφήσετε ήσυχη, και το σύμπτωμα είναι ότι η μη τουνελοποιημένη συσκευή χάνει τη δημόσια διεύθυνσή της.

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

Το DNS παίρνει ξεχωριστή διαδρομή. Τα ερωτήματα που προωθεί ο δρομολογητής προέρχονται από τον δρομολογητή και ακολουθούν το OUTPUT, όχι το σημάδι προώθησης, οπότε ένα πλήρως τουνελοποιημένο laptop μπορεί ακόμη να επιλύει μέσω του ISP. Στρέψτε τους πελάτες σε resolver προσβάσιμο μέσω του τούνελ, ή σημαδέψτε την κίνηση της θύρας 53 του ίδιου του δρομολογητή, και μετά ελέγξτε τη διεύθυνση που επιλύθηκε αντί να υποθέσετε ότι η απάντηση ταξίδεψε μαζί με το αίτημα ιστού.

Όταν ο κανόνας ταιριάζει αλλά η εφαρμογή χρησιμοποιεί ακόμη το WAN

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

Το IPv6 είναι η ήσυχη παράκαμψη. Η συσκευή έχει δεύτερη οικογένεια διευθύνσεων με δική της προεπιλεγμένη διαδρομή και δικό της σύνολο κανόνων, και το ταίριασμα μόνο της διεύθυνσης IPv4 είναι μισή πολιτική. Εφαρμόστε τον ίδιο επιλογέα στο ip6tables ή στο αντίστοιχο του nftables, ή απενεργοποιήστε το IPv6 σε αυτό το τμήμα σκόπιμα και όχι κατά λάθος.

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

Επαληθεύστε με δύο συσκευές και μια επανεκκίνηση

Δοκιμάστε τη συσκευή που πρέπει να περάσει από το τούνελ και τη συσκευή που δεν πρέπει, και συγκρίνετε το δεύτερο άλμα αντί για έναν αριθμό ταχύτητας. Ένα traceroute από καθεμία δείχνει στο δεύτερο άλμα είτε την πύλη του τούνελ είτε την πύλη του ISP· αν και τα δύο φαίνονται ίδια, το σημάδι ή ο πίνακας δεν κάνουν αυτό που λέει ο κανόνας. Χρησιμοποιήστε νέες συνδέσεις για τη δοκιμή.

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

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

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