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

Δεν χάλασε η σήραγγα

Και τα δύο άκρα κάθονται σε ιδιωτικές περιοχές, που είναι η κανονική περίπτωση και όχι λάθος ρύθμιση. Μια διεύθυνση όπως 10.8.0.6 είναι πραγματική μέσα στη σήραγγα και ανύπαρκτη παντού αλλού, άρα το LAN δεν έχει λόγο να στέλνει τίποτα εκεί. Πριν αγγίξετε τη δρομολόγηση, επιβεβαιώστε ότι η υπηρεσία είναι καθόλου προσβάσιμη μέσα στη σήραγγα: στον πελάτη, το ss -ltn δείχνει αν ο ακροατής δεσμεύεται στο 127.0.0.1, στη διεπαφή του LAN ή στη διεύθυνση της σήραγγας. Ένας δαίμονας δεσμευμένος μόνο στο loopback δεν απαντά σε κανέναν παρά μόνο στον εαυτό του, και καμία διαδρομή, DNAT ή προώθηση θύρας δεν το αλλάζει.

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

Σχήμα διαδρομής: πείτε στο LAN πού βρίσκεται η δεξαμενή

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

ip route add 10.8.0.0/24 via 192.168.1.12
route add -p 10.8.0.0 mask 255.255.255.0 192.168.1.12   # Windows, persistent

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

push "route 192.168.1.0 255.255.255.0"

Για ένα υποδίκτυο που βρίσκεται πίσω από έναν πελάτη και όχι πίσω από τον διακομιστή, ο διακομιστής χρειάζεται και διαδρομή συστήματος και καταχώριση iroute στο αρχείο αυτού του πελάτη κάτω από το client-config-dir. Χωρίς το iroute, το OpenVPN ξέρει ότι το πρόθεμα υπάρχει και δεν έχει ιδέα ποιος πελάτης το κατέχει: τα πακέτα φτάνουν και ο δαίμονας δεν έχει τίποτα να τα αντιστοιχίσει.

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

Σχήμα NAT: DNAT προς τα μέσα και η γραμμή SNAT που όλοι παραλείπουν

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

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 10.8.0.6:3000
iptables -A FORWARD -i eth0 -o tun0 -p tcp -d 10.8.0.6 --dport 3000 -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -d 10.8.0.6 -p tcp --dport 3000 -j SNAT --to-source 10.8.0.1

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

Το firmware καταναλωτών χρησιμοποιεί δικά του ονόματα αλυσίδων και δεν παράγει αυτή τη μετάφραση για εσάς. Στο Tomato, ένας κανόνας εισερχόμενης κίνησης προσγειώνεται στο WANPREROUTING και μετά σε μια αλυσίδα φίλτρου όπως το wanin, και ένα σύνολο κανόνων που φαίνεται πλήρες χρειάζεται ακόμη μια χειροκίνητη γραμμή POSTROUTING. Αυτό δεν είναι σφάλμα firmware· είναι σύνολο κανόνων γραμμένο μόνο για εισερχόμενη κίνηση.

Γιατί ένας κανόνας που φαίνεται σωστός ρίχνει ακόμη το πακέτο

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

  • Σειρά αλυσίδων. Το iptables -I εισάγει στην κορυφή και το -A προσθέτει στο τέλος, άρα ένας προγενέστερος επιτρεπτικός ή αποκλειστικός κανόνας αποφασίζει πρώτος.
  • Λάθος αλυσίδα. Η κίνηση που απευθύνεται στον ίδιο τον δρομολογητή περνά από το INPUT, και η προωθούμενη κίνηση δεν το αγγίζει ποτέ. Η δημοσίευση μιας υπηρεσίας μπορεί να απαιτεί κανόνες και στα δύο.
  • Σημαίες κατεύθυνσης. Το -i tun0 ταιριάζει κίνηση που φτάνει από πελάτες και το -o tun0 κίνηση που φεύγει προς αυτούς. Ένα REJECT με λάθος σημαία αποκλείει κάτι που δεν σκοπεύατε.
  • Περιορισμός πηγής. Μια προώθηση που δέχεται μία διεύθυνση πελάτη λειτουργεί από αυτόν τον πελάτη και ρίχνει κάθε άλλη πηγή χωρίς λέξη.

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

Η τοπική προώθηση, όταν τίποτα στο LAN δεν μπορεί να αλλάξει

Μια τοπική προώθηση SSH παρακάμπτει όλο το ζήτημα. Δεν χρειάζεται διαδρομή στο LAN, ούτε συνεργασία από το τείχος προστασίας του πελάτη, ούτε θύρα δημοσιευμένη πουθενά:

ssh -N -f -L 3000:10.8.0.6:3000 user@vpn-host

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

Επαληθεύστε τις δύο κατευθύνσεις πριν προσθέσετε άλλον κανόνα

Η μετάφραση αφήνει ίχνη, και το να τα διαβάζετε είναι καλύτερο από το να μαντεύετε. Στον κεντρικό υπολογιστή VPN, το conntrack -L δείχνει αν η μετάφραση συνέβη καθόλου, το iptables -t nat -L -n -v δείχνει αν κινήθηκαν οι μετρητές, και το tcpdump -ni any port 3000 δείχνει ποια διεύθυνση πηγής έφτασε πραγματικά. Στον πελάτη, το ss -ltn επιβεβαιώνει ότι ο ακροατής βρίσκεται σε διεύθυνση που η σήραγγα μπορεί να φτάσει.

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

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