Ο συγγραφέας του IPFILTER είναι ο Darren Reed. Το IPFILTER δεν εξαρτάται από το λειτουργικό σύστημα: είναι μια εφαρμογή ανοικτού κώδικα που έχει μεταφερθεί στο FreeBSD, το NetBSD, το OpenBSD, το SunOS™, το HP/UX και το Solaris™. Το IPFILTER είναι υπό διαρκή και ενεργή ανάπτυξη και συντήρηση, και κυκλοφορούν τακτικά οι νέες εκδόσεις του.
Το IPFILTER είναι ένα firewall και μηχανισμός NAT που λειτουργεί στον πυρήνα και μπορεί να ελέγχεται και να παρακολουθείται από προγράμματα χρήστη. Οι κανόνες του firewall μπορούν να τίθενται σε ισχύ ή να διαγράφονται μέσω του βοηθητικού προγράμματος ipf(8). Οι κανόνες για το NAT μπορούν να τίθενται σε ισχύ ή να διαγράφονται μέσω του βοηθητικού προγράμματος ipnat(1). Το βοηθητικό πρόγραμμα ipfstat(8) μπορεί να εκτυπώσει στατιστικά εκτέλεσης για το τμήμα του IPFILTER που εκτελείται στον πυρήνα. Το πρόγραμμα ipmon(8) μπορεί να καταγράψει τις ενέργειες του IPFILTER στο αρχεία καταγραφής συμβάντων του συστήματος.
Το IPF γράφηκε αρχικά χρησιμοποιώντας μια λογική επεξεργασίας κανόνων του τύπου “ο τελευταίο κανόνας που ταιριάζει, είναι και ο νικητής” και χρησιμοποιούσε μόνο κανόνες τύπου stateless. Με την πάροδο του χρόνου, το IPF βελτιώθηκε για να περιλαμβάνει την επιλογή “quick” και την επιλογή “keep state” για stateful κανόνες. Οι επιλογές αυτές εκσυγχρόνισαν δραματικά τη λογική επεξεργασίας των κανόνων. Η επίσημη τεκμηρίωση του IPF καλύπτει μόνο τις παλιές παραμέτρους ρύθμισης και επεξεργασίας των κανόνων. Οι σύγχρονες λειτουργίες καλύπτονται μόνο ως πρόσθετες επιλογές, και έτσι δεν τονίζονται αρκετά τα πλεονεκτήματα τους στη δημιουργία ενός πολύ καλύτερου και ασφαλέστερου firewall.
Οι οδηγίες που περιέχονται σε αυτή την ενότητα, βασίζονται στη χρήση κανόνων που περιέχουν την επιλογή “quick” καθώς και την stateful επιλογή “keep state”. Αυτό είναι και το βασικό πλαίσιο λειτουργιών για την δημιουργία του σετ κανόνων ενός inclusive firewall.
Για λεπτομέρειες σχετικά με τον παλιότερο τρόπο επεξεργασίας των κανόνων, δείτε: http://www.obfuscation.org/ipf/ipf-howto.html#TOC_1 και http://coombs.anu.edu.au/~avalon/ip-filter.html.
Μπορείτε να δείτε το IPF FAQ στην τοποθεσία http://www.phildev.net/ipf/index.html.
Μπορείτε να βρείτε τις παλαιότερες δημοσιεύσεις τις λίστας ταχυδρομείου του IPFILTER στο http://marc.theaimsgroup.com/?l=ipfilter. Παρέχεται δυνατότητα αναζήτησης.
Το IPF περιλαμβάνεται στη βασική εγκατάσταση του FreeBSD ως άρθρωμα
το οποίο μπορεί να φορτωθεί χωριστά. Το σύστημα θα φορτώσει δυναμικά
το άρθρωμα του IPF αν υπάρχει η καταχώριση
ipfilter_enable="YES"
στο αρχείο
/etc/rc.conf
. Το άρθρωμα έχει δημιουργηθεί με
ενεργοποιημένη την δυνατότητα καταγραφής και με την επιλογή
default pass all
. Για να αλλάξετε αυτή την
προεπιλογή σε block all
, μπορείτε απλώς να
προσθέσετε τον κανόνα απόρριψης (block all) στο τέλος των κανόνων σας.
Δεν χρειάζεται να μεταγλωττίσετε την επιλογή IPF στο πυρήνα του FreeBSD
για το σκοπό αυτό.
Δεν είναι υποχρεωτικό να μεταγλωττίσετε τις παρακάτω επιλογές στον πυρήνα του FreeBSD για να ενεργοποιήσετε το IPF. Η παρουσίαση τους εδώ είναι καθαρά ενημερωτική. Αν μεταγλωττίσετε το IPF απευθείας στον πυρήνα, δεν θα χρησιμοποιηθεί ποτέ το αντίστοιχο άρθρωμα.
Στο αρχείο /usr/src/sys/conf/NOTES
θα βρείτε
παραδείγματα καταχωρίσεων IPF για το αρχείο ρύθμισης του πυρήνα. Οι
επιλογές αυτές φαίνονται επίσης παρακάτω:
Η επιλογή options IPFILTER
ενεργοποιεί την
υποστήριξη για το “IPFILTER” firewall.
Η επιλογή options IPFILTER_LOG
ενεργοποιεί την
υποστήριξη καταγραφής του IPF, η οποία γράφει στην ψευδο-συσκευή
καταγραφής πακέτων ipl
για κάθε κανόνα που
περιλαμβάνει την επιλογή log
.
Η επιλογή options IPFILTER_DEFAULT_BLOCK
αλλάζει την προεπιλεγμένη συμπεριφορά, ώστε κάθε πακέτο που δεν
ταιριάζει με κάποιο κανόνα pass
του firewall,
να απορρίπτεται αυτόματα.
Οι παραπάνω επιλογές θα ενεργοποιηθούν μόνο αφού μεταγλωττίσετε και εγκαταστήσετε ένα προσαρμοσμένο πυρήνα που να τις περιλαμβάνει.
Χρειάζεστε τις παρακάτω καταχωρίσεις στο
/etc/rc.conf
για να ενεργοποιήσετε το IPF κατά
την εκκίνηση του υπολογιστή:
Αν πίσω από αυτό το firewall υπάρχει κάποιο LAN που χρησιμοποιεί δεσμευμένες ιδιωτικές διευθύνσεις, θα χρειαστεί να προσθέσετε τις παρακάτω καταχωρίσεις για να ενεργοποιήσετε τη λειτουργία NAT:
Η εντολή ipf(8) χρησιμοποιείται για να φορτώσει το αρχείο των κανόνων. Φυσιολογικά, θα δημιουργήσετε ένα αρχείο με τους δικούς σας προσαρμοσμένους κανόνες και θα αντικαταστήσετε με αυτό εξ'ολοκλήρου τους ενσωματωμένους κανόνες του firewall:
#
ipf -Fa -f /etc/ipf.rules
Η επιλογή -Fa
αδειάζει τους κανόνες από τους
εσωτερικούς πίνακες του firewall.
Η επιλογή -f
καθορίζει το αρχείο των κανόνων που
θα φορτωθεί.
Αυτό σας δίνει την δυνατότητα να αλλάξετε το αρχείο κανόνων σας, να εκτελέσετε την εντολή IPF που αναφέραμε παραπάνω, και να ανανεώσετε με αυτό τον τρόπο τους κανόνες στο firewall που εκτελείται ήδη με καινούργιους, χωρίς να χρειαστεί να επανεκκινήσετε το σύστημα σας. Η μέθοδος αυτή είναι πολύ βολική για να δοκιμάσετε νέους κανόνες, καθώς μπορεί να επαναληφθεί όσες φορές θέλετε.
Δείτε τη σελίδα manual του ipf(8) για λεπτομέρειες σχετικά με τις υπόλοιπες επιλογές που μπορείτε να χρησιμοποιήσετε με την εντολή αυτή.
Η εντολή ipf(8) αναμένει ένα απλό αρχείο κειμένου ως αρχείο κανόνων. Δεν θα δεχθεί αρχείο κανόνων γραμμένο ως script με συμβολικές αντικαταστάσεις.
Υπάρχει ωστόσο τρόπος να γράψετε κανόνες IPF που να χρησιμοποιούν την ισχύ των συμβολικών αντικαταστάσεων. Για περισσότερες πληροφορίες, δείτε το Τμήμα 31.5.9, “Δημιουργία Script Κανόνων με Συμβολική Υποκατάσταση”.
Η προεπιλεγμένη συμπεριφορά του ipfstat(8) είναι να ανακτά
και να απεικονίζει το σύνολο των στατιστικών που συγκεντρώθηκαν ως
αποτέλεσμα της εφαρμογής των κανόνων του χρήστη στα πακέτα που
εισέρχονται και εξέρχονται από το firewall, από τη στιγμή της
τελευταίας του εκκίνησης ή από τον τελευταίο τους μηδενισμό μέσω της
εντολής ipf -Z
.
Δείτε τη σελίδα manual ipfstat(8) για λεπτομέρειες.
Η προεπιλεγμένη έξοδος της εντολής ipfstat(8) θα μοιάζει με την παρακάτω:
Όταν χρησιμοποιηθεί η επιλογή -i
για τα
εισερχόμενα ή η επιλογή -o
για τα εξερχόμενα πακέτα,
η εντολή θα ανακτήσει και θα απεικονίσει την αντίστοιχη λίστα
κανόνων που είναι εγκατεστημένη και χρησιμοποιείται από τον πυρήνα τη
δεδομένη στιγμή.
Η εντολή ipfstat -in
δείχνει ένα αριθμημένο
πίνακα κανόνων για εισερχόμενα πακέτα.
Η εντολή ipfstat -on
δείχνει ένα αριθμημένο
πίνακα κανόνων για εξερχόμενα πακέτα.
Η έξοδος θα μοιάζει με την παρακάτω:
Η εντολή ipfstat -ih
δείχνει τον πίνακα
κανόνων για τα εισερχόμενα πακέτα, τοποθετώντας μπροστά από τον
κάθε κανόνα ένα αριθμό που δείχνει πόσες φορές έχει
χρησιμοποιηθεί.
Η εντολή ipfstat -oh
δείχνει τον πίνακα
κανόνων για τα εξερχόμενα πακέτα, τοποθετώντας μπροστά από τον
κάθε κανόνα ένα αριθμό που δείχνει πόσες φορές έχει
χρησιμοποιηθεί.
Η έξοδος θα μοιάζει με την παρακάτω:
Μια από τις πιο σημαντικές λειτουργίες της εντολής
ipfstat
είναι η επιλογή -t
η
οποία απεικονίζει τον πίνακα καταστάσεων, με τρόπο όμοιο με αυτό
που χρησιμοποιεί η εντολή top(1) για να δείξει τον πίνακα
διεργασιών που εκτελούνται στο FreeBSD. Όταν το firewall σας δέχεται
επίθεση, η λειτουργία αυτή σας δίνει την δυνατότητα να αναγνωρίσετε
και να εστιάσετε στα ίδια τα πακέτα που την αποτελούν.
Οι προαιρετικές υπο-επιλογές σας δίνουν την δυνατότητα να επιλέξετε
το IP αφετηρίας ή προορισμού, την θύρα, ή το πρωτόκολλο το οποίο
θέλετε να παρακολουθήσετε σε πραγματικό χρόνο. Δείτε τη σελίδα
manual του ipfstat(8) για περισσότερες λεπτομέρειες.
Για να λειτουργήσει σωστά η εντολή ipmon
,
θα πρέπει να ενεργοποιηθεί η επιλογή IPFILTER_LOG
στον πυρήνα. Η εντολή αυτή διαθέτει δύο διαφορετικούς τρόπους
λειτουργίας. Ο προεπιλεγμένος κανονικός τρόπος λειτουργίας
ενεργοποιείται όταν η εντολή χρησιμοποιείται χωρίς την επιλογή
-D
.
Η εντολή μπορεί να χρησιμοποιηθεί σε λειτουργία δαίμονα όταν
επιθυμείτε να έχετε ένα συνεχόμενο αρχείο καταγραφής ώστε να μπορείτε
να εξετάσετε τις προηγούμενες εγγραφές. Αυτός είναι και ο τρόπος με
τον οποίο έχει ρυθμιστεί να συνεργάζεται το FreeBSD με το IPFILTER.
Το FreeBSD έχει ενσωματωμένη δυνατότητα εναλλαγής αρχείων καταγραφής.
Για αυτό το λόγο, είναι καλύτερο η καταγραφή να γίνεται μέσω του
syslogd(8) παρά σε ένα συνηθισμένο αρχείο. Από προεπιλογή, η
ρύθμιση ipmon_flags
στο αρχείο
rc.conf
χρησιμοποιεί τις επιλογές
-Ds
:
Τα πλεονεκτήματα της καταγραφής είναι προφανή. Παρέχει την δυνατότητα επισκόπησης πληροφοριών όπως τα πακέτα που απορρίφθηκαν, τις διευθύνσεις από τις οποίες λήφθηκαν, και τον προορισμό τους. Έχετε έτσι ένα σημαντικό πλεονέκτημα όταν προσπαθείτε να αναγνωρίσετε ένα εισβολέα.
Ακόμα και όταν ενεργοποιήσετε την δυνατότητα καταγραφής, το IPF δεν θα καταγράψει τίποτα αν δεν έχει γίνει η αντίστοιχη ρύθμιση στους κανόνες. Ο διαχειριστής του firewall αποφασίζει για ποιους κανόνες του σετ θέλει να ενεργοποιήσει την καταγραφή, και προσθέτει σε αυτούς την λέξη log. Φυσιολογικά, η καταγραφή ενεργοποιείται μόνο σε κανόνες που απορρίπτουν πακέτα.
Είναι πολύ συνηθισμένο να περιλαμβάνεται ένας κανόνας στο τέλος του συνόλου, που να απορρίπτει από προεπιλογή όλα τα πακέτα που φτάνουν μέχρι εκεί (default deny). Με τον τρόπο αυτό μπορείτε να δείτε όλα τα πακέτα που δεν ταίριαξαν με κανένα κανόνα του σετ.
Το syslogd χρησιμοποιεί τη δική του
ειδική μέθοδο για το διαχωρισμό των δεδομένων καταγραφής.
Διαθέτει ειδικές ομαδοποιήσεις που ονομάζονται
“facility” και “level”. Όταν το IPMON
χρησιμοποιείται με την επιλογή -Ds
, χρησιμοποιεί
από προεπιλογή το local0
ως όνομα
“facility”. Αν το επιθυμείτε, μπορείτε να
χρησιμοποιήσετε τα παρακάτω επίπεδα για περαιτέρω διαχωρισμό των
δεδομένων καταγραφής:
Για να ρυθμίσετε το IPFILTER να καταγράφει όλα τα δεδομένα στο
/var/log/ipfilter.log
, θα χρειαστεί να
δημιουργήσετε από πριν το αρχείο. Αυτό μπορεί να γίνει με την
παρακάτω εντολή:
#
touch /var/log/ipfilter.log
Η λειτουργία του syslogd(8) μπορεί να ρυθμιστεί με
καταχωρίσεις στο αρχείο /etc/syslog.conf
.
Το αρχείο syslog.conf
προσφέρει σημαντική
ευελιξία στον τρόπο με τον οποίο το syslog
αντιμετωπίζει τα μηνύματα συστήματος που προέρχονται από εφαρμογές
όπως το IPF.
Προσθέστε την παρακάτω καταχώριση στο αρχείο
/etc/syslog.conf
:
Το local0.*
σημαίνει ότι θα γίνεται
καταγραφή όλων των μηνυμάτων αυτού του τύπου στην τοποθεσία που έχει
οριστεί.
Για να ενεργοποιήσετε τις αλλαγές στο
/etc/syslog.conf
θα πρέπει να επανεκκινήσετε το
μηχάνημα ή να αναγκάσετε το syslogd(8) να ξαναδιαβάσει το
/etc/syslog.conf
, εκτελώντας την εντολή
/etc/rc.d/syslogd reload
Μην ξεχάσετε να τροποποιήσετε το
/etc/newsyslog.conf
ώστε να εναλλάσσει το αρχείο
καταγραφής που δημιουργήσατε παραπάνω.
Τα μηνύματα που παράγονται από την ipmon
αποτελούνται από πεδία δεδομένων που χωρίζονται από λευκό διάστημα.
Τα πεδία που είναι κοινά σε όλα τα μηνύματα, είναι τα παρακάτω:
Η ημερομηνία παραλαβής του πακέτου
Η ώρα παραλαβής του πακέτου. Έχει την μορφή HH:MM:SS.F, η οποία υποδηλώνει ώρες, λεπτά, δευτερόλεπτα και κλάσματα δευτερολέπτου (τα οποία μπορεί να είναι πολλά δεκαδικά ψηφία).
Το όνομα της διεπαφής στην οποία έγινε η επεξεργασία του
πακέτου π.χ. dc0
.
Ο αριθμός ομάδας και ο αύξων αριθμός του κανόνα, π.χ.
@0:17
.
Μπορείτε να δείτε τα παρακάτω με την εντολή
ipfstat -in
:
Το είδος της ενέργειας: p αν το πακέτο πέρασε, b αν το πακέτο απορρίφθηκε, S για σύντομο πακέτο, n αν δεν ταίριαξε με κανένα κανόνα, L για κανόνα με καταγραφή. Η σειρά προτεραιότητας στην απεικόνιση των παραπάνω, είναι S, p, b, n, L. Το κεφαλαίο P ή το B σημαίνουν ότι η καταγραφή του πακέτου έγινε λόγω κάποιας γενικής ρύθμισης καταγραφής και όχι εξαιτίας κάποιου κανόνα.
Οι διευθύνσεις. Πρόκειται στην πραγματικότητα για τρία
πεδία: τη διεύθυνση και τη θύρα αφετηρίας (χωρίζονται με κόμμα),
το σύμβολο -> και την διεύθυνση και θύρα προορισμού, π.χ.
209.53.17.22,80 -> 198.73.220.17,1722
.
Το PR
ακολουθούμενο από το όνομα ή τον
αριθμό του πρωτοκόλλου, π.χ. PR tcp
.
Το len
ακολουθούμενο από το μήκος της
επικεφαλίδας και το συνολικό μήκος του πακέτου, π.χ.
len 20 40
.
Αν πρόκειται για πακέτο TCP, θα υπάρχει ένα επιπλέον πεδίο το οποίο θα ξεκινάει με μια παύλα και θα ακολουθείται από γράμματα τα οποία αντιστοιχούν στις επιλογές (flags) που έχουν τεθεί. Δείτε τη σελίδα manual ipf(5) για τη λίστα των γραμμάτων και των αντίστοιχων flags.
Αν πρόκειται για πακέτο ICMP, θα υπάρχουν δύο πεδία στο τέλος, το πρώτο θα είναι πάντα “ICMP” και το επόμενο θα είναι ο τύπος του μηνύματος και του υπό-μηνύματος ICMP, χωρισμένα με μια κάθετο, π.χ. ICMP 3/3 για ένα μήνυμα μη προσβάσιμης θύρας (port unreachable).
Ορισμένοι έμπειροι χρήστες του IPF δημιουργούν ένα αρχείο κανόνων το οποίο μπορεί να εκτελεστεί ως script με δυνατότητα συμβολικής υποκατάστασης. Το βασικό όφελος του παραπάνω, είναι ότι χρειάζεται να αλλάξετε μόνο την τιμή που σχετίζεται με το συμβολικό όνομα και όταν το script εκτελεστεί, η τιμή θα υποκατασταθεί σε όλους τους κανόνες που περιέχουν το όνομα αυτό. Καθώς πρόκειται για script, μπορείτε να χρησιμοποιήσετε συμβολική υποκατάσταση για να κωδικοποιήσετε συχνά χρησιμοποιούμενες τιμές και να τις υποκαθιστάτε σε πολλαπλούς κανόνες. Αυτό φαίνεται και στο παράδειγμα που ακολουθεί.
Η σύνταξη του script που χρησιμοποιείται εδώ, είναι συμβατή με τα κελύφη sh(1), csh(1), και tcsh(1).
Τα πεδία στα οποία γίνεται συμβολική υποκατάσταση προσημειώνονται
με το σήμα του δολαρίου: $
.
Τα συμβολικά πεδία δεν έχουν την προσημείωση με το $.
Η τιμή που θα χρησιμοποιηθεί στο συμβολικό πεδίο, θα πρέπει να
εσωκλείεται σε διπλά εισαγωγικά ("
).
Ξεκινήστε το αρχείο των κανόνων σας με κάτι αντίστοιχο με το παρακάτω:
Αυτό είναι όλο. Στο παραπάνω παράδειγμα δεν είναι σημαντικοί
οι κανόνες, αλλά ο τρόπος με τον οποίο λειτουργούν και παίρνουν τιμές
τα πεδία υποκατάστασης. Αν το παραπάνω παράδειγμα βρίσκονταν σε ένα
αρχείο με το όνομα /etc/ipf.rules.script
,
θα μπορούσατε να επαναφορτώσετε αυτούς τους κανόνες με την παρακάτω
εντολή:
#
sh /etc/ipf.rules.script
Υπάρχει ένα πρόβλημα όταν χρησιμοποιούνται αρχεία κανόνων με ενσωματωμένους συμβολισμούς: Το IPF δεν καταλαβαίνει τη συμβολική υποκατάσταση, και δεν μπορεί να διαβάσει αυτά τα scripts άμεσα.
Ένα τέτοιο script μπορεί να χρησιμοποιηθεί με ένα από τους δύο παρακάτω τρόπους:
Αφαιρέστε το σχόλιο από τη γραμμή που ξεκινάει με
cat
, και μετατρέψτε σε σχόλιο τη γραμμή που
ξεκινάει με /sbin/ipf
. Τοποθετήστε το
ipfilter_enable="YES"
στο αρχείο
/etc/rc.conf
όπως συνήθως, και εκτελέστε
το script μια φορά μετά από κάθε αλλαγή για να δημιουργήσετε ή να
ενημερώσετε το /etc/ipf.rules
.
Απενεργοποιήστε το IPFILTER στα scripts εκκίνησης του
συστήματος, προσθέτοντας την καταχώριση
ipfilter_enable="NO"
(πρόκειται για την
προεπιλεγμένη τιμή) στο αρχείο
/etc/rc.conf
.
Προσθέστε ένα script όπως το παρακάτω στον κατάλογο εκκίνησης
/usr/local/etc/rc.d/
. Το
script θα πρέπει να έχει ένα προφανές όνομα, όπως
ipf.loadrules.sh
. Η επέκταση
.sh
είναι υποχρεωτική.
Οι άδειες σε αυτό το αρχείο, θα πρέπει να επιτρέπουν ανάγνωση,
εγγραφή και εκτέλεση για τον χρήστη
root
.
#
chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh
Οι κανόνες του IPF θα φορτώνονται πλέον κατά την εκκίνηση του συστήματος σας.
Ως “σύνολο κανόνων” στο IPF, ορίζουμε μια ομάδα κανόνων που έχουν γραφεί για να επιτρέπουν ή να απορρίπτουν πακέτα ανάλογα με τις τιμές που περιέχονται σε αυτά. Η διπλής κατεύθυνσης ανταλλαγή πακέτων μεταξύ υπολογιστών αποτελεί μια συνεδρία. Το σύνολο κανόνων του firewall επεξεργάζεται τόσο τα πακέτα που έρχονται από το Internet, όσο και τα πακέτα που παράγονται από το σύστημα ως απάντηση σε αυτά. Κάθε υπηρεσία TCP/IP (π.χ. telnet, www, mail, κ.λ.π.) καθορίζεται από το πρωτόκολλο και την προνομιακή (privileged) θύρα που χρησιμοποιεί για να δέχεται αιτήματα εξυπηρέτησης. Τα πακέτα που προορίζονται για μια συγκεκριμένη υπηρεσία, ξεκινούν από τη διεύθυνση αφετηρίας χρησιμοποιώντας μια μη-προνομιακή θύρα και καταλήγουν στη συγκεκριμένη θύρα υπηρεσίας στον προορισμό. Όλες οι παραπάνω παράμετροι (θύρες και διευθύνσεις) μπορούν να χρησιμοποιηθούν ως κριτήρια επιλογής για την δημιουργία κανόνων που επιτρέπουν ή εμποδίζουν την πρόσβαση σε υπηρεσίες.
Το IPF γράφτηκε αρχικά χρησιμοποιώντας μια λογική επεξεργασίας κανόνων του τύπου “ο τελευταίος κανόνας που ταιριάζει, είναι ο νικητής” και χρησιμοποιούσε μόνο κανόνες stateless. Με την πάροδο του χρόνου, το IPF ενισχύθηκε με την επιλογή “quick” και με δυνατότητα αποθήκευσης κατάστασης μέσω της επιλογής “keep state”. Με τον τρόπο αυτό, εκσυγχρονίστηκε δραματικά η λογική επεξεργασίας των κανόνων.
Οι οδηγίες που περιέχονται σε αυτή την ενότητα βασίζονται στη χρήση κανόνων που περιέχουν την επιλογή “quick” και την επιλογή “keep state” για τη διατήρηση της κατάστασης. Αυτές είναι και οι βασικές λειτουργίες για την κωδικοποίηση του συνόλου κανόνων ενός inclusive firewall.
Όταν δουλεύετε με τους κανόνες του firewall, θα πρέπει να είστε πολύ προσεκτικοί. Αν βάλετε λανθασμένες ρυθμίσεις, μπορεί να κλειδωθείτε έξω από τον εξυπηρετητή σας. Για να είστε ασφαλείς, είναι προτιμότερο να κάνετε τις αρχικές σας ρυθμίσεις από την τοπική κονσόλα, παρά μέσω απομακρυσμένης σύνδεσης (π.χ. μέσω ssh).
Το συντακτικό των κανόνων που παρουσιάζουμε εδώ, έχει απλοποιηθεί ώστε να απεικονίζει τη σύγχρονη stateful υλοποίηση και τη λογική του τύπου “ο πρώτος κανόνας που ταιριάζει είναι και ο νικητής”. Για την περιγραφή του παλιότερου τρόπου λειτουργίας, διαβάστε τη σελίδα manual του ipf(8).
Ο χαρακτήρας #
χρησιμοποιείται για να
επισημάνει την αρχή ενός σχολίου, και μπορεί να εμφανίζεται στο τέλος
μιας γραμμής κανόνα ή στη δική του γραμμή. Οι κενές γραμμές
αγνοούνται.
Οι κανόνες περιέχουν λέξεις-κλειδιά. Οι λέξεις αυτές θα πρέπει να κωδικοποιηθούν με συγκεκριμένη σειρά από τα αριστερά προς τα δεξιά της γραμμής. Οι λέξεις-κλειδιά φαίνονται παρακάτω με έντονα γράμματα. Μερικές λέξεις έχουν υπο-επιλογές οι οποίες μπορεί να είναι επίσης λέξεις-κλειδιά και να περιλαμβάνουν επίσης περισσότερες υπο-επιλογές. Κάθε μια από τις επικεφαλίδες στο παράδειγμα που φαίνεται παρακάτω έχει μια κεφαλίδα με έντονα γράμματα η οποία επεξηγεί το περιεχόμενο της.
ACTION IN-OUT OPTIONS SELECTION STATEFUL PROTO
SRC_ADDR,DST_ADDR OBJECT PORT_NUM TCP_FLAG
STATEFUL
ACTION
= block | pass
IN-OUT
= in | out
OPTIONS
= log | quick | on
interface-name
SELECTION
= proto value |
source/destination IP | port = number | flags
flag-value
PROTO
= tcp/udp | udp | tcp |
icmp
SRC_ADD,DST_ADDR
= all | from
object to object
OBJECT
= IP address | any
PORT_NUM
= port number
TCP_FLAG
= S
STATEFUL
= keep state
Η ενέργεια (action) δείχνει τι πρέπει να γίνει με το πακέτο αν ταιριάζει με τον κανόνα του φίλτρου. Κάθε κανόνας πρέπει να διαθέτει μια ενέργεια. Οι ενέργειες που αναγνωρίζονται, φαίνονται παρακάτω:
Το block
δείχνει ότι το πακέτο θα πρέπει να
απορριφθεί αν ταιριάζει με τις παραμέτρους επιλογής του
κανόνα.
Το pass
δείχνει ότι το πακέτο θα πρέπει να
εξέλθει από το firewall, αν ταιριάζει με τις παραμέτρους επιλογής
του κανόνα.
Κάθε κανόνας του φίλτρου πρέπει υποχρεωτικά να διευκρινίζει
με σαφήνεια αν αναφέρεται στην είσοδο ή την έξοδο πακέτων.
Η επόμενη λέξη-κλειδί πρέπει να είναι in
ή
out
και αν δεν υπάρχει, ο κανόνας θα αποτύχει
κατά το συντακτικό έλεγχο.
Το in
σημαίνει ότι ο κανόνας θα εφαρμοστεί
σε ένα εισερχόμενο πακέτο το οποίο μόλις λήφθηκε στη διεπαφή που
συνδέεται με το Διαδίκτυο.
Το out
σημαίνει ότι ο κανόνας θα εφαρμοστεί
σε ένα πακέτο που προορίζεται για έξοδο μέσω της διεπαφής που
συνδέεται με το Διαδίκτυο.
Οι παρακάτω επιλογές πρέπει να χρησιμοποιηθούν με τη σειρά που φαίνονται εδώ.
Το log
δείχνει ότι η επικεφαλίδα του πακέτου
θα γραφεί στο αρχείο καταγραφής του
ipl
(όπως περιγράφεται στην ενότητα
LOGGING που ακολουθεί) αν οι παράμετροι της επιλογής ταιριάζουν με
το πακέτο.
To quick
δείχνει ότι αν οι παράμετροι της
επιλογής ταιριάζουν με το πακέτο, ο συγκεκριμένος κανόνας θα είναι
και ο τελευταίος κανόνας που θα ελεγχθεί. Η επιλογή αυτή είναι
υποχρεωτική για τη σύγχρονη λογική επεξεργασίας πακέτων.
Το on
δείχνει το όνομα της διεπαφής που θα
ενσωματωθεί στις παραμέτρους επιλογής. Τα ονόματα των διεπαφών
φαίνονται όταν εκτελείται η εντολή ifconfig(8).
Χρησιμοποιώντας την επιλογή αυτή, ο κανόνας θα ελεγχθεί μόνο αν το
πακέτο διέρχεται μέσω της συγκεκριμένης διεπαφής και προς τη
συγκεκριμένη κατεύθυνση (εισερχόμενα/εξερχόμενα). Η επιλογή αυτή
είναι υποχρεωτική για την σύγχρονη λογική επεξεργασίας των
κανόνων.
Όταν γίνεται καταγραφή ενός πακέτου, οι επικεφαλίδες γράφονται
στην ψευδο-συσκευή καταγραφής πακέτων IPL.
Μετά την εντολή log
, μπορούν να χρησιμοποιηθούν
οι παρακάτω παράμετροι (με τη σειρά που φαίνονται):
Το body
δείχνει ότι θα γίνει καταγραφή των
πρώτων 128 bytes των περιεχομένων του πακέτου, που βρίσκονται αμέσως
μετά την επικεφαλίδα.
Η επιλογή first
συνίσταται να χρησιμοποιηθεί
αν η επιλογή log
χρησιμοποιείται σε συνδυασμό
με την keep state
. Με τον τρόπο αυτό γίνεται
καταγραφή μόνο του πρώτου πακέτου (με το οποίο ξεκίνησε η
επικοινωνία), και όχι όλων των υπολοίπων τα οποία ταιριάζουν με την
πληροφορία “keep state”.
Οι λέξεις κλειδιά που περιγράφονται σε αυτή την ενότητα, χρησιμοποιούνται για να περιγράψουν ποιες ιδιότητες του πακέτου θα διερευνηθούν για να καθοριστεί αν ταιριάζει ή όχι με τους κανόνες. Μια λέξη-κλειδί ορίζει το κεντρικό θέμα και ακολουθείται από άλλες λέξεις που ορίζουν τις ακριβείς επιλογές. Πρέπει πάντοτε να επιλέγεται μια από αυτές τις λέξεις. Παρέχονται οι παρακάτω ιδιότητες γενικής χρήσης οι οποίες πρέπει να χρησιμοποιηθούν με αυτή τη σειρά:
Το proto
είναι η βασική λέξη, και πρέπει
να γράφεται μαζί με κάποια αντίστοιχη τιμή για περαιτέρω επιλογή.
Η τιμή επιτρέπει το ταίριασμα με ένα συγκεκριμένο πρωτόκολλο. Είναι
υποχρεωτικό να χρησιμοποιηθεί για να λειτουργεί η σύγχρονη λογική
επεξεργασίας των κανόνων.
Τα ονόματα πρωτοκόλλων που αναγνωρίζονται και μπορούν να
χρησιμοποιηθούν, είναι τα
tcp/udp | udp | tcp | icmp
ή οποιαδήποτε άλλα
εμφανίζονται στο /etc/protocols
. Μπορείτε να
χρησιμοποιήσετε το ειδικό όνομα tcp/udp
το οποίο
ταιριάζει είτε με πακέτο TCP είτε με
UDP. Η ειδική αυτή ονομασία προστέθηκε ώστε να
αποφεύγονται διπλοί, αλλά κατά τα άλλα όμοιοι, κανόνες.
Η λέξη all
είναι ουσιαστικά συνώνυμη με την
φράση “from any to any” χωρίς να υπάρχουν άλλες
παράμετροι για το ταίριασμα.
Όταν χρησιμοποιείται το from src to dst
, οι
λέξεις from
και to
δηλώνουν
διευθύνσεις IP που θα χρησιμοποιηθούν για το ταίριασμα. Οι κανόνες
πρέπει να καθορίζουν τις παραμέτρους τόσο της αφετηρίας όσο και του
προορισμού. Η λέξη any
έχει την ειδική ιδιότητα
να ταιριάζει με οποιαδήποτε διεύθυνση IP. Παραδείγματα χρήσης:
from any to any
ή
from 0.0.0.0/0 to any
ή
from any to 0.0.0.0/0
ή
from 0.0.0.0 to any
ή
from any to 0.0.0.0
.
Δεν υπάρχει τρόπος να περιγραφούν περιοχές IP διευθύνσεων που
δεν μπορούν να εκφραστούν εύκολα με τη μορφή αριθμών χωρισμένων με
τελείες / μάσκας υποδικτύου. Μπορείτε να χρησιμοποιήσετε το
βοηθητικό πρόγραμμα net-mgmt/ipcalc
για διευκόλυνση σας
στους υπολογισμούς. Δείτε την δικτυακή τοποθεσία του προγράμματος
για περισσότερες πληροφορίες: http://jodies.de/ipcalc.
Το ταίριασμα με κάποια συγκεκριμένη θύρα αφετηρίας ή/και
προορισμού (αν υπάρχει) εφαρμόζεται μόνο σε πακέτα
TCP και UDP. Κατά την
δημιουργία συγκρίσεων με θύρες, μπορείτε είτε να χρησιμοποιήσετε τον
αριθμό της θύρας, είτε το όνομα της αντίστοιχης υπηρεσίας
από το αρχείο /etc/services
. Όταν η θύρα
εμφανίζεται ως τμήμα του αντικειμένου from
, το
ταίριασμα θα γίνει με την θύρα της αφετηρίας. Όταν εμφανίζεται ως
τμήμα του αντικειμένου to
, το ταίριασμα θα γίνει
με τη θύρα προορισμού. Για να λειτουργεί η σύγχρονη λογική
ταιριάσματος κανόνων, θα πρέπει οπωσδήποτε να υπάρχει η επιλογή
θύρας στο αντικείμενο to
. Παράδειγμα χρήσης:
from any to any port = 80
Οι συγκρίσεις που αναφέρονται σε μια μόνο θύρα, μπορούν να γίνουν με πολλούς διαφορετικούς τρόπους, χρησιμοποιώντας διαφορετικούς τελεστές σύγκρισης. Είναι επίσης δυνατόν να καθοριστούν ολόκληρες περιοχές από θύρες.
port "=" | "!=" | "<" | ">" | "<=" | ">=" | "eq" | "ne" | "lt" | "gt" | "le" | "ge".
Για να καθορίσετε περιοχές θυρών, χρησιμοποιήστε port "<>" | "><"
Μετά τις παραμέτρους για το ταίριασμα της αφετηρίας και του προορισμού, οι παρακάτω δύο παράμετροι είναι υποχρεωτικές για να λειτουργεί η σύγχρονη λογική επεξεργασίας των κανόνων.
Τα flags είναι ενεργά μόνο στο φιλτράρισμα του πρωτοκόλλου TCP. Το κάθε γράμμα αντιπροσωπεύει ένα πιθανό flag το για το οποίο γίνεται ανίχνευση στην επικεφαλίδα του πακέτου TCP.
Η σύγχρονη λογική επεξεργασίας των κανόνων, χρησιμοποιεί την
παράμετρο flags S
για την αναγνώριση της έναρξης
μια συνεδρίας tcp.
Σε ένα κανόνα που επιτρέπει (pass) το πέρασμα των πακέτων, η
επιλογή keep state
δείχνει ότι θα πρέπει να
ενεργοποιείται η λειτουργία stateful filtering όταν το πακέτο
ταιριάζει με τα κριτήρια επιλογής.
Η επιλογή αυτή είναι υποχρεωτική για τη λειτουργία της σύγχρονης λογικής επεξεργασίας κανόνων.
Το stateful φιλτράρισμα, αντιμετωπίζει την κίνηση του δικτύου ως μιας διπλής κατεύθυνσης ανταλλαγή πακέτων τα οποία δημιουργούν μια συνεδρία. Όταν ενεργοποιηθεί, η διατήρηση της κατάστασης (keep-state) δημιουργεί δυναμικά εσωτερικούς κανόνες για κάθε πακέτο το οποίο ανταλλάσσεται κατά τη διάρκεια αυτής της συνεδρίας. Έχει επίσης τη δυνατότητα να διερευνήσει αν ακολουθούνται οι έγκυροι κανόνες ανταλλαγής μηνυμάτων μεταξύ του αποστολέα και του παραλήπτη. Οποιαδήποτε πακέτα δεν ταιριάζουν με το πρότυπο αυτής της επικοινωνίας, απορρίπτονται ως ψεύτικα.
Η διατήρηση της κατάστασης επιτρέπει επίσης να περάσουν τα πακέτα ICMP που σχετίζονται με μια συνεδρία TCP ή UDP. Έτσι, αν ληφθούν πακέτα ICMP τύπου 3 code 4 ως απάντηση κατά τη διάρκεια της επίσκεψης σας σε μια ιστοσελίδα, (η οποία επιτρέπεται από τον αντίστοιχο κανόνα εξερχομένων), θα τους επιτραπεί η είσοδος. Οποιοδήποτε πακέτο για το οποίο το IPF είναι σίγουρο ότι πρόκειται για τμήμα μιας ενεργής συνεδρίας, θα περάσει ακόμα και αν είναι διαφορετικό πρωτόκολλο.
Αυτό που συμβαίνει είναι το παρακάτω:
Τα πακέτα που προορίζονται να εξέλθουν μέσω της διεπαφής που συνδέεται στο Internet, ελέγχονται αρχικά σύμφωνα με το δυναμικό πίνακα καταστάσεων. Αν το πακέτο ταιριάζει με το επόμενο που αναμένεται σε μια ενεργή συνεδρία, εξέρχεται από το firewall και ταυτόχρονα ενημερώνεται η κατάσταση της συγκεκριμένης συνεδρίας στον παραπάνω δυναμικό πίνακα. Τα υπόλοιπα πακέτα (που δεν ταιριάζουν με κάποια συνεδρία σε εξέλιξη) ελέγχονται σύμφωνα με το σύνολο κανόνων για τα εξερχόμενα πακέτα.
Τα πακέτα που έρχονται από τη διεπαφή που είναι συνδεμένη με το Internet, ελέγχονται αρχικά μέσω του δυναμικού πίνακα καταστάσεων. Αν το πακέτο ταιριάζει με το επόμενο που αναμένεται σε μια ενεργή συνεδρία, εξέρχεται από το firewall και ταυτόχρονα ενημερώνεται η κατάσταση της συγκεκριμένης συνεδρίας στον παραπάνω πίνακα. Τα υπόλοιπα πακέτα (που δεν ταιριάζουν με κάποια συνεδρία σε εξέλιξη) ελέγχονται σύμφωνα με το σύνολο κανόνων για τα εισερχόμενα πακέτα.
Όταν η επικοινωνία ολοκληρωθεί, διαγράφεται από τον δυναμικό πίνακα καταστάσεων.
Το stateful φιλτράρισμα επιτρέπει να εστιάσουμε την προσοχή μας στην αποδοχή ή απόρριψη των νέων συνδέσεων. Αν επιτραπεί μια νέα συνεδρία, όλα τα υπόλοιπα πακέτα της θα επιτρέπονται αυτόματα, ενώ τυχόν ψεύτικα πακέτα θα απορρίπτονται επίσης αυτόματα. Το stateful φιλτράρισμα διαθέτει μια σειρά από προχωρημένες ικανότητες διερεύνησης των πακέτων, με δυνατότητα να αμύνεται σε πολλές διαφορετικές μεθόδους που χρησιμοποιούν οι επιτιθέμενοι.
Το παρακάτω σύνολο κανόνων δίνεται ως παράδειγμα για να φτιάξετε ένα ιδιαίτερα ασφαλές inclusive firewall. Ένα inclusive firewall επιτρέπει το πέρασμα μόνο των υπηρεσιών που ταιριάζουν με τους κανόνες που έχει για αποδοχή πακέτων, και απορρίπτει όλα τα υπόλοιπα. Τα firewalls που προστατεύουν άλλα μηχανήματα (τα οποία καλούνται και “network firewalls”) θα πρέπει να διαθέτουν τουλάχιστον δύο διεπαφές. Η μια διεπαφή συνδέεται με το τοπικό δίκτυο (LAN) το οποίο θεωρείται έμπιστο, και η άλλη με το δημόσιο Internet. Εναλλακτικά, ένα firewall μπορεί να προστατεύει μόνο το σύστημα στο οποίο εκτελείται—αυτό καλείται “host based firewall” και είναι κατάλληλο ιδιαίτερα για εξυπηρετητές που λειτουργούν σε μη έμπιστα δίκτυα.
Όλα τα συστήματα τύπου UNIX®, συμπεριλαμβανομένου και του FreeBSD,
έχουν σχεδιαστεί να χρησιμοποιούν την διεπαφή
lo0
και την IP διεύθυνση
127.0.0.1
για εσωτερική επικοινωνία
μέσα στο ίδιο το λειτουργικό σύστημα. Το firewall πρέπει να περιέχει
κανόνες που να επιτρέπουν την ελεύθερη και χωρίς περιορισμούς κίνηση
των ειδικών αυτών εσωτερικών πακέτων.
Οι κανόνες που εξουσιοδοτούν την πρόσβαση προς το Internet,
ορίζονται στην διεπαφή του δικτύου που συνδέεται σε αυτό. Οι κανόνες
αυτοί ελέγχουν τόσο την εισερχόμενη όσο και την εξερχόμενη κίνηση
στο Internet. Η διεπαφή αυτή μπορεί να είναι η
tun0
που χρησιμοποιείται στο PPP χρήστη, ή
ακόμα και η κάρτα δικτύου που συνδέεται σε ένα DSL router ή
modem.
Σε περίπτωση που μια ή περισσότερες κάρτες δικτύου συνδέονται σε εσωτερικά ιδιωτικά δίκτυα πίσω από το firewall, θα πρέπει να υπάρχουν οι αντίστοιχοι κανόνες που να επιτρέπουν την ελεύθερη διακίνηση των πακέτων ανάμεσα στις διεπαφές αυτές ή/και στο Internet.
Οι κανόνες πρέπει να οργανώνονται σε τρεις κύριες ενότητες: αρχικά όλες οι διεπαφές στις οποίες επιτρέπεται η ελεύθερη διακίνηση δεδομένων, έπειτα η διεπαφή από την οποία εξέρχονται τα πακέτα προς το δημόσιο δίκτυο (Internet) και τέλος η διεπαφή από την οποία λαμβάνονται πακέτα από το Internet.
Σε κάθε μια από τις ενότητες των διεπαφών που συνδέονται στο Internet, πρέπει να τοποθετούνται πρώτοι οι κανόνες που ταιριάζουν συχνότερα με την αντίστοιχη κίνηση. Ο τελευταίος κανόνας της ενότητας θα πρέπει να απορρίπτει και να καταγράφει όλα τα πακέτα της συγκεκριμένης διεπαφής/κατεύθυνσης.
Η ενότητα των Εξερχομένων (Outbound) στο ακόλουθο σύνολο κανόνων,
περιέχει μόνο κανόνες τύπου pass
οι οποίοι
επιτρέπουν (μέσω κατάλληλων τιμών στις παραμέτρους τους) σε
συγκεκριμένες υπηρεσίες να αποκτήσουν πρόσβαση στο Internet. Όλοι οι
κανόνες διαθέτουν τις επιλογές quick
,
on
, proto
,
port
και keep state
. Οι κανόνες
proto tcp
περιλαμβάνουν την επιλογή
flag
ώστε να αναγνωρίζουν την αίτηση έναρξης της
συνεδρίας και να ενεργοποιούν τη λειτουργία διατήρησης της
κατάστασης (stateful).
Στην ενότητα των εισερχόμενων πακέτων (Inbound) που φαίνεται
παρακάτω, πρώτοι εμφανίζονται οι κανόνες που χρησιμοποιούνται για την
απόρριψη των ανεπιθύμητων πακέτων. Αυτό γίνεται για δύο διαφορετικούς
λόγους. Ο πρώτος είναι ότι τα κακόβουλα πακέτα μπορεί εν μέρει να
ταιριάζουν με κάποια χαρακτηριστικά της έγκυρης κίνησης. Τα πακέτα
αυτά θα πρέπει να απορριφθούν, αντί να γίνουν δεκτά από κάποιο
επόμενο κανόνα allow
. Ο δεύτερος είναι ότι
μπορείτε να απορρίψετε συγκεκριμένα πακέτα τα οποία γνωρίζετε ότι δεν
είναι έγκυρα, αλλά σας είναι αδιάφορη η καταγραφή τους. Με τον τρόπο
αυτό εμποδίζεται η λήψη και καταγραφή τους από τον τελευταίο κανόνα.
Ο τελευταίος κανόνας τυπικά απορρίπτει και καταγράφει όλα τα πακέτα
που έφτασαν μέχρι αυτόν. Ο κανόνας αυτός χρησιμοποιείται για την
παροχή νομικών αποδείξεων σε περίπτωση που κινήσετε δικαστική
διαδικασία κατά ατόμων που προέβησαν σε επιθέσεις στο σύστημα
σας.
Θα πρέπει επίσης να εξασφαλίσετε ότι το σύστημα σας δεν θα δώσει
καμιά απάντηση σε κανένα από τα ανεπιθύμητα πακέτα. Τα πακέτα αυτά
θα πρέπει να απορριφθούν και να εξαφανιστούν. Με τον τρόπο αυτό, ο
επιτιθέμενος δεν έχει καμιά γνώση αν τα πακέτα του έφτασαν μέχρι το
σύστημα σας. Όσο λιγότερα μπορούν να μάθουν οι επιτιθέμενοι σχετικά
με το σύστημα σας, τόσο περισσότερο χρόνο θα χρειαστεί να επενδύσουν
για να καταφέρουν να σας βλάψουν στα αλήθεια. Οι κανόνες με την
επιλογή log first
καταγράφουν το συμβάν μόνο την
πρώτη φορά που ενεργοποιούνται. Η επιλογή αυτή περιλαμβάνεται στον
κανόνα nmap OS fingerprint
στο παράδειγμα που
φαίνεται παρακάτω. Το βοηθητικό πρόγραμμα security/nmap
χρησιμοποιείται συχνά
από κακόβουλα άτομα, που προσπαθούν με αυτό τον τρόπο να
αναγνωρίσουν το λειτουργικό σύστημα του μηχανήματος σας.
Κάθε φορά που υπάρχει καταγραφή από κάποιο κανόνα με την επιλογή
log first
, θα πρέπει να εκτελέσετε την εντολή
ipfstat -hio
για να δείτε πόσες φορές έχει
ενεργοποιηθεί αυτός ο κανόνας συνολικά. Έτσι θα ξέρετε αν π.χ. σας
κάνουν επίθεση υπερχείλισης (flood).
Δείτε το αρχείο /etc/services
για να βρείτε
αριθμούς θυρών που δεν αναγνωρίζετε. Μπορείτε επίσης να επισκεφθείτε
την τοποθεσία http://www.securitystats.com/tools/portsearch.php
και να κάνετε αναζήτηση για τη συγκεκριμένη θύρα, ώστε να δείτε ποια
υπηρεσία εξυπηρετεί.
Δείτε την επόμενη τοποθεσία για τις θύρες που χρησιμοποιούνται συνήθως από κακόβουλα προγράμματα (trojans): http://www.simovits.com/trojans/trojans.html.
Το παρακάτω σύνολο κανόνων είναι αρκετά πλήρες και πολύ ασφαλές.
Δημιουργεί firewall τύπου inclusive
, και έχει
δοκιμαστεί σε πραγματικές συνθήκες λειτουργίας. Μπορεί να
εξυπηρετήσει το ίδιο καλά και το δικό σας σύστημα. Απλώς μετατρέψτε
σε σχόλιο τους κανόνες για τις υπηρεσίες που δεν θέλετε να
ενεργοποιήσετε.
Για να αποφύγετε την καταγραφή ανεπιθύμητων μηνυμάτων,
απλώς προσθέστε ένα αντίστοιχο κανόνα απόρριψης
(block
) στην ενότητα των εισερχομένων
(inbound).
Θα πρέπει να αλλάξετε το όνομα της διεπαφής
dc0
του παραδείγματος, με το πραγματικό όνομα
της κάρτας δικτύου που συνδέει το σύστημα σας με το Internet. Για
όσους χρησιμοποιούν το PPP χρήστη, το όνομα θα είναι
tun0
.
Προσθέστε τις ακόλουθες καταχωρίσεις στο αρχείο
/etc/ipf.rules
:
Το NAT είναι ακρωνύμιο των λέξεων Network Address Translation ή Μετάφραση Διευθύνσεων Δικτύου. Για όσους είναι εξοικειωμένοι με το Linux®, βασίζεται στην αρχή του IP Masquerading. Στην πραγματικότητα το NAT και το IP Masquerading είναι το ίδιο πράγμα. Μια από τις πολλές δυνατότητες που παρέχει η λειτουργία NAT του IPF, είναι και η δυνατότητα να έχουμε ένα ιδιωτικό τοπικό δίκτυο (LAN) πίσω από το firewall το οποίο να μοιράζεται μια μοναδική δημόσια διεύθυνση IP στο Internet.
Ίσως να αναρωτηθείτε γιατί να θέλει κάποιος να το κάνει αυτό. Οι ISPs συνήθως αποδίδουν δυναμικές διευθύνσεις σε μη εταιρικούς πελάτες. Αυτό ουσιαστικά σημαίνει ότι η διεύθυνση IP που αποδίδεται στο μηχάνημα σας, μπορεί να είναι διαφορετική κάθε φορά που κάνετε κλήση για να συνδεθείτε. Για τους χρήστες DSL modem και router, η αλλαγή διεύθυνσης πραγματοποιείται κάθε φορά που ενεργοποιείται το modem. Η διεύθυνση IP που σας αποδίδεται από τον ISP σας, είναι αυτή με την οποία φαίνεστε στο Internet.
Ας υποθέσουμε τώρα ότι έχετε πέντε PC στο σπίτι σας, και χρειάζεστε σε όλα σύνδεση Internet. Κανονικά, θα έπρεπε να πληρώσετε τον ISP σας χωριστό λογαριασμό για κάθε PC και να διαθέτετε πέντε γραμμές τηλεφώνου.
Με το NAT, χρειάζεστε μόνο ένα λογαριασμό με τον ISP σας. Μπορείτε απλώς να συνδέσετε τα τέσσερα PC σε ένα διανομέα ή switch στο οποίο θα συνδέσετε επίσης και το FreeBSD μηχάνημα σας. Το μηχάνημα αυτό θα ενεργεί ως πύλη του τοπικού σας δικτύου για το Internet. Το NAT θα μεταφράσει αυτόματα τις ιδιωτικές διευθύνσεις IP του κάθε μηχανήματος στην μοναδική δημόσια IP διεύθυνση που έχετε, καθώς το πακέτο φεύγει από το firewall και κατευθύνεται προς το Internet. Εκτελεί επίσης και την αντίστροφη μετάφραση για τα πακέτα που επιστρέφουν.
Υπάρχει μια ειδική περιοχή διευθύνσεων IP που έχουν παραχωρηθεί για χρήση σε τοπικά δίκτυα με NAT. Σύμφωνα με το RFC 1918, μπορείτε να χρησιμοποιήσετε για αυτό το σκοπό τις παρακάτω περιοχές, οι οποίες δεν δρομολογούνται ποτέ απευθείας στο δημόσιο Internet:
Αρχικό IP 10.0.0.0 | - | Τελικό IP 10.255.255.255 |
Αρχικό IP 172.16.0.0 | - | Τελικό IP 172.31.255.255 |
Αρχικό IP 192.168.0.0 | - | Τελικό IP 192.168.255.255 |
Οι κανόνες του NAT φορτώνονται με τη χρήση της
εντολής ipnat
. Τυπικά, οι κανόνες του
NAT αποθηκεύονται στο αρχείο
/etc/ipnat.rules
. Δείτε τη σελίδα manual του
ipnat(1) για λεπτομέρειες.
Για να αλλάξετε τους κανόνες του NAT καθώς αυτό
εκτελείται, τροποποιήστε το αρχείο που τους περιέχει, και εκτελέστε
την εντολή ipnat
με την παράμετρο
-CF
για να διαγράψετε τους εσωτερικούς κανόνες του
NAT και να αδειάσετε όλες τις ενεργές καταχωρίσεις
του πίνακα μεταφράσεων.
Για να φορτώσετε τους κανόνες του NAT από την αρχή, εκτελέστε μια εντολή όπως την παρακάτω:
#
ipnat -CF -f /etc/ipnat.rules
Για να δείτε κάποια στατιστικά σχετικά με το NAT, χρησιμοποιήστε την παρακάτω εντολή:
#
ipnat -s
Για να δείτε μια λίστα με τις τρέχουσες καταχωρίσεις του πίνακα NAT, χρησιμοποιήστε την παρακάτω εντολή:
#
ipnat -l
Για να ενεργοποιήσετε την λεπτομερή απεικόνιση μηνυμάτων και να δείτε πληροφορίες που σχετίζονται με την επεξεργασία των κανόνων και τους ενεργούς κανόνες και καταχωρίσεις στον πίνακα, γράψτε:
#
ipnat -v
Οι κανόνες του NAT είναι αρκετά ευέλικτοι, και διαθέτουν πλήθος δυνατοτήτων ώστε να καλύπτουν τις ανάγκες των οικιακών αλλά και των επιχειρησιακών χρηστών.
Η σύνταξη των κανόνων που παρουσιάζεται εδώ, έχει απλοποιηθεί ώστε να συμβαδίζει με τη συνήθη χρήση σε μη-εμπορικά περιβάλλοντα. Για πιο πλήρη περιγραφή της σύνταξης, δείτε τη σελίδα manual του ipnat(5).
Η σύνταξη ενός κανόνα NAT μοιάζει με την παρακάτω:
IF
LAN_IP_RANGE
-> PUBLIC_ADDRESS
Ο κανόνας ξεκινάει με τη λέξη map
.
Αντικαταστήστε το IF
με την εξωτερική
διεπαφή (τη κάρτα δικτύου που συνδέεται στο Internet).
Η παράμετρος LAN_IP_RANGE
είναι η
περιοχή διευθύνσεων που χρησιμοποιείται από το εσωτερικό σας δίκτυο.
Στην πραγματικότητα θα μοιάζει με κάτι σαν το 192.168.1.0/24
.
Η παράμετρος PUBLIC_ADDRESS
μπορεί να
είναι είτε η εξωτερική IP διεύθυνση, είτε η ειδική λέξη
0/32
, η οποία σημαίνει ότι θα χρησιμοποιηθεί η
IP διεύθυνση που έχει αποδοθεί στο
IF
.
Ένα πακέτο φτάνει στο firewall από το LAN με προορισμό το
Internet. Περνάει διαμέσου των κανόνων φιλτραρίσματος εξερχομένων,
όπου γίνεται η επεξεργασία του από το NAT.
Οι κανόνες εφαρμόζονται από τον πρώτο και προς τα κάτω, και κερδίζει
ο πρώτος που ταιριάζει. Ο έλεγχος γίνεται με βάση τη διεπαφή από την
οποία λήφθηκε το πακέτο και τη διεύθυνση IP από την οποία προέρχεται.
Όταν το όνομα της διεπαφής ενός πακέτου ταιριάζει με κάποιο κανόνα του
NAT, η διεύθυνση IP της αφετηρίας (που προέρχεται
από το ιδιωτικό δίκτυο) ελέγχεται για να εξακριβωθεί αν ταιριάζει με
την περιοχή διευθύνσεων που καθορίζεται στην αριστερά πλευρά του
συμβόλου (βέλος) του κανόνα NAT. Αν ταιριάζει, η
διεύθυνση του πακέτου ξαναγράφεται, χρησιμοποιώντας τη δημόσια
διεύθυνση IP η οποία παρέχεται από το 0/32
. Το
NAT δημιουργεί μια καταχώριση στον εσωτερικό του
πίνακα, έτσι ώστε όταν επιστρέψει η απάντηση από το Internet, να
μπορεί να αντιστοιχηθεί ξανά στην αρχική ιδιωτική διεύθυνση IP και να
περάσει έπειτα από τους κανόνες του φίλτρου για περαιτέρω
επεξεργασία.
Για να ενεργοποιήσετε το IPNAT, προσθέστε τις
παρακάτω γραμμές στο /etc/rc.conf
.
Για να επιτρέψετε στο μηχάνημα σας να δρομολογεί πακέτα μεταξύ διεπαφών δικτύου:
Για να ξεκινάει αυτόματα το IPNAT σε κάθε εκκίνηση:
Για να καθορίσετε από που επιθυμείτε να φορτώνονται οι κανόνες του IPNAT:
Για τοπικά δίκτυα με μεγάλο αριθμό υπολογιστών, ή για δίκτυα που διασυνδέουν περισσότερα από ένα LAN, η διαδικασία της μετατροπής όλων αυτών των ιδιωτικών διευθύνσεων σε μια μοναδική δημόσια διεύθυνση, δημιουργεί πρόβλημα κατανομής πόρων, καθώς χρησιμοποιούνται πολλές φορές οι ίδιοι αριθμοί θυρών, οδηγώντας τα PC του δικτύου σε συγκρούσεις. Υπάρχουν δύο τρόποι για να ελαττώσουμε αυτό το πρόβλημα.
Ένα συνηθισμένος κανόνας NAT μοιάζει με τον παρακάτω:
Στον παραπάνω κανόνα, η θύρα αφετηρίας του πακέτου παραμένει
αναλλοίωτη καθώς το πακέτο διέρχεται μέσω του
IPNAT. Αν προσθέσετε την λέξη-κλειδί
portmap
, μπορείτε να ρυθμίσετε το
IPNAT να χρησιμοποιεί θύρες που ανήκουν σε μια
καθορισμένη περιοχή. Για παράδειγμα, ο παρακάτω κανόνας θα
οδηγήσει το NAT να τροποποιήσει την θύρα της
αφετηρίας, ώστε να είναι μέσα στην περιοχή που φαίνεται:
Μπορούμε επίσης να απλοποιήσουμε ακόμα περισσότερο τη
διαδικασία χρησιμοποιώντας τη λέξη auto
ώστε το
IPNAT να καθορίζει από μόνο του ποιες θύρες είναι
διαθέσιμες για χρήση:
Σε ένα πολύ μεγάλο τοπικό δίκτυο, αργά ή γρήγορα φτάνουμε στο σημείο που μια μοναδική δημόσια διεύθυνση δεν επαρκεί για να καλύψει τόσες πολλές ιδιωτικές. Αν υπάρχει διαθέσιμο ένα εύρος δημοσίων διευθύνσεων, μπορούν να χρησιμοποιηθούν ως “απόθεμα (pool)”, επιτρέποντας στην IPNAT να επιλέξει μια από αυτές καθώς αντιστοιχεί τα πακέτα κατά την έξοδο τους προς το δημόσιο δίκτυο.
Για παράδειγμα, αντί να αντιστοιχούν όλα τα πακέτα μέσω μιας μοναδικής δημόσιας IP διεύθυνσης όπως παρακάτω:
μπορούμε να χρησιμοποιήσουμε ένα εύρος IP διευθύνσεων, είτε με τη χρήση μάσκας δικτύου:
είτε με συμβολισμό CIDR:
Είναι κοινή πρακτική να εγκαθίστανται υπηρεσίες όπως ο
εξυπηρετητής ιστοσελίδων, ταχυδρομείου, βάσης δεδομένων και DNS σε
διαφορετικά PC στο τοπικό δίκτυο. Στην περίπτωση αυτή, η κίνηση
πακέτων από αυτά τα μηχανήματα εξακολουθεί να χρειάζεται το
NAT, αλλά χρειάζεται επίσης να υπάρχει κάποιος
τρόπος να κατευθύνεται η εισερχόμενη κίνηση στα σωστά PC του δικτύου.
Το IPNAT έχει τις κατάλληλες δυνατότητες για την
επίλυση αυτού του προβλήματος. Για παράδειγμα, έστω ότι ένας
εξυπηρετητής ιστοσελίδων βρίσκεται στην διεύθυνση LAN 10.0.10.25
και η μοναδική δημόσια IP
είναι 20.20.20.5
. Ο κανόνας που θα
γράφατε θα έμοιαζε με τον παρακάτω:
ή:
ή για ένα εξυπηρετητή DNS με διεύθυνση στο τοπικό δίκτυο 10.0.10.33
ο οποίος πρέπει να δέχεται
αναζητήσεις από το δημόσιο δίκτυο:
Το FTP είναι ένας δεινόσαυρος που έχει απομείνει από την εποχή που το Internet ήταν στα αρχικά του στάδια, όπου τα ερευνητικά εργαστήρια των πανεπιστήμιων ήταν συνδεμένα μεταξύ τους με μισθωμένες γραμμές και οι ερευνητές το χρησιμοποιούσαν για να στέλνουν αρχεία ο ένας στον άλλο. Την εποχή εκείνη, δεν υπήρχαν ανησυχίες σχετικά με την ασφάλεια. Με το πέρασμα του χρόνου, το FTP θάφτηκε στο πίσω μέρος του ταχέως εξελισσόμενου Internet. Δεν εξελίχθηκε ποτέ ώστε να ξεπεράσει προβλήματα ασφάλειας, όπως π.χ. το γεγονός ότι στέλνει το όνομα και τον κωδικό του χρήστη ως απλό κείμενο. Το FTP έχει δυο καταστάσεις λειτουργίας, την ενεργή και την παθητική. Η διαφορά είναι στο πως γίνεται η ανάκτηση του καναλιού δεδομένων. Η παθητική λειτουργία είναι πιο ασφαλής, καθώς το κανάλι δεδομένων αποτελεί το κύριο κανάλι της συνεδρίας. Μπορείτε να βρείτε πολύ καλή περιγραφή του πρωτοκόλλου και των διαφορετικών τρόπων λειτουργίας του, στο http://www.slacksite.com/other/ftp.html.
Το IPNAT διαθέτει μια ειδική επιλογή για διαμεσολάβηση FTP (proxy) η οποία μπορεί να καθοριστεί στον κατάλληλο κανόνα του NAT. Μπορεί να παρακολουθήσει όλα τα εξερχόμενα πακέτα για να ανιχνεύσει την έναρξη μιας ενεργής ή παθητικής συνεδρίας FTP, και να δημιουργήσει δυναμικά προσωρινούς κανόνες στο φίλτρο που να περιέχουν μόνο τον αριθμό της θύρας που χρησιμοποιείται από το κανάλι δεδομένων. Αυτό εξαλείφει το πρόβλημα ασφάλειας που δημιουργείται από το γεγονός ότι διαφορετικά θα χρειαζόταν να ανοιχθεί μια μεγάλη περιοχή θυρών (στην υψηλή περιοχή) στο firewall.
Ο παρακάτω κανόνας χειρίζεται όλα τα δεδομένα για το εσωτερικό δίκτυο (LAN):
Ο παρακάτω κανόνας χειρίζεται την κίνηση FTP από την πύλη (gateway):
Ο παρακάτω κανόνας χειρίζεται όλη την κίνηση από το εσωτερικό LAN που δεν ανήκει στο πρωτόκολλο FTP:
Ο κανόνας χαρτογράφησης του FTP τοποθετείται πριν από τον κανονικό κανόνα χαρτογράφησης. Κάθε πακέτο ελέγχεται αρχικά από τον κανόνα που βρίσκεται στην κορυφή. Αν ταιριάζει στη διεπαφή και στην ιδιωτική διεύθυνση IP και πρόκειται για πακέτο FTP, ο διαμεσολαβητής FTP δημιουργεί προσωρινούς κανόνες στο φίλτρο οι οποίοι επιτρέπουν την εισερχόμενη και εξερχόμενη κίνηση FTP ενώ ταυτόχρονα εκτελούν και την απαραίτητη μετάφραση NAT. Όλα τα πακέτα που δεν ανήκουν σε μετάδοση FTP δεν ταιριάζουν με τον πρώτο κανόνα, έτσι κατευθύνονται στον τρίτο κανόνα, εξετάζονται όσο αφορά τη διεπαφή και το IP από το οποίο προέρχονται, και γίνεται η αντίστοιχη μετάφραση τους από το NAT.
Όταν χρησιμοποιείται ο μεσολαβητής FTP, χρειάζεται μόνο ένας κανόνας για το NAT.
Χωρίς το μεσολαβητή FTP, χρειάζονται οι παρακάτω τρεις κανόνες:
Αυτό το κείμενο, και άλλα κείμενα, μπορεί να βρεθεί στο ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Για ερωτήσεις σχετικά με το FreeBSD, διαβάστε την
τεκμηρίωση πριν να επικοινωνήσετε με την
<questions@FreeBSD.org>.
Για ερωτήσεις σχετικά με αυτή την τεκμηρίωση, στείλτε e-mail στην
<doc@FreeBSD.org>.