Το UFW πετάει τον DNS διακομιστή του VPN μόλις σηκωθεί η σήραγγα
Η πολιτική προεπιλεγμένης άρνησης του UFW καλύπτει και τη διεπαφή της σήραγγας. Ταξινόμησε την κίνηση κατά κατεύθυνση, επίτρεψε τον resolver που σπρώχνεται στο tun0 και μετά άνοιξε την εξωτερική διαδρομή.
Τα ονόματα σταματούν να επιλύονται τη στιγμή που συνδέεται το VPN, ενώ ένα ping σε δημόσια διεύθυνση απαντά ακόμα και η κατάσταση του τείχους προστασίας δεν δείχνει τίποτα λάθος. Τίποτα δεν άλλαξε στην πολιτική· αυτό που άλλαξε είναι ότι εμφανίστηκε μια νέα διεπαφή, και η προεπιλεγμένη άρνηση την καλύπτει από το πρώτο πακέτο. Το UFW αποφασίζει με βάση την κατεύθυνση και τη διεπαφή, οπότε ένας κανόνας γραμμένος για την ασύρματη ζεύξη δεν λέει τίποτα για την κίνηση που φεύγει από τη σήραγγα. Η επιδιόρθωση είναι μια χούφτα στενοί κανόνες που εφαρμόζονται με συγκεκριμένη σειρά.
Το σύμπτωμα εμφανίζεται μόνο αφού σηκωθεί η σήραγγα
Μια πολιτική προεπιλεγμένης άρνησης κάνει ακριβώς αυτό που της είπαν: ό,τι δεν ταιριάζει με κανόνα απορρίπτεται, σε κάθε διεπαφή που υπάρχει. Η σήραγγα δεν υπήρχε όταν γράφτηκαν οι κανόνες, άρα κανένας τους δεν μπορεί να την πιάσει, και η άρνηση που ήταν πάντα εκεί ισχύει τώρα για την επίλυση ονομάτων. Η απευθείας κίνηση σε μια κυριολεκτική διεύθυνση μπορεί ακόμα να δουλέψει όταν την καλύπτει μια ευρύτερη άδεια, γι' αυτό ένα ping σε δημόσιο resolver πετυχαίνει ενώ η αναζήτηση ονόματος αποτυγχάνει. Το κενό είναι ένας κανόνας για μια διεπαφή που η πολιτική δεν έχει δει ποτέ.
Αυτό εξηγεί επίσης γιατί η αποτυχία αντιστρέφεται καθαρά: κατέβασε τη σήραγγα και τα ονόματα επιλύονται ξανά, γιατί το ερώτημα επιστρέφει σε μια διεπαφή που έχει κανόνες. Μια πολιτική που αποτυγχάνει μόνο όσο η σήραγγα είναι πάνω δεν είναι πρόβλημα DNS, και το να ρυθμίζεις τον ίδιο τον resolver εδώ σπαταλά τον περισσότερο χρόνο. Διάβασε τη λίστα διεπαφών πριν διαβάσεις τη διαμόρφωση του resolver.
Τρεις κατευθύνσεις, τρία διαφορετικά σύνολα κανόνων
Μία συνεδρία αγγίζει κανόνες σε περισσότερες από μία κατευθύνσεις, και μια σήραγγα προσθέτει δεύτερη διεπαφή σχεδόν σε κάθε μία από αυτές. Το να ταξινομήσεις πρώτα την κίνηση κατά κατεύθυνση και διεπαφή κάνει τα υπόλοιπα μηχανικά, γιατί κάθε γραμμή παρακάτω χρειάζεται τον δικό της κανόνα στη δική της θέση. Τα παραδείγματα χρησιμοποιούν tun0 και μια δεξαμενή 10.8.0.0/24, οπότε αντικατέστησε τα ονόματα και τις περιοχές με εκείνα από την έξοδο του ίδιου του πελάτη.
| Direction | Example packet | Rule that admits it | Written on |
|---|---|---|---|
| Client to the pushed resolver | A DNS query to 10.8.0.1 | Destination port 53 over the tunnel | The client's tun0 |
| Client to the VPN server | A handshake to the server's public address | Server address and port on the physical link | The client's physical interface |
| Server to a service | SSH from the pool to port 22 | Source pool, destination port, tunnel interface | The server's tun0 |
| Anyone to the listener | The VPN listener itself | 1194/udp on the public side | The server's public interface |
Δύο γραμμές συγχέονται συχνά επειδή και οι δύο αναφέρουν τη σήραγγα. Ένας κανόνας για τον resolver επιτρέπει την κίνηση που στέλνει ο πελάτης μέσα στη σήραγγα, ενώ ένας κανόνας για το SSH επιτρέπει την κίνηση που λαμβάνει ο διακομιστής από εκεί· ζουν σε διαφορετικά μηχανήματα και αποτυγχάνουν ανεξάρτητα. Η γραμμή που ξεχνιέται συχνότερα είναι η δεύτερη, γιατί ο πελάτης δεν μπορεί καθόλου να στήσει τη σήραγγα μέχρι να επιτραπεί η κίνησή του στη δημόσια διεύθυνση του διακομιστή. Δούλεψε από πάνω προς τα κάτω και κάθε αποτυχία έχει μία πιθανή αιτία.
Ένας resolver που σπρώχνεται χρειάζεται δικό του κανόνα
Το αν η σήραγγα μεταφέρει DNS εξαρτάται από το τι στέλνει ο διακομιστής. Ένας διακομιστής που σπρώχνει επιλογή resolver εγκαθιστά μια ιδιωτική διεύθυνση στη διαμόρφωση του πελάτη, και αυτή η διεύθυνση δρομολογείται μόνο μέσω της σήραγγας. Αν ο διακομιστής δεν σπρώχνει τίποτα, ο πελάτης κρατά τον resolver που είχε ήδη και οι κανόνες παρακάτω δεν έχουν τίποτα να επιτρέψουν. Έλεγξε την κατάσταση που σπρώχτηκε και το τρέχον αποτέλεσμα του ερωτήματος πριν γράψεις οτιδήποτε:
dig +short @10.8.0.1 example.com
resolvectl status tun0
sudo ufw status numberedΗ έξοδος κατάστασης ονομάζει τον resolver που χρησιμοποιείται και τη ζεύξη στην οποία είναι δεσμευμένος, και η αναζήτηση διαδρομής πίσω του δείχνει ποια διεπαφή θα μετέφερε ένα ερώτημα σε αυτή τη διεύθυνση. Όταν ο resolver κάθεται σε άλλη ζεύξη, το πρόβλημα είναι νωρίτερα από το τείχος προστασίας και κανένας κανόνας δεν θα βοηθήσει. Όταν και τα δύο συμφωνούν στη σήραγγα, χρειάζονται δύο κανόνες, γιατί το UDP μεταφέρει τα περισσότερα ερωτήματα και το TCP αναλαμβάνει όταν μια απάντηση κόβεται. Κατέγραψε και τις δύο τιμές, γιατί αυτές είναι που θα ονομάσουν οι κανόνες:
sudo ufw allow out on tun0 to 10.8.0.1 port 53 proto udp comment 'pushed resolver'
sudo ufw allow out on tun0 to 10.8.0.1 port 53 proto tcp comment 'truncated answers'Άνοιξε την εξωτερική διαδρομή πριν την εσωτερική
Ο πελάτης πρέπει να φτάσει στη δημόσια διεύθυνση του διακομιστή πριν υπάρξει σήραγγα, οπότε ο κανόνας γι' αυτή κάθεται στη φυσική ζεύξη και πρέπει να είναι στη θέση του πρώτος. Μια πολιτική που επιτρέπει τον resolver αλλά ξεχνά τον διακομιστή αφήνει τον πελάτη εντελώς ανίκανο να στήσει τη σήραγγα, και αυτό το σύμπτωμα συνήθως χρεώνεται σε ένα kill switch. Έπειτα επέτρεψε τις υπηρεσίες που ήθελες πραγματικά μέσα από τη σήραγγα, έναν στενό κανόνα τη φορά, αντί να ανοίξεις τη διεπαφή ολόκληρη. Οι στενοί κανόνες είναι ο λόγος που η άρνηση μπορεί να μείνει στη θέση της.
sudo ufw allow out to 198.51.100.10 port 1194 proto udp comment 'vpn server'
sudo ufw allow out on tun0 to any port 443 proto tcp comment 'web through tunnel'Η σειρά μετράει όσο δοκιμάζεις, γιατί ο πρώτος κανόνας είναι αυτό που αφήνει καθόλου τη σήραγγα να σηκωθεί. Πρόσθεσέ τον, συνδέσου και επιβεβαίωσε ότι η σήραγγα είναι πάνω πριν προσθέσεις τον κανόνα της υπηρεσίας, γιατί το να κάνεις και τα δύο μαζί σημαίνει ότι μια αποτυχία δεν σου λέει τίποτα για το ποιο μισό είναι λάθος. Αντικατέστησε τη διεύθυνση τεκμηρίωσης παραπάνω με το τελικό σημείο για το οποίο είναι διαμορφωμένος ο πελάτης.
Τελείωσε την πλευρά του πελάτη αποσυνδέοντας επίτηδες. Η άρνηση θα πρέπει να εξακολουθεί να αρνείται την κίνηση που απέκλεισες σκόπιμα, γιατί ένας resolver που απαντά όσο η σήραγγα είναι πάνω καλύπτει μόνο το μισό μιας πολιτικής που αρνείται σε περίπτωση αμφιβολίας.
Ένας πελάτης που συνδέεται δεν έχει γίνει ακόμα δεκτός
Ο διακομιστής έχει τη δική του κατεύθυνση να σκεφτεί, και ένας πελάτης που ολοκληρώνει τη χειραψία δεν φτάνει ακόμα σε τίποτα που τρέχει στον διακομιστή μέχρι ο διακομιστής να τον δεχτεί. Ο κανόνας του δημόσιου ακροατή αφήνει τη σήραγγα μόνο να υπάρχει· δεν αφήνει την κίνηση της σήραγγας να μπει. Στον διακομιστή αυτό είναι δύο κανόνες συν ένας έλεγχος ότι η υπηρεσία ακούει πραγματικά:
sudo ufw allow 1194/udp comment 'openvpn listener'
sudo ufw limit in on tun0 from 10.8.0.0/24 to any port 22 proto tcp comment 'admin over tunnel'
ss -ltn | grep ':22'Η δεξαμενή στον κανόνα πρέπει να ισούται με την περιοχή που εκχωρεί ο διακομιστής, και ο αριθμός της σήραγγας πρέπει να ταιριάζει με αυτόν που δημιούργησε ο διακομιστής, γιατί ένας κανόνας για άλλη διεπαφή δεν ξεχωρίζει από την απουσία κανόνα. Το limit είναι σκόπιμο για μια διαχειριστική θύρα, γιατί περιορίζει τις επαναλαμβανόμενες συνδέσεις αντί να τις δέχεται χωρίς όριο. Ο έλεγχος ακροατή ξεχωρίζει μια κλειστή θύρα από ένα πακέτο που απορρίφθηκε, τα οποία φαίνονται ίδια από τον πελάτη. Οι αριθμημένοι κανόνες δεν είναι όλη η εικόνα επίσης: οι κανόνες before του UFW και κάθε γραμμή nftables γραμμένη με το χέρι ταιριάζουν νωρίτερα και μπορούν ακόμα να απορρίψουν ένα πακέτο που η λίστα φαίνεται να επιτρέπει.