Διακόπτης ασφαλείας pf στο macOS για OpenVPN: κανόνες που κλείνουν
Ένα σύνολο κανόνων pf μπλοκάρει την άμεση κίνηση όσο η σήραγγα είναι κάτω. Κρατήστε τη διαδρομή του πελάτη προς τον διακομιστή του και μετά αποδείξτε το μπλοκάρισμα με τη σήραγγα κλειστή.
Στο macOS, ένας διακόπτης ασφαλείας είναι τόσο καλός όσο η πολιτική φίλτρου πακέτων πίσω του, και το pf είναι το κομμάτι που επιβάλλει αυτή την πολιτική. Η πολιτική πρέπει να κάνει δύο αντίθετα πράγματα ταυτόχρονα: να αφήνει τον πελάτη να φτάνει στον διακομιστή του ώστε να μπορεί να υπάρξει σήραγγα, και να σταματά όλα τα άλλα από το να βγαίνουν άμεσα. Τα περισσότερα δημοσιευμένα σύνολα κανόνων καταφέρνουν το δεύτερο και ξεχνούν το πρώτο, οπότε το μηχάνημα χάνει συνδεσιμότητα αντί να κερδίζει προστασία. Η έκδοση που δουλεύει ονομάζει το τελικό σημείο, τον επιλυτή και τη σήραγγα, και τίποτα παραπάνω.
Τι μπορεί να αποφασίσει ένα φίλτρο πακέτων και τι δεν μπορεί
Το pf κοιτά διεπαφές, διευθύνσεις, αριθμούς πρωτοκόλλου και θύρες, και σταματά εκεί. Δεν μαθαίνει ποτέ ποια διεργασία άνοιξε μια υποδοχή, οπότε μια άδεια γραμμένη για ένα πρόγραμμα γίνεται άδεια για κάθε πρόγραμμα που μπορεί να φτάσει στην ίδια θύρα. Έτσι μια γενναιόδωρη εξαίρεση UDP μετατρέπει έναν διακόπτη ασφαλείας πάλι σε συνηθισμένο δίκτυο. Το μπλοκάρισμα με επίγνωση εφαρμογής ανήκει στον πελάτη ή σε επέκταση συστήματος, όχι σε αυτό το αρχείο.
Το φίλτρο δεν δημιουργεί ούτε διαδρομές. Όταν ο πελάτης πέσει, η προεπιλεγμένη διαδρομή μπορεί να δείχνει ακόμη σε μια νεκρή σήραγγα, και το pf το μετατρέπει σε μπλοκαρισμένα πακέτα αντί σε σιωπηλή επιστροφή στο Wi-Fi. Το μπλοκάρισμα είναι το επιδιωκόμενο αποτέλεσμα, όχι δυσλειτουργία που πρέπει να παρακαμφθεί.
Η σειρά αποφασίζει το αποτέλεσμα πιο συχνά από το κείμενο του κανόνα. Χωρίς το quick, το pf συνεχίζει να αξιολογεί μετά από μια αντιστοίχιση και κερδίζει ο τελευταίος κανόνας που ταιριάζει, οπότε ένα ευρύ πέρασμα κοντά στο τέλος υπερισχύει των προσεκτικών εξαιρέσεων πιο πάνω. Το να σημειώσετε τα περάσματα με quick κάνει την πρώτη αντιστοίχιση οριστική, που είναι συνήθως αυτό που εννοεί ένας συντάκτης πολιτικής.
Διαβάστε πρώτα τα δεδομένα διεπαφής και τελικού σημείου
Οι ασύρματες διεπαφές δεν αριθμούνται με τον ίδιο τρόπο σε κάθε Mac, και η συσκευή σήραγγας παίρνει έναν αριθμό που μπορεί να αλλάξει ανάμεσα σε εκκινήσεις. Ένας κανόνας που ονομάζει ανύπαρκτη συσκευή αποτυγχάνει στην ανάλυση, κάτι ηχηρό και εύκολο να πιαστεί, ενώ ένας κανόνας που ονομάζει τη λάθος υπάρχουσα συσκευή αναλύεται καθαρά και επιτρέπει κίνηση που θέλατε να σταματήσετε.
Συλλέξτε τα δεδομένα όσο ο πελάτης είναι συνδεδεμένος, γιατί η συσκευή σήραγγας υπάρχει μόνο τότε. Χρειάζεστε τη διεπαφή που κρατά την προεπιλεγμένη διαδρομή, τη συσκευή που δημιούργησε ο πελάτης, και τη διεύθυνση και τη θύρα του διακομιστή που καλεί. Αυτή η τελευταία τιμή είναι που παραλείπουν τα περισσότερα σύνολα κανόνων, και η παράλειψή της είναι ο λόγος που ένα αντιγραμμένο σύνολο μπλοκάρει τη δική του σήραγγα.
route -n get default
ifconfig -l
scutil --nc list
Η πρώτη εντολή ονομάζει τη διεπαφή που κερδίζει τώρα, η δεύτερη απαριθμεί κάθε συσκευή που γνωρίζει ο πυρήνας, και η τρίτη δείχνει τις ρυθμίσεις VPN που μπορεί να ξεκινήσει το σύστημα. Γράψτε αυτές τις απαντήσεις και μετά διαβάστε τη διεύθυνση και τη θύρα του διακομιστή από τη δική του ρύθμιση του πελάτη.
Γράψτε το σύνολο κανόνων γύρω από τη διαδρομή της σήραγγας
Το αρχείο παρακάτω αρνείται εξ ορισμού και ξαναδέχεται πέντε πράγματα: loopback, τη συσκευή σήραγγας, τη διαδρομή του πελάτη προς τον διακομιστή του, τον επιλυτή που χρησιμοποιείται πριν υπάρξει σήραγγα, και τις δύο ανταλλαγές που κρατούν έναν ασύρματο σύνδεσμο χρησιμοποιήσιμο. Τα ονόματα διεπαφών και η διεύθυνση του διακομιστή προέρχονται από το μηχάνημά σας, οπότε αντικαταστήστε τις τιμές που επιβεβαιώσατε. Ούτε ο αριθμός σήραγγας θα ταιριάζει με τον δικό σας.
set skip on lo0
block all
pass out quick on utun0
# maintain this line when the server address changes
pass out quick on en1 inet proto udp to 203.0.113.10 port 1194
# only the resolver the client uses before the tunnel exists
pass out quick on en1 inet proto udp to 192.0.2.53 port 53
pass out quick on en1 inet proto udp from any port 68 to any port 67
pass out quick on en1 inet proto udp to 224.0.0.251 port 5353
Η γραμμή DHCP υπάρχει επειδή ένα Mac ζητά διεύθυνση πριν την έχει, οπότε το αίτημα φεύγει από τη θύρα 68 προς τη θύρα 67 χωρίς χρησιμοποιήσιμη διεύθυνση προέλευσης. Η γραμμή multicast αφήνει το σύστημα να κρίνει αν αξίζει ο ασύρματος σύνδεσμος, και η αφαίρεσή της παράγει μηχάνημα που αναφέρει καμία σύνδεση σε δίκτυο που δουλεύει. Η γραμμή τελικού σημείου είναι αυτό που αφήνει το OpenVPN να φτάσει καθόλου στον διακομιστή του· χωρίς αυτήν, το block all ρίχνει την εξωτερική χειραψία και η σήραγγα δεν σηκώνεται ποτέ. Η γραμμή επιλυτή είναι στενότερη από μια γενική άδεια DNS, γιατί ονομάζει μία διεύθυνση και μία θύρα αντί για κάθε ερώτημα που κάνει το μηχάνημα.
Αυτές οι εξαιρέσεις τελικού σημείου και επιλυτή είναι οι δύο που πρέπει να υπάρχουν· όλα τα άλλα μένουν μπλοκαρισμένα. Αν ο πελάτης καλεί κυριολεκτική διεύθυνση, αφαιρέστε τη γραμμή επιλυτή και κρατήστε τη γραμμή τελικού σημείου. Αν η διεύθυνση του διακομιστή αλλάξει, ενημερώστε αυτή τη γραμμή πριν την επόμενη σύνδεση, ή γεμίστε έναν πίνακα pf από το δικό του άγκιστρο του πελάτη και ταιριάξτε αντ' αυτού τον πίνακα.
Κατεβάστε τη σήραγγα και μετά επανεκκινήστε
Αναλύστε πριν τη φόρτωση, γιατί ένα συντακτικό λάθος είναι φθηνό σε δοκιμή και ακριβό σε απομακρυσμένη συνεδρία. Μετά φορτώστε το αρχείο, ενεργοποιήστε το φίλτρο αν ήταν κλειστό, και διαβάστε τι ισχύει πραγματικά. Η ανάγνωση δεν είναι τελετουργικό: μια άλλη άγκυρα μπορεί να προσθέσει κανόνες που δεν γράψατε, οπότε συγκρίνετε το εκτυπωμένο σύνολο με το αρχείο σας.
sudo pfctl -n -v -f /etc/pf.conf
sudo pfctl -f /etc/pf.conf
sudo pfctl -e
sudo pfctl -s rules
sudo pfctl -s Anchors
sudo pfctl -a <anchor> -s rules
sudo pfctl -s info
Με τους κανόνες φορτωμένους, κατεβάστε τη σήραγγα και δοκιμάστε να φορτώσετε μια σελίδα. Η συνηθισμένη κίνηση πρέπει να σταματήσει, και πρέπει να μείνει σταματημένη αφού το μηχάνημα κοιμηθεί και ξυπνήσει, γιατί εκείνη η μετάβαση είναι όπου ξαναγλιστρά παρωχημένη κατάσταση. Επανασυνδεθείτε και επιβεβαιώστε ότι η κίνηση επανέρχεται χωρίς να αγγίξετε το σύνολο κανόνων. Αν ένα πρόγραμμα περιήγησης δουλεύει ακόμη με τη σήραγγα κάτω, κάποιος κανόνας είναι ευρύτερος απ' όσο νομίζατε, και η ανάγνωση συνήθως τον ονομάζει.
Η επανεκκίνηση είναι το μέρος που οι άνθρωποι παραλείπουν. Το macOS διαβάζει το /etc/pf.conf στην εκκίνηση, αλλά το να διαβάζεις το αρχείο δεν είναι το ίδιο με το να ενεργοποιείς το φίλτρο, οπότε ένα σύνολο κανόνων που δουλεύει τώρα μπορεί να είναι ανενεργό μετά από επανεκκίνηση. Τρέξτε μετά το sudo pfctl -s info και επιβεβαιώστε ότι η γραμμή κατάστασης αναφέρει το φίλτρο ως ενεργό.
Κρατήστε την έξοδο και τη διαδρομή επανεκκίνησης έντιμες
Ένα σύνολο κανόνων που μπλοκάρει τα πάντα μπορεί επίσης να σας κλειδώσει έξω από μηχάνημα που διαχειρίζεστε απομακρυσμένα. Επεξεργαστείτε από τοπική συνεδρία όταν μπορείτε, κρατήστε το προηγούμενο αρχείο δίπλα στο νέο, και ξέρετε την επιστροφή πριν τη χρειαστείτε. Οι εντολές παρακάτω απενεργοποιούν το φίλτρο και επαναφορτώνουν το αντίγραφο που κρατήσατε, και είναι η σειρά για κονσόλα, όχι μέσα από τη σήραγγα που μόλις κόψατε. Μια επιστροφή πέντε δευτερολέπτων κερδίζει κάθε φορά έναν έξυπνο κανόνα.
sudo pfctl -d
sudo pfctl -f /etc/pf.conf.previous
sudo pfctl -s rules
Η επιμονή απαιτεί ένα launch daemon που τρέχει το pfctl -e και φορτώνει το αρχείο σας στην εκκίνηση. Αντιμετωπίστε το όπως κάθε άλλη προνομιακή εργασία: απόλυτες διαδρομές, αρχείο καταγραφής που μπορείτε να διαβάσετε μετά, και δοκιμή σε μηχάνημα που μπορείτε να φτάσετε φυσικά. Ένα daemon που αποτυγχάνει σιωπηλά αφήνει το μηχάνημα απροστάτευτο και να φαίνεται φυσιολογικό.
Τεκμηριώστε τα κενά, ξεκινώντας με δεύτερο πελάτη VPN που δημιουργεί τη δική του συσκευή σήραγγας. Οι κανόνες σας ονομάζουν μία διεπαφή σήραγγας, οπότε μια δεύτερη μένει μπλοκαρισμένη ή την πιάνει ένας ευρύς κανόνας που προστίθεται αργότερα. Οι διεπαφές tethering και hotspot εμφανίζονται μόνο μερικές φορές και αξίζουν την ίδια σημείωση. Κανένα από αυτά τα κενά δεν είναι λόγος να παραλείψετε την πολιτική· είναι οι συνθήκες υπό τις οποίες εξακολουθεί να ισχύει.