3544 lines
154 KiB
XML
3544 lines
154 KiB
XML
<?xml version="1.0" encoding="ISO-8859-7" standalone="no"?>
|
||
<!--
|
||
|
||
Το Εγχειρίδιο του FreeBSD: Firewalls
|
||
|
||
The FreeBSD Greek Documentation Project
|
||
|
||
$FreeBSD$
|
||
|
||
%SOURCE% en_US.ISO8859-1/books/handbook/firewalls/chapter.sgml
|
||
%SRCID% 39270
|
||
|
||
-->
|
||
|
||
<chapter id="firewalls">
|
||
<chapterinfo>
|
||
<authorgroup>
|
||
<author>
|
||
<firstname>Joseph J.</firstname>
|
||
<surname>Barbish</surname>
|
||
<contrib>Συνεισφορά του </contrib>
|
||
</author>
|
||
</authorgroup>
|
||
<authorgroup>
|
||
<author>
|
||
<firstname>Brad</firstname>
|
||
<surname>Davis</surname>
|
||
<contrib>Μετατράπηκε σε SGML και ανανεώθηκε από τον </contrib>
|
||
</author>
|
||
</authorgroup>
|
||
</chapterinfo>
|
||
|
||
<title>Firewalls</title>
|
||
|
||
<indexterm><primary>firewall</primary></indexterm>
|
||
|
||
<indexterm>
|
||
<primary>ασφάλεια</primary>
|
||
<secondary>firewalls</secondary>
|
||
</indexterm>
|
||
|
||
<sect1 id="firewalls-intro">
|
||
<title>Σύνοψη</title>
|
||
|
||
<para>Το firewall (τείχος προστασίας) καθιστά δυνατό το φιλτράρισμα της
|
||
εισερχόμενης και εξερχόμενης κίνησης που διέρχεται από το σύστημα σας.
|
||
Ένα firewall μπορεί να χρησιμοποιεί ένα ή περισσότερα σετ
|
||
<quote>κανόνων</quote> για να επιθεωρεί τα πακέτα κατά την είσοδο ή
|
||
έξοδο τους από μια δικτυακή σύνδεση, και να τα επιτρέπει ή να τα
|
||
απορρίπτει. Οι κανόνες του firewall μπορούν να ελέγχουν ένα ή
|
||
περισσότερα χαρακτηριστικά των πακέτων, συμπεριλαμβανομένων μεταξύ άλλων
|
||
και του τύπου του πρωτοκόλλου, καθώς και την διεύθυνση ή/και θύρα
|
||
(port) της αφετηρίας ή του προορισμού.</para>
|
||
|
||
<para>Τα firewalls μπορούν να ενισχύσουν σημαντικά την ασφάλεια ενός
|
||
κόμβου ή ενός δικτύου. Μπορούν να χρησιμοποιηθούν για μία ή
|
||
περισσότερες από τις ακόλουθες λειτουργίες:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Να προστατεύουν και να απομονώνουν τις εφαρμογές, τις υπηρεσίες
|
||
και τα μηχανήματα του εσωτερικού σας δικτύου από ανεπιθύμητη κίνηση
|
||
που προέρχεται από το Internet.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Να περιορίζουν ή να αποκλείουν την πρόσβαση μηχανημάτων του
|
||
εσωτερικού δικτύου σε υπηρεσίες του Internet.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Να υποστηρίζουν μετάφραση δικτυακών διευθύνσεων
|
||
(<acronym>NAT</acronym>), η οποία επιτρέπει στο εσωτερικό σας
|
||
δίκτυο να χρησιμοποιεί ιδιωτικές <acronym>IP</acronym> διευθύνσεις
|
||
και να μοιράζεται μία μοναδική σύνδεση με το Internet (είτε μέσω
|
||
μίας μοναδικής δημόσιας <acronym>IP</acronym> διεύθυνσης, είτε μέσω
|
||
ενός πλήθους δημοσίων διευθύνσεων που ανατίθενται αυτόματα).</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Αφού διαβάσετε αυτό το κεφάλαιο, θα ξέρετε:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Πως να δημιουργήσετε σωστούς κανόνες φιλτραρίσματος
|
||
πακέτων.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Τους διάφορους τύπους firewall που υπάρχουν στο &os; και τις
|
||
διαφορές τους.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Πως να ρυθμίσετε και να χρησιμοποιήσετε το
|
||
<application>PF</application> firewall του OpenBSD.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Πως να ρυθμίσετε και να χρησιμοποιήσετε το
|
||
<application>IPFILTER</application>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Πως να ρυθμίσετε και να χρησιμοποιήσετε το
|
||
<application>IPFW</application>.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Πριν διαβάσετε αυτό το κεφάλαιο, θα πρέπει:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Να κατανοείτε βασικές αρχές του &os; και του Internet.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</sect1>
|
||
|
||
<sect1 id="firewalls-concepts">
|
||
<title>Βασικές Έννοιες των Firewalls</title>
|
||
|
||
<indexterm>
|
||
<primary>firewall</primary>
|
||
<secondary>rulesets</secondary>
|
||
</indexterm>
|
||
|
||
<para>Υπάρχουν δύο βασικοί τρόποι για τη δημιουργία κανόνων σε ένα
|
||
firewall: ο <quote>inclusive</quote> και ο <quote>exclusive</quote>.
|
||
Ένα exclusive firewall επιτρέπει τη διέλευση όλης της κίνησης, εκτός
|
||
από αυτή που ταιριάζει με τους κανόνες του. Ένα inclusive firewall
|
||
κάνει το ανάποδο. Επιτρέπει μόνο τη διέλευση της κίνησης που ταιριάζει
|
||
με τους κανόνες του, και αποκλείει οτιδήποτε άλλο.</para>
|
||
|
||
<para>Τα inclusive firewalls προσφέρουν πολύ καλύτερο έλεγχο της
|
||
εξερχόμενης κίνησης και για το λόγο αυτό είναι καλύτερα για συστήματα
|
||
που προσφέρουν υπηρεσίες στο δημόσιο Internet. Ελέγχουν επίσης και
|
||
τα πακέτα που προέρχονται από το δημόσιο Internet με προορισμό το
|
||
ιδιωτικό σας δίκτυο. Από προεπιλογή, όλη η κίνηση που δεν ταιριάζει
|
||
με τους κανόνες απορρίπτεται και καταγράφεται. Τα inclusive firewalls
|
||
είναι γενικά ασφαλέστερα από τα exclusive, καθώς μειώνουν σημαντικά
|
||
την πιθανότητα διέλευσης ανεπιθύμητης κίνησης μέσα από αυτά.</para>
|
||
|
||
<note>
|
||
<para>Εκτός και αν αναφέρεται διαφορετικά, όλα τα παραδείγματα
|
||
ρυθμίσεων και κανόνων που φαίνονται σε αυτό το κεφάλαιο, δημιουργούν
|
||
inclusive firewalls.</para>
|
||
</note>
|
||
|
||
<para>Η ασφάλεια μπορεί να γίνει ακόμα ισχυρότερη με τη χρήση ενός
|
||
<quote>stateful firewall</quote>. Αυτός ο τύπος firewall αποθηκεύει
|
||
την κατάσταση των συνδέσεων που μεταφέρουν δεδομένα μέσα από αυτό, και
|
||
επιτρέπει μόνο την κίνηση που είτε ταιριάζει με μια από τις υπάρχουσες
|
||
συνδέσεις, ή που ξεκινά μια νέα σύνδεση. Το μειονέκτημα ενός stateful
|
||
firewall είναι ότι μπορεί να είναι ευάλωτο σε επιθέσεις Denial of
|
||
Service (Άρνησης Υπηρεσίας, <acronym>DoS</acronym>) αν δεχθεί
|
||
ταυτόχρονα πολλές αιτήσεις για άνοιγμα νέων συνδέσεων σε μικρό χρονικό
|
||
διάστημα. Με τα περισσότερα firewalls, είναι δυνατόν να γίνει
|
||
συνδυασμός και των δύο συμπεριφορών (τόσο stateful όσο και μη-stateful)
|
||
ώστε να δημιουργηθεί το βέλτιστο firewall για την συγκεκριμένη
|
||
χρήση.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="firewalls-apps">
|
||
<title>Προγράμματα Firewall</title>
|
||
|
||
<para>Το &os; έχει τρία διαφορετικά προγράμματα firewall ενσωματωμένα στο
|
||
βασικό σύστημα. Είναι τα: <emphasis>IPFILTER</emphasis> (γνωστό επίσης
|
||
και ως <acronym>IPF</acronym>), το <emphasis>IPFIREWALL</emphasis>
|
||
(γνωστό επίσης και ως <acronym>IPFW</acronym>), και το
|
||
<emphasis>PacketFilter</emphasis> του <emphasis>OpenBSD</emphasis>
|
||
(γνωστό επίσης και ως <acronym>PF</acronym>). Το &os; ενσωματώνει
|
||
επίσης δύο προγράμματα για διαμόρφωση κυκλοφορίας (traffic shaping,
|
||
έλεγχος του διαθέσιμου εύρους ζώνης): το &man.altq.4; και το
|
||
&man.dummynet.4;. Το Dummynet είναι κατά παράδοση στενά συνδεμένο με
|
||
το <acronym>IPFW</acronym>, και το <acronym>ALTQ</acronym> με το
|
||
<acronym>PF</acronym>. Η διαμόρφωση κυκλοφορίας για το IPFILTER μπορεί
|
||
τη δεδομένη στιγμή να γίνει με το IPFILTER για το NAT και το
|
||
φιλτράρισμα και με το <acronym>IPFW</acronym> σε συνδυασμό με το
|
||
&man.dummynet.4; <emphasis>ή</emphasis> χρησιμοποιώντας το
|
||
<acronym>PF</acronym> σε συνδυασμό με το <acronym>ALTQ</acronym>.
|
||
Τόσο το IPFW όσο και το PF χρησιμοποιούν κανόνες για να ελέγξουν την
|
||
κίνηση των πακέτων από και προς το σύστημά σας, αν και διαθέτουν
|
||
διαφορετικούς τρόπους για να το επιτύχουν, και οι κανόνες τους
|
||
χρησιμοποιούν διαφορετική σύνταξη.</para>
|
||
|
||
<para>Ο λόγος για τον οποίο το &os; διαθέτει πολλαπλά firewall, είναι ότι
|
||
διαφορετικοί άνθρωποι έχουν διαφορετικές ανάγκες και προτιμήσεις. Δεν
|
||
υπάρχει ένα και μοναδικό firewall που να είναι το καλύτερο.</para>
|
||
|
||
<para>Ο συγγραφέας προτιμά το IPFILTER, καθώς οι κανόνες τύπου stateful
|
||
που διαθέτει είναι λιγότερο πολύπλοκοι όταν χρησιμοποιούνται σε ένα
|
||
περιβάλλον <acronym>NAT</acronym>, ενώ διαθέτει και ενσωματωμένο ftp
|
||
proxy το οποίο τους απλοποιεί ακόμα περισσότερο, επιτρέποντας ασφαλή
|
||
σύνδεση σε εξωτερικούς εξυπηρετητές FTP.</para>
|
||
|
||
<para>Καθώς όλα τα firewall βασίζονται στην επιθεώρηση τιμών ελέγχου των
|
||
πακέτων, ο διαχειριστής που πρόκειται να δημιουργήσει τους κανόνες
|
||
πρέπει να κατανοεί τον τρόπο λειτουργίας του <acronym>TCP/IP</acronym>,
|
||
το ρόλο των διαφόρων τιμών στα πεδία ελέγχου των πακέτων και πως
|
||
χρησιμοποιούνται στην ανταλλαγή πληροφοριών σε μια συνηθισμένη
|
||
συνεδρία. Για περισσότερες λεπτομέρειες, διαβάστε το <ulink
|
||
url="http://www.ipprimer.com/overview.cfm"></ulink>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="firewalls-pf">
|
||
<sect1info>
|
||
<authorgroup>
|
||
<author>
|
||
<firstname>John</firstname>
|
||
<surname>Ferrell</surname>
|
||
<contrib>Αναθεωρήθηκε και ενημερώθηκε από τον </contrib>
|
||
<!-- 24 March 2008 -->
|
||
</author>
|
||
</authorgroup>
|
||
</sect1info>
|
||
|
||
<title>Το Packet Filter (PF) και το <acronym>ALTQ</acronym> του
|
||
OpenBSD</title>
|
||
|
||
<indexterm>
|
||
<primary>firewall</primary>
|
||
<secondary>PF</secondary>
|
||
</indexterm>
|
||
|
||
<para>Τον Ιούλιο του 2003, η εφαρμογή firewall του OpenBSD (γνωστή ως
|
||
<acronym>PF</acronym>) μεταφέρθηκε στο &os; και έγινε διαθέσιμη στην
|
||
Συλλογή των Ports. Το &os; 5.3 που κυκλοφόρησε το 2004, ήταν η
|
||
πρώτη επίσημη έκδοση η οποία περιείχε το <acronym>PF</acronym> ως
|
||
τμήμα του βασικού πλέον συστήματος. Το <acronym>PF</acronym> είναι
|
||
ένα ολοκληρωμένο firewall, με πλήθος χαρακτηριστικών, το οποίο επίσης
|
||
διαθέτει προαιρετικά υποστήριξη για το <acronym>ALTQ</acronym>
|
||
(Alternate Queuing). Το <acronym>ALTQ</acronym> προσφέρει υπηρεσίες
|
||
Διασφάλισης Ποιότητας (Quality of Service,
|
||
<acronym>QoS</acronym>).</para>
|
||
|
||
<para>Το OpenBSD Project κάνει εξαιρετική δουλειά στη συντήρηση του
|
||
<ulink url="http://www.openbsd.org/faq/pf/">PF FAQ</ulink>. Για το
|
||
λόγο αυτό, η παρούσα ενότητα του Εγχειριδίου εστιάζει κυρίως στις
|
||
ιδιαιτερότητες του <acronym>PF</acronym> όσο αφορά το &os;, ενώ παρέχει
|
||
και μερικές γενικές πληροφορίες σχετικά με τη χρήση του. Για πιο
|
||
λεπτομερείς πληροφορίες σχετικά με τη χρήση του <acronym>PF</acronym>,
|
||
παρακαλούμε διαβάστε το <ulink
|
||
url="http://www.openbsd.org/faq/pf/">PF FAQ</ulink>.</para>
|
||
|
||
<para>Περισσότερες πληροφορίες σχετικά με το <acronym>PF</acronym> στο
|
||
&os; μπορείτε να βρείτε στο <ulink
|
||
url="http://pf4freebsd.love2party.net/"></ulink>.</para>
|
||
|
||
<sect2>
|
||
<title>Χρησιμοποιώντας τα Αρθρώματα Πυρήνα για το PF</title>
|
||
|
||
<para>Για να φορτώσετε το άρθρωμα πυρήνα για το PF, προσθέστε την
|
||
παρακάτω γραμμή στο στο <filename>/etc/rc.conf</filename>:</para>
|
||
|
||
<programlisting>pf_enable="YES"</programlisting>
|
||
|
||
<para>Εκτελέστε έπειτα το script εκκίνησης για να φορτώσετε το
|
||
άρθρωμα:</para>
|
||
|
||
<screen>&prompt.root; <userinput>/etc/rc.d/pf start</userinput></screen>
|
||
|
||
<para>Σημειώστε ότι το άρθρωμα PF δεν πρόκειται να φορτωθεί αν δεν
|
||
βρει το καθορισμένο αρχείο κανόνων. Το προεπιλεγμένο αρχείο είναι
|
||
το <filename>/etc/pf.conf</filename>. Αν το αρχείο κανόνων βρίσκεται
|
||
σε κάποια άλλη τοποθεσία, μπορείτε να την καθορίσετε προσθέτοντας
|
||
μια γραμμή όπως την παρακάτω στο
|
||
<filename>/etc/rc.conf</filename>:</para>
|
||
|
||
<programlisting>pf_rules="<replaceable>/path/to/pf.conf</replaceable>"</programlisting>
|
||
|
||
<para>Μπορείτε να βρείτε ένα παράδειγμα του αρχείου
|
||
<filename>pf.conf</filename> στον κατάλογο <filename
|
||
class="directory">/usr/share/examples/pf</filename></para>
|
||
|
||
<para>Το άρθρωμα <acronym>PF</acronym> μπορεί επίσης να φορτωθεί
|
||
χειροκίνητα από την γραμμή εντολών:</para>
|
||
|
||
<screen>&prompt.root; <userinput>kldload pf.ko</userinput></screen>
|
||
|
||
<para>Η υποστήριξης καταγραφής του PF παρέχεται από το άρθρωμα
|
||
<literal>pflog.ko</literal> και μπορείτε να την φορτώσετε
|
||
προσθέτοντας την παρακάτω γραμμή στο
|
||
<filename>/etc/rc.conf</filename>:</para>
|
||
|
||
<programlisting>pflog_enable="YES"</programlisting>
|
||
|
||
<para>Εκτελέστε έπειτα το script εκκίνησης για να φορτώσετε το
|
||
άρθρωμα:</para>
|
||
|
||
<screen>&prompt.root; <userinput>/etc/rc.d/pflog start</userinput></screen>
|
||
|
||
<para>Αν χρειάζεστε κάποιο από τα προχωρημένα χαρακτηριστικά του
|
||
<acronym>PF</acronym>, θα πρέπει να μεταγλωττίσετε την υποστήριξη
|
||
για το <acronym>PF</acronym> απευθείας μέσα στον πυρήνα.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Επιλογές του PF για τον Πυρήνα</title>
|
||
|
||
<indexterm>
|
||
<primary>kernel options</primary>
|
||
<secondary>device pf</secondary>
|
||
</indexterm>
|
||
|
||
<indexterm>
|
||
<primary>kernel options</primary>
|
||
<secondary>device pflog</secondary>
|
||
</indexterm>
|
||
|
||
<indexterm>
|
||
<primary>kernel options</primary>
|
||
<secondary>device pfsync</secondary>
|
||
</indexterm>
|
||
|
||
<para>Αν και δεν είναι απαραίτητο να μεταγλωττίσετε την υποστήριξη
|
||
<acronym>PF</acronym> μέσα στον πυρήνα του &os;, ίσως να θέλετε να
|
||
χρησιμοποιήσετε ένα από τα προχωρημένα χαρακτηριστικά του PF το
|
||
οποίο δεν περιλαμβάνεται στο άρθρωμα του πυρήνα: το &man.pfsync.4;.
|
||
Πρόκειται για μια ψευδο-συσκευή η οποία αποκαλύπτει συγκεκριμένες
|
||
αλλαγές στον πίνακα καταστάσεων που χρησιμοποιείται από το
|
||
<acronym>PF</acronym>. Μπορεί να συνδυαστεί με το &man.carp.4; για
|
||
να δημιουργηθούν με το <acronym>PF</acronym> firewalls με δυνατότητα
|
||
αυτόματης αλλαγής σε περίπτωση αποτυχίας (failover). Περισσότερες
|
||
πληροφορίες σχετικά με το <acronym>CARP</acronym> μπορείτε να βρείτε
|
||
στο <xref linkend="carp"/> του Εγχειριδίου.</para>
|
||
|
||
<para>Μπορείτε να δείτε όλες τις επιλογές πυρήνα για το
|
||
<acronym>PF</acronym> στο αρχείο
|
||
<filename>/usr/src/sys/conf/NOTES</filename>. Οι επιλογές φαίνονται
|
||
επίσης παρακάτω:</para>
|
||
|
||
<programlisting>device pf
|
||
device pflog
|
||
device pfsync</programlisting>
|
||
|
||
<para>Η επιλογή <literal>device pf</literal> ενεργοποιεί την υποστήριξη
|
||
για το firewall <quote>Packet Filter</quote> (&man.pf.4;).</para>
|
||
|
||
<para>Η επιλογή <literal>device pflog</literal> ενεργοποιεί την
|
||
προαιρετική ψευδο-δικτυακή συσκευή &man.pflog.4; που μπορεί να
|
||
χρησιμοποιηθεί για την καταγραφή της κίνησης σε ένα &man.bpf.4;
|
||
descriptor. Ο δαίμονας &man.pflogd.8; μπορεί να αποθηκεύσει την
|
||
καταγραφή αυτή στο σκληρό δίσκο.</para>
|
||
|
||
<para>Η επιλογή <literal>device pfsync</literal> ενεργοποιεί την
|
||
προαιρετική ψευδό-δικτυακή συσκευή &man.pfsync.4; η οποία
|
||
χρησιμοποιείται για να ανιχνεύει
|
||
<quote>αλλαγές κατάστασης</quote>.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Επιλογές στο <filename>rc.conf</filename></title>
|
||
|
||
<para>Το <acronym>PF</acronym> και το &man.pflog.4; μπορούν να
|
||
ρυθμιστούν κατά την εκκίνηση με τις παρακάτω καταχωρίσεις στο
|
||
&man.rc.conf.5;:</para>
|
||
|
||
<programlisting>pf_enable="YES" # Enable PF (load module if required)
|
||
pf_rules="/etc/pf.conf" # rules definition file for pf
|
||
pf_flags="" # additional flags for pfctl startup
|
||
pflog_enable="YES" # start pflogd(8)
|
||
pflog_logfile="/var/log/pflog" # where pflogd should store the logfile
|
||
pflog_flags="" # additional flags for pflogd startup</programlisting>
|
||
|
||
<para>Αν πίσω από αυτό το firewall υπάρχει κάποιο τοπικό δίκτυο (LAN)
|
||
προς το οποίο επιθυμείτε να προωθήσετε πακέτα, ή αν θέλετε να
|
||
χρησιμοποιήσετε NAT, θα χρειαστείτε επίσης και την παρακάτω
|
||
επιλογή:</para>
|
||
|
||
<programlisting>gateway_enable="YES" # Enable as LAN gateway</programlisting>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Δημιουργία Κανόνων Φιλτραρίσματος</title>
|
||
|
||
<para>Το <acronym>PF</acronym> διαβάζει τις ρυθμίσεις του από το
|
||
&man.pf.conf.5; (η προεπιλεγμένη τοποθεσία είναι στο
|
||
<filename>/etc/pf.conf</filename>) και τροποποιεί, απορρίπτει ή
|
||
αποδέχεται πακέτα σύμφωνα με τους κανόνες και τους ορισμούς που
|
||
περιέχονται σε αυτό. Η εγκατάσταση του &os; περιλαμβάνει αρκετά
|
||
υποδείγματα αρχείων ρύθμισης, στην τοποθεσία
|
||
<filename>/usr/share/examples/pf/</filename>. Παρακαλούμε να
|
||
διαβάσετε το <ulink
|
||
url="http://www.openbsd.org/faq/pf/">PF FAQ</ulink> για πλήρη
|
||
ανάλυση των κανόνων του <acronym>PF</acronym>.</para>
|
||
|
||
<warning>
|
||
<para>Καθώς διαβάζετε το <ulink
|
||
url="http://www.openbsd.org/faq/pf/">PF FAQ</ulink>,
|
||
να έχετε υπόψη σας ότι διαφορετικές εκδόσεις του &os; περιέχουν
|
||
διαφορετικές εκδόσεις του PF. Τη δεδομένη στιγμή, το
|
||
&os; 8.<replaceable>X</replaceable> και οι προηγούμενες
|
||
εκδόσεις χρησιμοποιούν την ίδια έκδοση του <acronym>PF</acronym>
|
||
που χρησιμοποιεί και το OpenBSD 4.1.
|
||
Το &os; 9.<replaceable>X</replaceable> και νεώτερες
|
||
εκδόσεις χρησιμοποιούν την ίδια έκδοση του
|
||
<acronym>PF</acronym> με το OpenBSD 4.5.</para>
|
||
</warning>
|
||
|
||
<para>Η &a.pf; είναι ένα καλό μέρος για να κάνετε ερωτήσεις
|
||
σχετικές με τη ρύθμιση και τη λειτουργία του <acronym>PF</acronym>
|
||
firewall. Μη ξεχάσετε να ελέγξετε τα αρχεία της λίστας πριν
|
||
ξεκινήσετε τις ερωτήσεις!</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Δουλεύοντας με το PF</title>
|
||
|
||
<para>Χρησιμοποιήστε το &man.pfctl.8; για να ελέγξετε το
|
||
<acronym>PF</acronym>. Παρακάτω θα βρείτε κάποιες χρήσιμες εντολές
|
||
(βεβαιωθείτε ότι έχετε διαβάσει τη σελίδα manual του &man.pfctl.8; για
|
||
να δείτε όλες τις διαθέσιμες επιλογές):</para>
|
||
|
||
<informaltable frame="none" pgwide="1">
|
||
<tgroup cols="2">
|
||
<thead>
|
||
<row>
|
||
<entry>Εντολή</entry>
|
||
<entry>Σκοπός</entry>
|
||
</row>
|
||
</thead>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry><command>pfctl <option>-e</option></command></entry>
|
||
<entry>Ενεργοποίηση του PF</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><command>pfctl <option>-d</option></command></entry>
|
||
<entry>Απενεργοποίηση του PF</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><command>pfctl <option>-F</option> all <option>-f</option> /etc/pf.conf</command></entry>
|
||
<entry>Διαγραφή όλων των κανόνων (nat, filter, state, table,
|
||
κ.λ.π.) και εκ νέου ανάγνωση από το αρχείο
|
||
<filename>/etc/pf.conf</filename></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><command>pfctl <option>-s</option> [ rules | nat | state ]</command></entry>
|
||
<entry>Εκτύπωση αναφοράς σχετικά με τους κανόνες του φίλτρου,
|
||
του NAT, ή του πίνακα κατάστασης</entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry><command>pfctl <option>-vnf</option> /etc/pf.conf</command></entry>
|
||
<entry>Ελέγχει το <filename>/etc/pf.conf</filename> για λάθη,
|
||
αλλά δεν φορτώνει τους κανόνες</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Ενεργοποίηση του <acronym>ALTQ</acronym></title>
|
||
|
||
<para>Το <acronym>ALTQ</acronym> διατίθεται μόνο αν μεταγλωττίσετε
|
||
απευθείας την υποστήριξη του μέσα στον πυρήνα του &os;.
|
||
Το <acronym>ALTQ</acronym> δεν υποστηρίζεται από όλα τα προγράμματα
|
||
οδήγησης καρτών δικτύου. Παρακαλούμε δείτε τη σελίδα manual του
|
||
&man.altq.4; για τη λίστα των οδηγών που υποστηρίζονται στην έκδοση
|
||
του &os; που διαθέτετε.</para>
|
||
|
||
<para>Οι παρακάτω επιλογές του πυρήνα ενεργοποιούν το
|
||
<acronym>ALTQ</acronym> και παρέχουν επιπρόσθετες λειτουργίες:</para>
|
||
|
||
<programlisting>options ALTQ
|
||
options ALTQ_CBQ # Class Bases Queuing (CBQ)
|
||
options ALTQ_RED # Random Early Detection (RED)
|
||
options ALTQ_RIO # RED In/Out
|
||
options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)
|
||
options ALTQ_PRIQ # Priority Queuing (PRIQ)
|
||
options ALTQ_NOPCC # Required for SMP build</programlisting>
|
||
|
||
<para>Η γραμμή <literal>options ALTQ</literal> ενεργοποιεί το πλαίσιο
|
||
λειτουργιών <acronym>ALTQ</acronym>.</para>
|
||
|
||
<para>Η γραμμή <literal>options ALTQ_CBQ</literal> ενεργοποιεί το
|
||
<emphasis>Class Based Queuing</emphasis> (<acronym>CBQ</acronym>).
|
||
Το <acronym>CBQ</acronym> σας επιτρέπει να χωρίσετε το εύρος ζώνης
|
||
μιας σύνδεσης σε διαφορετικές κλάσεις ή ουρές, ώστε να δίνονται
|
||
προτεραιότητες στην κίνηση ανάλογα με τους κανόνες του φίλτρου.</para>
|
||
|
||
<para>Η γραμμή <literal>options ALTQ_RED</literal> ενεργοποιεί το
|
||
<emphasis>Random Early Detection</emphasis> (<acronym>RED</acronym>).
|
||
Το <acronym>RED</acronym> χρησιμοποιείται για να αποφευχθεί η
|
||
συμφόρηση του δικτύου. Για το σκοπό αυτό, το <acronym>RED</acronym>
|
||
μετράει το μήκος της ουράς και το συγκρίνει με το μέγιστο και
|
||
ελάχιστο όριο της. Αν η ουρά είναι πάνω από το μέγιστο, όλα
|
||
τα νέα πακέτα θα απορρίπτονται. Σύμφωνα και με το όνομα του, το
|
||
<acronym>RED</acronym> απορρίπτει πακέτα από διάφορες συνδέσεις με
|
||
τυχαίο τρόπο.</para>
|
||
|
||
<para>Η γραμμή <literal>options ALTQ_RIO</literal> ενεργοποιεί το
|
||
<emphasis>Random Early Detection In and Out</emphasis>.</para>
|
||
|
||
<para>Η γραμμή <literal>options ALTQ_HFSC</literal> ενεργοποιεί το
|
||
<emphasis>Hierarchical Fair Service Curve Packet Scheduler</emphasis>.
|
||
Για περισσότερες πληροφορίες σχετικά με το <acronym>HFSC</acronym>
|
||
δείτε: <ulink
|
||
url="http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html"></ulink>.</para>
|
||
|
||
<para>Η γραμμή <literal>options ALTQ_PRIQ</literal> ενεργοποιεί το
|
||
<emphasis>Priority Queuing</emphasis> (<acronym>PRIQ</acronym>).
|
||
Το <acronym>PRIQ</acronym> πάντοτε περνάει πρώτα την κίνηση με τη
|
||
μεγαλύτερη προτεραιότητα.</para>
|
||
|
||
<para>Η γραμμή <literal>options ALTQ_NOPCC</literal> ενεργοποιεί την
|
||
υποστήριξη <acronym>SMP</acronym> για το <acronym>ALTQ</acronym>.
|
||
Η επιλογή αυτή απαιτείται σε συστήματα <acronym>SMP</acronym>.</para>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="firewalls-ipf">
|
||
<title>Το IPFILTER (IPF) Firewall</title>
|
||
|
||
<indexterm>
|
||
<primary>firewall</primary>
|
||
<secondary>IPFILTER</secondary>
|
||
</indexterm>
|
||
|
||
<para>Ο συγγραφέας του IPFILTER είναι ο Darren Reed. Το IPFILTER δεν
|
||
εξαρτάται από το λειτουργικό σύστημα: είναι μια εφαρμογή ανοικτού
|
||
κώδικα που έχει μεταφερθεί στο &os;, το NetBSD, το OpenBSD, το
|
||
&sunos;, το HP/UX και το &solaris;. Το IPFILTER είναι υπό διαρκή
|
||
και ενεργή ανάπτυξη και συντήρηση, και κυκλοφορούν τακτικά οι νέες
|
||
εκδόσεις του.</para>
|
||
|
||
<para>Το IPFILTER είναι ένα firewall και μηχανισμός
|
||
<acronym>NAT</acronym> που λειτουργεί στον πυρήνα και μπορεί να
|
||
ελέγχεται και να παρακολουθείται από προγράμματα χρήστη. Οι κανόνες
|
||
του firewall μπορούν να τίθενται σε ισχύ ή να διαγράφονται μέσω του
|
||
βοηθητικού προγράμματος &man.ipf.8;. Οι κανόνες για το
|
||
<acronym>NAT</acronym> μπορούν να τίθενται σε ισχύ ή να διαγράφονται
|
||
μέσω του βοηθητικού προγράμματος &man.ipnat.1;. Το βοηθητικό πρόγραμμα
|
||
&man.ipfstat.8; μπορεί να εκτυπώσει στατιστικά εκτέλεσης για το τμήμα
|
||
του IPFILTER που εκτελείται στον πυρήνα. Το πρόγραμμα &man.ipmon.8;
|
||
μπορεί να καταγράψει τις ενέργειες του IPFILTER στο αρχεία καταγραφής
|
||
συμβάντων του συστήματος.</para>
|
||
|
||
<para>Το IPF γράφηκε αρχικά χρησιμοποιώντας μια λογική επεξεργασίας
|
||
κανόνων του τύπου <quote>ο τελευταίο κανόνας που ταιριάζει, είναι και
|
||
ο νικητής</quote> και χρησιμοποιούσε μόνο κανόνες τύπου stateless.
|
||
Με την πάροδο του χρόνου, το IPF βελτιώθηκε για να περιλαμβάνει την
|
||
επιλογή <quote>quick</quote> και την επιλογή <quote>keep state</quote>
|
||
για stateful κανόνες. Οι επιλογές αυτές εκσυγχρόνισαν δραματικά τη
|
||
λογική επεξεργασίας των κανόνων. Η επίσημη τεκμηρίωση του IPF καλύπτει
|
||
μόνο τις παλιές παραμέτρους ρύθμισης και επεξεργασίας των κανόνων.
|
||
Οι σύγχρονες λειτουργίες καλύπτονται μόνο ως πρόσθετες επιλογές, και
|
||
έτσι δεν τονίζονται αρκετά τα πλεονεκτήματα τους στη δημιουργία ενός
|
||
πολύ καλύτερου και ασφαλέστερου firewall.</para>
|
||
|
||
<para>Οι οδηγίες που περιέχονται σε αυτή την ενότητα, βασίζονται στη
|
||
χρήση κανόνων που περιέχουν την επιλογή <quote>quick</quote> καθώς και
|
||
την stateful επιλογή <quote>keep state</quote>. Αυτό είναι και το
|
||
βασικό πλαίσιο λειτουργιών για την δημιουργία του σετ κανόνων ενός
|
||
inclusive firewall.</para>
|
||
|
||
<para>Για λεπτομέρειες σχετικά με τον παλιότερο τρόπο επεξεργασίας των
|
||
κανόνων, δείτε: <ulink
|
||
url="http://www.obfuscation.org/ipf/ipf-howto.html#TOC_1"></ulink>
|
||
και <ulink
|
||
url="http://coombs.anu.edu.au/~avalon/ip-filter.html"></ulink>.</para>
|
||
|
||
<para>Μπορείτε να δείτε το IPF FAQ στην τοποθεσία <ulink
|
||
url="http://www.phildev.net/ipf/index.html"></ulink>.</para>
|
||
|
||
<para>Μπορείτε να βρείτε τις παλαιότερες δημοσιεύσεις τις λίστας
|
||
ταχυδρομείου του IPFILTER στο <ulink
|
||
url="http://marc.theaimsgroup.com/?l=ipfilter"></ulink>. Παρέχεται
|
||
δυνατότητα αναζήτησης.</para>
|
||
|
||
<sect2>
|
||
<title>Ενεργοποιώντας το IPF</title>
|
||
|
||
<indexterm>
|
||
<primary>IPFILTER</primary>
|
||
<secondary>enabling</secondary>
|
||
</indexterm>
|
||
|
||
<para>Το IPF περιλαμβάνεται στη βασική εγκατάσταση του &os; ως άρθρωμα
|
||
το οποίο μπορεί να φορτωθεί χωριστά. Το σύστημα θα φορτώσει δυναμικά
|
||
το άρθρωμα του IPF αν υπάρχει η καταχώριση
|
||
<literal>ipfilter_enable="YES"</literal> στο αρχείο
|
||
<filename>/etc/rc.conf</filename>. Το άρθρωμα έχει δημιουργηθεί με
|
||
ενεργοποιημένη την δυνατότητα καταγραφής και με την επιλογή
|
||
<literal>default pass all</literal>. Για να αλλάξετε αυτή την
|
||
προεπιλογή σε <literal>block all</literal>, μπορείτε απλώς να
|
||
προσθέσετε τον κανόνα απόρριψης (block all) στο τέλος των κανόνων σας.
|
||
Δεν χρειάζεται να μεταγλωττίσετε την επιλογή IPF στο πυρήνα του &os;
|
||
για το σκοπό αυτό.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Επιλογές για τον Πυρήνα</title>
|
||
|
||
<indexterm>
|
||
<primary>kernel options</primary>
|
||
<secondary>IPFILTER</secondary>
|
||
</indexterm>
|
||
|
||
<indexterm>
|
||
<primary>kernel options</primary>
|
||
<secondary>IPFILTER_LOG</secondary>
|
||
</indexterm>
|
||
|
||
<indexterm>
|
||
<primary>kernel options</primary>
|
||
<secondary>IPFILTER_DEFAULT_BLOCK</secondary>
|
||
</indexterm>
|
||
|
||
<indexterm>
|
||
<primary>IPFILTER</primary>
|
||
<secondary>kernel options</secondary>
|
||
</indexterm>
|
||
|
||
<para>Δεν είναι υποχρεωτικό να μεταγλωττίσετε τις παρακάτω επιλογές στον
|
||
πυρήνα του &os; για να ενεργοποιήσετε το IPF. Η παρουσίαση τους εδώ
|
||
είναι καθαρά ενημερωτική. Αν μεταγλωττίσετε το IPF απευθείας
|
||
στον πυρήνα, δεν θα χρησιμοποιηθεί ποτέ το αντίστοιχο άρθρωμα.</para>
|
||
|
||
<para>Στο αρχείο <filename>/usr/src/sys/conf/NOTES</filename> θα βρείτε
|
||
παραδείγματα καταχωρίσεων IPF για το αρχείο ρύθμισης του πυρήνα. Οι
|
||
επιλογές αυτές φαίνονται επίσης παρακάτω:</para>
|
||
|
||
<programlisting>options IPFILTER
|
||
options IPFILTER_LOG
|
||
options IPFILTER_DEFAULT_BLOCK</programlisting>
|
||
|
||
<para>Η επιλογή <literal>options IPFILTER</literal> ενεργοποιεί την
|
||
υποστήριξη για το <quote>IPFILTER</quote> firewall.</para>
|
||
|
||
<para>Η επιλογή <literal>options IPFILTER_LOG</literal> ενεργοποιεί την
|
||
υποστήριξη καταγραφής του IPF, η οποία γράφει στην ψευδο-συσκευή
|
||
καταγραφής πακέτων <devicename>ipl</devicename> για κάθε κανόνα που
|
||
περιλαμβάνει την επιλογή <literal>log</literal>.</para>
|
||
|
||
<para>Η επιλογή <literal>options IPFILTER_DEFAULT_BLOCK</literal>
|
||
αλλάζει την προεπιλεγμένη συμπεριφορά, ώστε κάθε πακέτο που δεν
|
||
ταιριάζει με κάποιο κανόνα <literal>pass</literal> του firewall,
|
||
να απορρίπτεται αυτόματα.</para>
|
||
|
||
<para>Οι παραπάνω επιλογές θα ενεργοποιηθούν μόνο αφού μεταγλωττίσετε
|
||
και εγκαταστήσετε ένα προσαρμοσμένο πυρήνα που να τις
|
||
περιλαμβάνει.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Διαθέσιμες Επιλογές για το <filename>rc.conf</filename></title>
|
||
|
||
<para>Χρειάζεστε τις παρακάτω καταχωρίσεις στο
|
||
<filename>/etc/rc.conf</filename> για να ενεργοποιήσετε το IPF κατά
|
||
την εκκίνηση του υπολογιστή:</para>
|
||
|
||
<programlisting>ipfilter_enable="YES" # Start ipf firewall
|
||
ipfilter_rules="/etc/ipf.rules" # loads rules definition text file
|
||
ipmon_enable="YES" # Start IP monitor log
|
||
ipmon_flags="-Ds" # D = start as daemon
|
||
# s = log to syslog
|
||
# v = log tcp window, ack, seq
|
||
# n = map IP & port to names</programlisting>
|
||
|
||
<para>Αν πίσω από αυτό το firewall υπάρχει κάποιο LAN που χρησιμοποιεί
|
||
δεσμευμένες ιδιωτικές διευθύνσεις, θα χρειαστεί να προσθέσετε τις
|
||
παρακάτω καταχωρίσεις για να ενεργοποιήσετε τη λειτουργία
|
||
<acronym>NAT</acronym>:</para>
|
||
|
||
<programlisting>gateway_enable="YES" # Enable as LAN gateway
|
||
ipnat_enable="YES" # Start ipnat function
|
||
ipnat_rules="/etc/ipnat.rules" # rules definition file for ipnat</programlisting>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>IPF</title>
|
||
|
||
<indexterm><primary><command>ipf</command></primary></indexterm>
|
||
|
||
<para>Η εντολή &man.ipf.8; χρησιμοποιείται για να φορτώσει το αρχείο
|
||
των κανόνων. Φυσιολογικά, θα δημιουργήσετε ένα αρχείο με τους δικούς
|
||
σας προσαρμοσμένους κανόνες και θα αντικαταστήσετε με αυτό
|
||
εξ'ολοκλήρου τους ενσωματωμένους κανόνες του firewall:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipf -Fa -f /etc/ipf.rules</userinput></screen>
|
||
|
||
<para>Η επιλογή <option>-Fa</option> αδειάζει τους κανόνες από τους
|
||
εσωτερικούς πίνακες του firewall.</para>
|
||
|
||
<para>Η επιλογή <option>-f</option> καθορίζει το αρχείο των κανόνων που
|
||
θα φορτωθεί.</para>
|
||
|
||
<para>Αυτό σας δίνει την δυνατότητα να αλλάξετε το αρχείο κανόνων σας,
|
||
να εκτελέσετε την εντολή IPF που αναφέραμε παραπάνω, και
|
||
να ανανεώσετε με αυτό τον τρόπο τους κανόνες στο firewall που
|
||
εκτελείται ήδη με καινούργιους, χωρίς να χρειαστεί να επανεκκινήσετε
|
||
το σύστημα σας. Η μέθοδος αυτή είναι πολύ βολική για να δοκιμάσετε
|
||
νέους κανόνες, καθώς μπορεί να επαναληφθεί όσες φορές θέλετε.</para>
|
||
|
||
<para>Δείτε τη σελίδα manual του &man.ipf.8; για λεπτομέρειες σχετικά με
|
||
τις υπόλοιπες επιλογές που μπορείτε να χρησιμοποιήσετε με την εντολή
|
||
αυτή.</para>
|
||
|
||
<para>Η εντολή &man.ipf.8; αναμένει ένα απλό αρχείο κειμένου ως αρχείο
|
||
κανόνων. Δεν θα δεχθεί αρχείο κανόνων γραμμένο ως script με
|
||
συμβολικές αντικαταστάσεις.</para>
|
||
|
||
<para>Υπάρχει ωστόσο τρόπος να γράψετε κανόνες IPF που να χρησιμοποιούν
|
||
την ισχύ των συμβολικών αντικαταστάσεων. Για περισσότερες
|
||
πληροφορίες, δείτε το
|
||
<xref linkend="firewalls-ipf-rules-script"/>.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>IPFSTAT</title>
|
||
|
||
<indexterm><primary><command>ipfstat</command></primary></indexterm>
|
||
<indexterm>
|
||
<primary>IPFILTER</primary>
|
||
<secondary>statistics</secondary>
|
||
</indexterm>
|
||
|
||
<para>Η προεπιλεγμένη συμπεριφορά του &man.ipfstat.8; είναι να ανακτά
|
||
και να απεικονίζει το σύνολο των στατιστικών που συγκεντρώθηκαν ως
|
||
αποτέλεσμα της εφαρμογής των κανόνων του χρήστη στα πακέτα που
|
||
εισέρχονται και εξέρχονται από το firewall, από τη στιγμή της
|
||
τελευταίας του εκκίνησης ή από τον τελευταίο τους μηδενισμό μέσω της
|
||
εντολής <command>ipf -Z</command>.</para>
|
||
|
||
<para>Δείτε τη σελίδα manual &man.ipfstat.8; για λεπτομέρειες.</para>
|
||
|
||
<para>Η προεπιλεγμένη έξοδος της εντολής &man.ipfstat.8; θα μοιάζει με
|
||
την παρακάτω:</para>
|
||
|
||
<screen>input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0
|
||
output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0
|
||
input packets logged: blocked 99286 passed 0
|
||
output packets logged: blocked 0 passed 0
|
||
packets logged: input 0 output 0
|
||
log failures: input 3898 output 0
|
||
fragment state(in): kept 0 lost 0
|
||
fragment state(out): kept 0 lost 0
|
||
packet state(in): kept 169364 lost 0
|
||
packet state(out): kept 431395 lost 0
|
||
ICMP replies: 0 <acronym>TCP</acronym> RSTs sent: 0
|
||
Result cache hits(in): 1215208 (out): 1098963
|
||
IN Pullups succeeded: 2 failed: 0
|
||
OUT Pullups succeeded: 0 failed: 0
|
||
Fastroute successes: 0 failures: 0
|
||
<acronym>TCP</acronym> cksum fails(in): 0 (out): 0
|
||
Packet log flags set: (0)</screen>
|
||
|
||
<para>Όταν χρησιμοποιηθεί η επιλογή <option>-i</option> για τα
|
||
εισερχόμενα ή η επιλογή <option>-o</option> για τα εξερχόμενα πακέτα,
|
||
η εντολή θα ανακτήσει και θα απεικονίσει την αντίστοιχη λίστα
|
||
κανόνων που είναι εγκατεστημένη και χρησιμοποιείται από τον πυρήνα τη
|
||
δεδομένη στιγμή.</para>
|
||
|
||
<para>Η εντολή <command>ipfstat -in</command> δείχνει ένα αριθμημένο
|
||
πίνακα κανόνων για εισερχόμενα πακέτα.</para>
|
||
|
||
<para>Η εντολή <command>ipfstat -on</command> δείχνει ένα αριθμημένο
|
||
πίνακα κανόνων για εξερχόμενα πακέτα.</para>
|
||
|
||
<para>Η έξοδος θα μοιάζει με την παρακάτω:</para>
|
||
|
||
<screen>@1 pass out on xl0 from any to any
|
||
@2 block out on dc0 from any to any
|
||
@3 pass out quick on dc0 proto tcp/udp from any to any keep state</screen>
|
||
|
||
<para>Η εντολή <command>ipfstat -ih</command> δείχνει τον πίνακα
|
||
κανόνων για τα εισερχόμενα πακέτα, τοποθετώντας μπροστά από τον
|
||
κάθε κανόνα ένα αριθμό που δείχνει πόσες φορές έχει
|
||
χρησιμοποιηθεί.</para>
|
||
|
||
<para>Η εντολή <command>ipfstat -oh</command> δείχνει τον πίνακα
|
||
κανόνων για τα εξερχόμενα πακέτα, τοποθετώντας μπροστά από τον
|
||
κάθε κανόνα ένα αριθμό που δείχνει πόσες φορές έχει
|
||
χρησιμοποιηθεί.</para>
|
||
|
||
<para>Η έξοδος θα μοιάζει με την παρακάτω:</para>
|
||
|
||
<screen>2451423 pass out on xl0 from any to any
|
||
354727 block out on dc0 from any to any
|
||
430918 pass out quick on dc0 proto tcp/udp from any to any keep state</screen>
|
||
|
||
<para>Μια από τις πιο σημαντικές λειτουργίες της εντολής
|
||
<command>ipfstat</command> είναι η επιλογή <option>-t</option> η
|
||
οποία απεικονίζει τον πίνακα καταστάσεων, με τρόπο όμοιο με αυτό
|
||
που χρησιμοποιεί η εντολή &man.top.1; για να δείξει τον πίνακα
|
||
διεργασιών που εκτελούνται στο &os;. Όταν το firewall σας δέχεται
|
||
επίθεση, η λειτουργία αυτή σας δίνει την δυνατότητα να αναγνωρίσετε
|
||
και να εστιάσετε στα ίδια τα πακέτα που την αποτελούν.
|
||
Οι προαιρετικές υπο-επιλογές σας δίνουν την δυνατότητα να επιλέξετε
|
||
το IP αφετηρίας ή προορισμού, την θύρα, ή το πρωτόκολλο το οποίο
|
||
θέλετε να παρακολουθήσετε σε πραγματικό χρόνο. Δείτε τη σελίδα
|
||
manual του &man.ipfstat.8; για περισσότερες λεπτομέρειες.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>IPMON</title>
|
||
|
||
<indexterm><primary><command>ipmon</command></primary></indexterm>
|
||
<indexterm>
|
||
<primary>IPFILTER</primary>
|
||
<secondary>logging</secondary>
|
||
</indexterm>
|
||
|
||
<para>Για να λειτουργήσει σωστά η εντολή <command>ipmon</command>,
|
||
θα πρέπει να ενεργοποιηθεί η επιλογή <literal>IPFILTER_LOG</literal>
|
||
στον πυρήνα. Η εντολή αυτή διαθέτει δύο διαφορετικούς τρόπους
|
||
λειτουργίας. Ο προεπιλεγμένος κανονικός τρόπος λειτουργίας
|
||
ενεργοποιείται όταν η εντολή χρησιμοποιείται χωρίς την επιλογή
|
||
<option>-D</option>.</para>
|
||
|
||
<para>Η εντολή μπορεί να χρησιμοποιηθεί σε λειτουργία δαίμονα όταν
|
||
επιθυμείτε να έχετε ένα συνεχόμενο αρχείο καταγραφής ώστε να μπορείτε
|
||
να εξετάσετε τις προηγούμενες εγγραφές. Αυτός είναι και ο τρόπος με
|
||
τον οποίο έχει ρυθμιστεί να συνεργάζεται το &os; με το IPFILTER.
|
||
Το &os; έχει ενσωματωμένη δυνατότητα εναλλαγής αρχείων καταγραφής.
|
||
Για αυτό το λόγο, είναι καλύτερο η καταγραφή να γίνεται μέσω του
|
||
&man.syslogd.8; παρά σε ένα συνηθισμένο αρχείο. Από προεπιλογή, η
|
||
ρύθμιση <literal>ipmon_flags</literal> στο αρχείο
|
||
<filename>rc.conf</filename> χρησιμοποιεί τις επιλογές
|
||
<option>-Ds</option>:</para>
|
||
|
||
<programlisting>ipmon_flags="-Ds" # D = start as daemon
|
||
# s = log to syslog
|
||
# v = log tcp window, ack, seq
|
||
# n = map IP & port to names</programlisting>
|
||
|
||
<para>Τα πλεονεκτήματα της καταγραφής είναι προφανή. Παρέχει την
|
||
δυνατότητα επισκόπησης πληροφοριών όπως τα πακέτα που απορρίφθηκαν,
|
||
τις διευθύνσεις από τις οποίες λήφθηκαν, και τον προορισμό τους.
|
||
Έχετε έτσι ένα σημαντικό πλεονέκτημα όταν προσπαθείτε να αναγνωρίσετε
|
||
ένα εισβολέα.</para>
|
||
|
||
<para>Ακόμα και όταν ενεργοποιήσετε την δυνατότητα καταγραφής, το IPF
|
||
δεν θα καταγράψει τίποτα αν δεν έχει γίνει η αντίστοιχη ρύθμιση στους
|
||
κανόνες. Ο διαχειριστής του firewall αποφασίζει για ποιους κανόνες
|
||
του σετ θέλει να ενεργοποιήσει την καταγραφή, και προσθέτει σε αυτούς
|
||
την λέξη log. Φυσιολογικά, η καταγραφή ενεργοποιείται μόνο σε κανόνες
|
||
που απορρίπτουν πακέτα.</para>
|
||
|
||
<para>Είναι πολύ συνηθισμένο να περιλαμβάνεται ένας κανόνας στο τέλος
|
||
του συνόλου, που να απορρίπτει από προεπιλογή όλα τα πακέτα που
|
||
φτάνουν μέχρι εκεί (default deny). Με τον τρόπο αυτό μπορείτε να
|
||
δείτε όλα τα πακέτα που δεν ταίριαξαν με κανένα κανόνα του σετ.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Καταγραφή του IPMON</title>
|
||
|
||
<para>Το <application>syslogd</application> χρησιμοποιεί τη δική του
|
||
ειδική μέθοδο για το διαχωρισμό των δεδομένων καταγραφής.
|
||
Διαθέτει ειδικές ομαδοποιήσεις που ονομάζονται
|
||
<quote>facility</quote> και <quote>level</quote>. Όταν το IPMON
|
||
χρησιμοποιείται με την επιλογή <option>-Ds</option>, χρησιμοποιεί
|
||
από προεπιλογή το <literal>local0</literal> ως όνομα
|
||
<quote>facility</quote>. Αν το επιθυμείτε, μπορείτε να
|
||
χρησιμοποιήσετε τα παρακάτω επίπεδα για περαιτέρω διαχωρισμό των
|
||
δεδομένων καταγραφής:</para>
|
||
|
||
<screen>LOG_INFO - packets logged using the "log" keyword as the action rather than pass or block.
|
||
LOG_NOTICE - packets logged which are also passed
|
||
LOG_WARNING - packets logged which are also blocked
|
||
LOG_ERR - packets which have been logged and which can be considered short</screen>
|
||
|
||
<!-- XXX: "can be considered short" == "with incomplete header" -->
|
||
|
||
<para>Για να ρυθμίσετε το IPFILTER να καταγράφει όλα τα δεδομένα στο
|
||
<filename>/var/log/ipfilter.log</filename>, θα χρειαστεί να
|
||
δημιουργήσετε από πριν το αρχείο. Αυτό μπορεί να γίνει με την
|
||
παρακάτω εντολή:</para>
|
||
|
||
<screen>&prompt.root; <userinput>touch /var/log/ipfilter.log</userinput></screen>
|
||
|
||
<para>Η λειτουργία του &man.syslogd.8; μπορεί να ρυθμιστεί με
|
||
καταχωρίσεις στο αρχείο <filename>/etc/syslog.conf</filename>.
|
||
Το αρχείο <filename>syslog.conf</filename> προσφέρει σημαντική
|
||
ευελιξία στον τρόπο με τον οποίο το <application>syslog</application>
|
||
αντιμετωπίζει τα μηνύματα συστήματος που προέρχονται από εφαρμογές
|
||
όπως το IPF.</para>
|
||
|
||
<para>Προσθέστε την παρακάτω καταχώριση στο αρχείο
|
||
<filename>/etc/syslog.conf</filename>:</para>
|
||
|
||
<programlisting>local0.* /var/log/ipfilter.log</programlisting>
|
||
|
||
<para>Το <literal>local0.*</literal> σημαίνει ότι θα γίνεται
|
||
καταγραφή όλων των μηνυμάτων αυτού του τύπου στην τοποθεσία που έχει
|
||
οριστεί.</para>
|
||
|
||
<para>Για να ενεργοποιήσετε τις αλλαγές στο
|
||
<filename>/etc/syslog.conf</filename> θα πρέπει να επανεκκινήσετε το
|
||
μηχάνημα ή να αναγκάσετε το &man.syslogd.8; να ξαναδιαβάσει το
|
||
<filename>/etc/syslog.conf</filename>, εκτελώντας την εντολή
|
||
<command>/etc/rc.d/syslogd reload</command></para>
|
||
|
||
<para>Μην ξεχάσετε να τροποποιήσετε το
|
||
<filename>/etc/newsyslog.conf</filename> ώστε να εναλλάσσει το αρχείο
|
||
καταγραφής που δημιουργήσατε παραπάνω.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Η Μορφή των Μηνυμάτων Καταγραφής</title>
|
||
|
||
<para>Τα μηνύματα που παράγονται από την <command>ipmon</command>
|
||
αποτελούνται από πεδία δεδομένων που χωρίζονται από λευκό διάστημα.
|
||
Τα πεδία που είναι κοινά σε όλα τα μηνύματα, είναι τα παρακάτω:</para>
|
||
|
||
<orderedlist>
|
||
<listitem>
|
||
<para>Η ημερομηνία παραλαβής του πακέτου</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Η ώρα παραλαβής του πακέτου. Έχει την μορφή HH:MM:SS.F,
|
||
η οποία υποδηλώνει ώρες, λεπτά, δευτερόλεπτα και κλάσματα
|
||
δευτερολέπτου (τα οποία μπορεί να είναι πολλά δεκαδικά
|
||
ψηφία).</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Το όνομα της διεπαφής στην οποία έγινε η επεξεργασία του
|
||
πακέτου π.χ. <devicename>dc0</devicename>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Ο αριθμός ομάδας και ο αύξων αριθμός του κανόνα, π.χ.
|
||
<literal>@0:17</literal>.</para>
|
||
</listitem>
|
||
</orderedlist>
|
||
|
||
<para>Μπορείτε να δείτε τα παρακάτω με την εντολή
|
||
<command>ipfstat -in</command>:</para>
|
||
|
||
<orderedlist>
|
||
<listitem>
|
||
<para>Το είδος της ενέργειας: p αν το πακέτο πέρασε, b αν το πακέτο
|
||
απορρίφθηκε, S για σύντομο πακέτο, n αν δεν ταίριαξε με κανένα
|
||
κανόνα, L για κανόνα με καταγραφή. Η σειρά προτεραιότητας στην
|
||
απεικόνιση των παραπάνω, είναι S, p, b, n, L. Το κεφαλαίο P ή
|
||
το B σημαίνουν ότι η καταγραφή του πακέτου έγινε λόγω κάποιας
|
||
γενικής ρύθμισης καταγραφής και όχι εξαιτίας κάποιου
|
||
κανόνα.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Οι διευθύνσεις. Πρόκειται στην πραγματικότητα για τρία
|
||
πεδία: τη διεύθυνση και τη θύρα αφετηρίας (χωρίζονται με κόμμα),
|
||
το σύμβολο -> και την διεύθυνση και θύρα προορισμού, π.χ.
|
||
<literal>209.53.17.22,80 -> 198.73.220.17,1722</literal>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Το <literal>PR</literal> ακολουθούμενο από το όνομα ή τον
|
||
αριθμό του πρωτοκόλλου, π.χ. <literal>PR tcp</literal>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Το <literal>len</literal> ακολουθούμενο από το μήκος της
|
||
επικεφαλίδας και το συνολικό μήκος του πακέτου, π.χ.
|
||
<literal>len 20 40</literal>.</para>
|
||
</listitem>
|
||
</orderedlist>
|
||
|
||
<para>Αν πρόκειται για πακέτο <acronym>TCP</acronym>, θα υπάρχει ένα
|
||
επιπλέον πεδίο το οποίο θα ξεκινάει με μια παύλα και θα ακολουθείται
|
||
από γράμματα τα οποία αντιστοιχούν στις επιλογές (flags) που έχουν
|
||
τεθεί. Δείτε τη σελίδα manual &man.ipf.5; για τη λίστα των
|
||
γραμμάτων και των αντίστοιχων flags.</para>
|
||
|
||
<para>Αν πρόκειται για πακέτο ICMP, θα υπάρχουν δύο πεδία στο τέλος,
|
||
το πρώτο θα είναι πάντα <quote>ICMP</quote> και το επόμενο θα είναι
|
||
ο τύπος του μηνύματος και του υπό-μηνύματος ICMP, χωρισμένα με μια
|
||
κάθετο, π.χ. ICMP 3/3 για ένα μήνυμα μη προσβάσιμης θύρας (port
|
||
unreachable).</para>
|
||
</sect2>
|
||
|
||
<sect2 id="firewalls-ipf-rules-script">
|
||
<title>Δημιουργία Script Κανόνων με Συμβολική Υποκατάσταση</title>
|
||
|
||
<para>Ορισμένοι έμπειροι χρήστες του IPF δημιουργούν ένα αρχείο
|
||
κανόνων το οποίο μπορεί να εκτελεστεί ως script με δυνατότητα
|
||
συμβολικής υποκατάστασης. Το βασικό όφελος του παραπάνω, είναι ότι
|
||
χρειάζεται να αλλάξετε μόνο την τιμή που σχετίζεται με το συμβολικό
|
||
όνομα και όταν το script εκτελεστεί, η τιμή θα υποκατασταθεί σε όλους
|
||
τους κανόνες που περιέχουν το όνομα αυτό. Καθώς πρόκειται για
|
||
script, μπορείτε να χρησιμοποιήσετε συμβολική υποκατάσταση για να
|
||
κωδικοποιήσετε συχνά χρησιμοποιούμενες τιμές και να τις υποκαθιστάτε
|
||
σε πολλαπλούς κανόνες. Αυτό φαίνεται και στο παράδειγμα που
|
||
ακολουθεί.</para>
|
||
|
||
<para>Η σύνταξη του script που χρησιμοποιείται εδώ, είναι συμβατή με τα
|
||
κελύφη &man.sh.1;, &man.csh.1;, και &man.tcsh.1;.</para>
|
||
|
||
<para>Τα πεδία στα οποία γίνεται συμβολική υποκατάσταση προσημειώνονται
|
||
με το σήμα του δολαρίου: <literal>$</literal>.</para>
|
||
|
||
<para>Τα συμβολικά πεδία δεν έχουν την προσημείωση με το
|
||
$.</para>
|
||
|
||
<para>Η τιμή που θα χρησιμοποιηθεί στο συμβολικό πεδίο, θα πρέπει να
|
||
εσωκλείεται σε διπλά εισαγωγικά (<literal>"</literal>).</para>
|
||
|
||
<para>Ξεκινήστε το αρχείο των κανόνων σας με κάτι αντίστοιχο με το
|
||
παρακάτω:</para>
|
||
|
||
<programlisting>############# Start of IPF rules script ########################
|
||
|
||
oif="dc0" # name of the outbound interface
|
||
odns="192.0.2.11" # ISP's DNS server IP address
|
||
myip="192.0.2.7" # my static IP address from ISP
|
||
ks="keep state"
|
||
fks="flags S keep state"
|
||
|
||
# You can choose between building /etc/ipf.rules file
|
||
# from this script or running this script "as is".
|
||
#
|
||
# Uncomment only one line and comment out another.
|
||
#
|
||
# 1) This can be used for building /etc/ipf.rules:
|
||
#cat > /etc/ipf.rules << EOF
|
||
#
|
||
# 2) This can be used to run script "as is":
|
||
/sbin/ipf -Fa -f - << EOF
|
||
|
||
# Allow out access to my ISP's Domain name server.
|
||
pass out quick on $oif proto tcp from any to $odns port = 53 $fks
|
||
pass out quick on $oif proto udp from any to $odns port = 53 $ks
|
||
|
||
# Allow out non-secure standard www function
|
||
pass out quick on $oif proto tcp from $myip to any port = 80 $fks
|
||
|
||
# Allow out secure www function https over TLS SSL
|
||
pass out quick on $oif proto tcp from $myip to any port = 443 $fks
|
||
EOF
|
||
################## End of IPF rules script ########################</programlisting>
|
||
|
||
<para>Αυτό είναι όλο. Στο παραπάνω παράδειγμα δεν είναι σημαντικοί
|
||
οι κανόνες, αλλά ο τρόπος με τον οποίο λειτουργούν και παίρνουν τιμές
|
||
τα πεδία υποκατάστασης. Αν το παραπάνω παράδειγμα βρίσκονταν σε ένα
|
||
αρχείο με το όνομα <filename>/etc/ipf.rules.script</filename>,
|
||
θα μπορούσατε να επαναφορτώσετε αυτούς τους κανόνες με την παρακάτω
|
||
εντολή:</para>
|
||
|
||
<screen>&prompt.root; <userinput>sh /etc/ipf.rules.script</userinput></screen>
|
||
|
||
<para>Υπάρχει ένα πρόβλημα όταν χρησιμοποιούνται αρχεία κανόνων με
|
||
ενσωματωμένους συμβολισμούς: Το IPF δεν καταλαβαίνει τη συμβολική
|
||
υποκατάσταση, και δεν μπορεί να διαβάσει αυτά τα scripts άμεσα.</para>
|
||
|
||
<para>Ένα τέτοιο script μπορεί να χρησιμοποιηθεί με ένα από τους δύο
|
||
παρακάτω τρόπους:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Αφαιρέστε το σχόλιο από τη γραμμή που ξεκινάει με
|
||
<literal>cat</literal>, και μετατρέψτε σε σχόλιο τη γραμμή που
|
||
ξεκινάει με <literal>/sbin/ipf</literal>. Τοποθετήστε το
|
||
<literal>ipfilter_enable="YES"</literal> στο αρχείο
|
||
<filename>/etc/rc.conf</filename> όπως συνήθως, και εκτελέστε
|
||
το script μια φορά μετά από κάθε αλλαγή για να δημιουργήσετε ή να
|
||
ενημερώσετε το <filename>/etc/ipf.rules</filename>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Απενεργοποιήστε το IPFILTER στα scripts εκκίνησης του
|
||
συστήματος, προσθέτοντας την καταχώριση
|
||
<literal>ipfilter_enable="NO"</literal> (πρόκειται για την
|
||
προεπιλεγμένη τιμή) στο αρχείο
|
||
<filename>/etc/rc.conf</filename>.</para>
|
||
|
||
<para>Προσθέστε ένα script όπως το παρακάτω στον κατάλογο εκκίνησης
|
||
<filename class="directory">/usr/local/etc/rc.d/</filename>. Το
|
||
script θα πρέπει να έχει ένα προφανές όνομα, όπως
|
||
<filename>ipf.loadrules.sh</filename>. Η επέκταση
|
||
<filename>.sh</filename> είναι υποχρεωτική.</para>
|
||
|
||
<programlisting>#!/bin/sh
|
||
sh /etc/ipf.rules.script</programlisting>
|
||
|
||
<para>Οι άδειες σε αυτό το αρχείο, θα πρέπει να επιτρέπουν ανάγνωση,
|
||
εγγραφή και εκτέλεση για τον χρήστη
|
||
<username>root</username>.</para>
|
||
|
||
<screen>&prompt.root; <userinput>chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh</userinput></screen>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Οι κανόνες του IPF θα φορτώνονται πλέον κατά την εκκίνηση του
|
||
συστήματος σας.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Το Σύνολο Κανόνων του IPF</title>
|
||
|
||
<para>Ως <quote>σύνολο κανόνων</quote> στο IPF, ορίζουμε μια ομάδα
|
||
κανόνων που έχουν γραφεί για να επιτρέπουν ή να απορρίπτουν πακέτα
|
||
ανάλογα με τις τιμές που περιέχονται σε αυτά. Η διπλής κατεύθυνσης
|
||
ανταλλαγή πακέτων μεταξύ υπολογιστών αποτελεί μια συνεδρία.
|
||
Το σύνολο κανόνων του firewall επεξεργάζεται τόσο τα πακέτα που
|
||
έρχονται από το Internet, όσο και τα πακέτα που παράγονται από το
|
||
σύστημα ως απάντηση σε αυτά. Κάθε υπηρεσία <acronym>TCP/IP</acronym>
|
||
(π.χ. telnet, www, mail, κ.λ.π.) καθορίζεται από το πρωτόκολλο και
|
||
την προνομιακή (privileged) θύρα που χρησιμοποιεί για να δέχεται
|
||
αιτήματα εξυπηρέτησης. Τα πακέτα που προορίζονται για μια
|
||
συγκεκριμένη υπηρεσία, ξεκινούν από τη διεύθυνση αφετηρίας
|
||
χρησιμοποιώντας μια μη-προνομιακή θύρα και καταλήγουν στη
|
||
συγκεκριμένη θύρα υπηρεσίας στον προορισμό. Όλες οι παραπάνω
|
||
παράμετροι (θύρες και διευθύνσεις) μπορούν να χρησιμοποιηθούν
|
||
ως κριτήρια επιλογής για την δημιουργία κανόνων που επιτρέπουν
|
||
ή εμποδίζουν την πρόσβαση σε υπηρεσίες.</para>
|
||
|
||
<indexterm>
|
||
<primary>IPFILTER</primary>
|
||
<secondary>rule processing order</secondary>
|
||
</indexterm>
|
||
|
||
<para>Το IPF γράφτηκε αρχικά χρησιμοποιώντας μια λογική επεξεργασίας
|
||
κανόνων του τύπου <quote>ο τελευταίος κανόνας που ταιριάζει, είναι ο
|
||
νικητής</quote> και χρησιμοποιούσε μόνο κανόνες stateless. Με την
|
||
πάροδο του χρόνου, το IPF ενισχύθηκε με την επιλογή
|
||
<quote>quick</quote> και με δυνατότητα αποθήκευσης κατάστασης
|
||
μέσω της επιλογής <quote>keep state</quote>. Με τον τρόπο αυτό,
|
||
εκσυγχρονίστηκε δραματικά η λογική επεξεργασίας των κανόνων.</para>
|
||
|
||
<para>Οι οδηγίες που περιέχονται σε αυτή την ενότητα βασίζονται στη
|
||
χρήση κανόνων που περιέχουν την επιλογή <quote>quick</quote> και την
|
||
επιλογή <quote>keep state</quote> για τη διατήρηση της κατάστασης.
|
||
Αυτές είναι και οι βασικές λειτουργίες για την κωδικοποίηση του
|
||
συνόλου κανόνων ενός inclusive firewall.</para>
|
||
|
||
<warning>
|
||
<para>Όταν δουλεύετε με τους κανόνες του firewall, θα πρέπει να είστε
|
||
<emphasis>πολύ προσεκτικοί</emphasis>. Αν βάλετε λανθασμένες
|
||
ρυθμίσεις, μπορεί να <emphasis>κλειδωθείτε έξω</emphasis> από τον
|
||
εξυπηρετητή σας. Για να είστε ασφαλείς, είναι προτιμότερο να
|
||
κάνετε τις αρχικές σας ρυθμίσεις από την τοπική κονσόλα, παρά μέσω
|
||
απομακρυσμένης σύνδεσης (π.χ. μέσω
|
||
<application>ssh</application>).</para>
|
||
</warning>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Συντακτικό Κανόνων</title>
|
||
|
||
<indexterm>
|
||
<primary>IPFILTER</primary>
|
||
<secondary>rule syntax</secondary>
|
||
</indexterm>
|
||
|
||
<para>Το συντακτικό των κανόνων που παρουσιάζουμε εδώ, έχει απλοποιηθεί
|
||
ώστε να απεικονίζει τη σύγχρονη stateful υλοποίηση και τη λογική
|
||
του τύπου <quote>ο πρώτος κανόνας που ταιριάζει είναι και ο
|
||
νικητής</quote>. Για την περιγραφή του παλιότερου τρόπου λειτουργίας,
|
||
διαβάστε τη σελίδα manual του &man.ipf.8;.</para>
|
||
|
||
<para>Ο χαρακτήρας <literal>#</literal> χρησιμοποιείται για να
|
||
επισημάνει την αρχή ενός σχολίου, και μπορεί να εμφανίζεται στο τέλος
|
||
μιας γραμμής κανόνα ή στη δική του γραμμή. Οι κενές γραμμές
|
||
αγνοούνται.</para>
|
||
|
||
<para>Οι κανόνες περιέχουν λέξεις-κλειδιά. Οι λέξεις αυτές θα πρέπει
|
||
να κωδικοποιηθούν με συγκεκριμένη σειρά από τα αριστερά προς τα δεξιά
|
||
της γραμμής. Οι λέξεις-κλειδιά φαίνονται παρακάτω με έντονα γράμματα.
|
||
Μερικές λέξεις έχουν υπο-επιλογές οι οποίες μπορεί να είναι επίσης
|
||
λέξεις-κλειδιά και να περιλαμβάνουν επίσης περισσότερες υπο-επιλογές.
|
||
Κάθε μια από τις επικεφαλίδες στο παράδειγμα που φαίνεται παρακάτω
|
||
έχει μια κεφαλίδα με έντονα γράμματα η οποία επεξηγεί το περιεχόμενο
|
||
της.</para>
|
||
|
||
<!-- This section is probably wrong. See the OpenBSD flag -->
|
||
<!-- What is the "OpenBSD flag"? Reference please -->
|
||
|
||
<para><replaceable>ACTION IN-OUT OPTIONS SELECTION STATEFUL PROTO
|
||
SRC_ADDR,DST_ADDR OBJECT PORT_NUM TCP_FLAG
|
||
STATEFUL</replaceable></para>
|
||
|
||
<para><replaceable>ACTION</replaceable> = block | pass</para>
|
||
|
||
<para><replaceable>IN-OUT</replaceable> = in | out</para>
|
||
|
||
<para><replaceable>OPTIONS</replaceable> = log | quick | on
|
||
interface-name</para>
|
||
|
||
<para><replaceable>SELECTION</replaceable> = proto value |
|
||
source/destination IP | port = number | flags
|
||
flag-value</para>
|
||
|
||
<para><replaceable>PROTO</replaceable> = tcp/udp | udp | tcp |
|
||
icmp</para>
|
||
|
||
<para><replaceable>SRC_ADD,DST_ADDR</replaceable> = all | from
|
||
object to object</para>
|
||
|
||
<para><replaceable>OBJECT</replaceable> = IP address | any</para>
|
||
|
||
<para><replaceable>PORT_NUM</replaceable> = port number</para>
|
||
|
||
<para><replaceable>TCP_FLAG</replaceable> = S</para>
|
||
|
||
<para><replaceable>STATEFUL</replaceable> = keep state</para>
|
||
|
||
<sect3>
|
||
<title>ACTION</title>
|
||
|
||
<para>Η ενέργεια (action) δείχνει τι πρέπει να γίνει με το πακέτο αν
|
||
ταιριάζει με τον κανόνα του φίλτρου. Κάθε κανόνας
|
||
<emphasis>πρέπει</emphasis> να διαθέτει μια ενέργεια. Οι ενέργειες
|
||
που αναγνωρίζονται, φαίνονται παρακάτω:</para>
|
||
|
||
<para>Το <literal>block</literal> δείχνει ότι το πακέτο θα πρέπει να
|
||
απορριφθεί αν ταιριάζει με τις παραμέτρους επιλογής του
|
||
κανόνα.</para>
|
||
|
||
<para>Το <literal>pass</literal> δείχνει ότι το πακέτο θα πρέπει να
|
||
εξέλθει από το firewall, αν ταιριάζει με τις παραμέτρους επιλογής
|
||
του κανόνα.</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>IN-OUT</title>
|
||
|
||
<para>Κάθε κανόνας του φίλτρου πρέπει υποχρεωτικά να διευκρινίζει
|
||
με σαφήνεια αν αναφέρεται στην είσοδο ή την έξοδο πακέτων.
|
||
Η επόμενη λέξη-κλειδί πρέπει να είναι <literal>in</literal> ή
|
||
<literal>out</literal> και αν δεν υπάρχει, ο κανόνας θα αποτύχει
|
||
κατά το συντακτικό έλεγχο.</para>
|
||
|
||
<para>Το <literal>in</literal> σημαίνει ότι ο κανόνας θα εφαρμοστεί
|
||
σε ένα εισερχόμενο πακέτο το οποίο μόλις λήφθηκε στη διεπαφή που
|
||
συνδέεται με το Διαδίκτυο.</para>
|
||
|
||
<para>Το <literal>out</literal> σημαίνει ότι ο κανόνας θα εφαρμοστεί
|
||
σε ένα πακέτο που προορίζεται για έξοδο μέσω της διεπαφής που
|
||
συνδέεται με το Διαδίκτυο.</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>OPTIONS</title>
|
||
|
||
<note>
|
||
<para>Οι παρακάτω επιλογές πρέπει να χρησιμοποιηθούν με τη σειρά
|
||
που φαίνονται εδώ.</para>
|
||
</note>
|
||
|
||
<para>Το <literal>log</literal> δείχνει ότι η επικεφαλίδα του πακέτου
|
||
θα γραφεί στο αρχείο καταγραφής του
|
||
|
||
<!-- XXX - xref here -->
|
||
|
||
<devicename>ipl</devicename> (όπως περιγράφεται στην ενότητα
|
||
LOGGING που ακολουθεί) αν οι παράμετροι της επιλογής ταιριάζουν με
|
||
το πακέτο.</para>
|
||
|
||
<para>To <literal>quick</literal> δείχνει ότι αν οι παράμετροι της
|
||
επιλογής ταιριάζουν με το πακέτο, ο συγκεκριμένος κανόνας θα είναι
|
||
και ο τελευταίος κανόνας που θα ελεγχθεί. Η επιλογή αυτή είναι
|
||
υποχρεωτική για τη σύγχρονη λογική επεξεργασίας πακέτων.</para>
|
||
|
||
<para>Το <literal>on</literal> δείχνει το όνομα της διεπαφής που θα
|
||
ενσωματωθεί στις παραμέτρους επιλογής. Τα ονόματα των διεπαφών
|
||
φαίνονται όταν εκτελείται η εντολή &man.ifconfig.8;.
|
||
Χρησιμοποιώντας την επιλογή αυτή, ο κανόνας θα ελεγχθεί μόνο αν το
|
||
πακέτο διέρχεται μέσω της συγκεκριμένης διεπαφής και προς τη
|
||
συγκεκριμένη κατεύθυνση (εισερχόμενα/εξερχόμενα). Η επιλογή αυτή
|
||
είναι υποχρεωτική για την σύγχρονη λογική επεξεργασίας των
|
||
κανόνων.</para>
|
||
|
||
<para>Όταν γίνεται καταγραφή ενός πακέτου, οι επικεφαλίδες γράφονται
|
||
στην ψευδο-συσκευή καταγραφής πακέτων <acronym>IPL</acronym>.
|
||
Μετά την εντολή <literal>log</literal>, μπορούν να χρησιμοποιηθούν
|
||
οι παρακάτω παράμετροι (με τη σειρά που φαίνονται):</para>
|
||
|
||
<para>Το <literal>body</literal> δείχνει ότι θα γίνει καταγραφή των
|
||
πρώτων 128 bytes των περιεχομένων του πακέτου, που βρίσκονται αμέσως
|
||
μετά την επικεφαλίδα.</para>
|
||
|
||
<para>Η επιλογή <literal>first</literal> συνίσταται να χρησιμοποιηθεί
|
||
αν η επιλογή <literal>log</literal> χρησιμοποιείται σε συνδυασμό
|
||
με την <literal>keep state</literal>. Με τον τρόπο αυτό γίνεται
|
||
καταγραφή μόνο του πρώτου πακέτου (με το οποίο ξεκίνησε η
|
||
επικοινωνία), και όχι όλων των υπολοίπων τα οποία ταιριάζουν με την
|
||
πληροφορία <quote>keep state</quote>.</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>SELECTION</title>
|
||
|
||
<para>Οι λέξεις κλειδιά που περιγράφονται σε αυτή την ενότητα,
|
||
χρησιμοποιούνται για να περιγράψουν ποιες ιδιότητες του πακέτου
|
||
θα διερευνηθούν για να καθοριστεί αν ταιριάζει ή όχι με τους
|
||
κανόνες. Μια λέξη-κλειδί ορίζει το κεντρικό θέμα και ακολουθείται
|
||
από άλλες λέξεις που ορίζουν τις ακριβείς επιλογές. Πρέπει πάντοτε
|
||
να επιλέγεται μια από αυτές τις λέξεις. Παρέχονται οι παρακάτω
|
||
ιδιότητες γενικής χρήσης οι οποίες πρέπει να χρησιμοποιηθούν με
|
||
αυτή τη σειρά:</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>PROTO</title>
|
||
|
||
<para>Το <literal>proto</literal> είναι η βασική λέξη, και πρέπει
|
||
να γράφεται μαζί με κάποια αντίστοιχη τιμή για περαιτέρω επιλογή.
|
||
Η τιμή επιτρέπει το ταίριασμα με ένα συγκεκριμένο πρωτόκολλο. Είναι
|
||
υποχρεωτικό να χρησιμοποιηθεί για να λειτουργεί η σύγχρονη λογική
|
||
επεξεργασίας των κανόνων.</para>
|
||
|
||
<para>Τα ονόματα πρωτοκόλλων που αναγνωρίζονται και μπορούν να
|
||
χρησιμοποιηθούν, είναι τα
|
||
<literal>tcp/udp | udp | tcp | icmp</literal> ή οποιαδήποτε άλλα
|
||
εμφανίζονται στο <filename>/etc/protocols</filename>. Μπορείτε να
|
||
χρησιμοποιήσετε το ειδικό όνομα <literal>tcp/udp</literal> το οποίο
|
||
ταιριάζει είτε με πακέτο <acronym>TCP</acronym> είτε με
|
||
<acronym>UDP</acronym>. Η ειδική αυτή ονομασία προστέθηκε ώστε να
|
||
αποφεύγονται διπλοί, αλλά κατά τα άλλα όμοιοι, κανόνες.</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>SRC_ADDR/DST_ADDR</title>
|
||
|
||
<para>Η λέξη <literal>all</literal> είναι ουσιαστικά συνώνυμη με την
|
||
φράση <quote>from any to any</quote> χωρίς να υπάρχουν άλλες
|
||
παράμετροι για το ταίριασμα.</para>
|
||
|
||
<para>Όταν χρησιμοποιείται το <literal>from src to dst</literal>, οι
|
||
λέξεις <literal>from</literal> και <literal>to</literal> δηλώνουν
|
||
διευθύνσεις IP που θα χρησιμοποιηθούν για το ταίριασμα. Οι κανόνες
|
||
πρέπει να καθορίζουν τις παραμέτρους τόσο της αφετηρίας όσο και του
|
||
προορισμού. Η λέξη <literal>any</literal> έχει την ειδική ιδιότητα
|
||
να ταιριάζει με οποιαδήποτε διεύθυνση IP. Παραδείγματα χρήσης:
|
||
<literal>from any to any</literal> ή
|
||
<literal>from 0.0.0.0/0 to any</literal> ή
|
||
<literal>from any to 0.0.0.0/0</literal> ή
|
||
<literal>from 0.0.0.0 to any</literal> ή
|
||
<literal>from any to 0.0.0.0</literal>.</para>
|
||
|
||
<para>Δεν υπάρχει τρόπος να περιγραφούν περιοχές IP διευθύνσεων που
|
||
δεν μπορούν να εκφραστούν εύκολα με τη μορφή αριθμών χωρισμένων με
|
||
τελείες / μάσκας υποδικτύου. Μπορείτε να χρησιμοποιήσετε το
|
||
βοηθητικό πρόγραμμα <filename
|
||
role="package">net-mgmt/ipcalc</filename> για διευκόλυνση σας
|
||
στους υπολογισμούς. Δείτε την δικτυακή τοποθεσία του προγράμματος
|
||
για περισσότερες πληροφορίες: <ulink
|
||
url="http://jodies.de/ipcalc"></ulink>.</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>PORT</title>
|
||
|
||
<para>Το ταίριασμα με κάποια συγκεκριμένη θύρα αφετηρίας ή/και
|
||
προορισμού (αν υπάρχει) εφαρμόζεται μόνο σε πακέτα
|
||
<acronym>TCP</acronym> και <acronym>UDP</acronym>. Κατά την
|
||
δημιουργία συγκρίσεων με θύρες, μπορείτε είτε να χρησιμοποιήσετε τον
|
||
αριθμό της θύρας, είτε το όνομα της αντίστοιχης υπηρεσίας
|
||
από το αρχείο <filename>/etc/services</filename>. Όταν η θύρα
|
||
εμφανίζεται ως τμήμα του αντικειμένου <literal>from</literal>, το
|
||
ταίριασμα θα γίνει με την θύρα της αφετηρίας. Όταν εμφανίζεται ως
|
||
τμήμα του αντικειμένου <literal>to</literal>, το ταίριασμα θα γίνει
|
||
με τη θύρα προορισμού. Για να λειτουργεί η σύγχρονη λογική
|
||
ταιριάσματος κανόνων, θα πρέπει οπωσδήποτε να υπάρχει η επιλογή
|
||
θύρας στο αντικείμενο <literal>to</literal>. Παράδειγμα χρήσης:
|
||
<literal>from any to any port = 80</literal></para>
|
||
|
||
<!-- XXX: Μάλλον θέλει και άλλες διορθώσεις -->
|
||
|
||
<para>Οι συγκρίσεις που αναφέρονται σε μια μόνο θύρα, μπορούν να
|
||
γίνουν με πολλούς διαφορετικούς τρόπους, χρησιμοποιώντας
|
||
διαφορετικούς τελεστές σύγκρισης. Είναι επίσης δυνατόν να
|
||
καθοριστούν ολόκληρες περιοχές από θύρες.</para>
|
||
|
||
<para>port "=" | "!=" | "<" | ">" | "<=" | ">=" |
|
||
"eq" | "ne" | "lt" | "gt" | "le" | "ge".</para>
|
||
|
||
<para>Για να καθορίσετε περιοχές θυρών, χρησιμοποιήστε
|
||
port "<>" | "><"</para>
|
||
|
||
<warning>
|
||
<para>Μετά τις παραμέτρους για το ταίριασμα της αφετηρίας και του
|
||
προορισμού, οι παρακάτω δύο παράμετροι είναι υποχρεωτικές για να
|
||
λειτουργεί η σύγχρονη λογική επεξεργασίας των κανόνων.</para>
|
||
</warning>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title><acronym>TCP</acronym>_FLAG</title>
|
||
|
||
<para>Τα flags είναι ενεργά μόνο στο φιλτράρισμα του πρωτοκόλλου
|
||
<acronym>TCP</acronym>. Το κάθε γράμμα αντιπροσωπεύει ένα πιθανό
|
||
flag το για το οποίο γίνεται ανίχνευση στην επικεφαλίδα του πακέτου
|
||
<acronym>TCP</acronym>.</para>
|
||
|
||
<para>Η σύγχρονη λογική επεξεργασίας των κανόνων, χρησιμοποιεί την
|
||
παράμετρο <literal>flags S</literal> για την αναγνώριση της έναρξης
|
||
μια συνεδρίας tcp.</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>STATEFUL</title>
|
||
|
||
<para>Σε ένα κανόνα που επιτρέπει (pass) το πέρασμα των πακέτων, η
|
||
επιλογή <literal>keep state</literal> δείχνει ότι θα πρέπει να
|
||
ενεργοποιείται η λειτουργία stateful filtering όταν το πακέτο
|
||
ταιριάζει με τα κριτήρια επιλογής.</para>
|
||
|
||
<note>
|
||
<para>Η επιλογή αυτή είναι υποχρεωτική για τη λειτουργία της
|
||
σύγχρονης λογικής επεξεργασίας κανόνων.</para>
|
||
</note>
|
||
</sect3>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Φιλτράρισμα με Διατήρηση της Κατάστασης (stateful)</title>
|
||
|
||
<indexterm>
|
||
<primary>IPFILTER</primary>
|
||
<secondary>stateful filtering</secondary>
|
||
</indexterm>
|
||
|
||
<!-- XXX: duplicated -->
|
||
|
||
<para>Το stateful φιλτράρισμα, αντιμετωπίζει την κίνηση του δικτύου ως
|
||
μιας διπλής κατεύθυνσης ανταλλαγή πακέτων τα οποία δημιουργούν μια
|
||
συνεδρία. Όταν ενεργοποιηθεί, η διατήρηση της κατάστασης
|
||
(keep-state) δημιουργεί δυναμικά εσωτερικούς κανόνες για κάθε πακέτο
|
||
το οποίο ανταλλάσσεται κατά τη διάρκεια αυτής της συνεδρίας.
|
||
Έχει επίσης τη δυνατότητα να διερευνήσει αν ακολουθούνται οι έγκυροι
|
||
κανόνες ανταλλαγής μηνυμάτων μεταξύ του αποστολέα και του παραλήπτη.
|
||
Οποιαδήποτε πακέτα δεν ταιριάζουν με το πρότυπο αυτής της
|
||
επικοινωνίας, απορρίπτονται ως ψεύτικα.</para>
|
||
|
||
<para>Η διατήρηση της κατάστασης επιτρέπει επίσης να περάσουν τα
|
||
πακέτα <acronym>ICMP</acronym> που σχετίζονται με μια συνεδρία
|
||
<acronym>TCP</acronym> ή <acronym>UDP</acronym>. Έτσι, αν ληφθούν
|
||
πακέτα <acronym>ICMP</acronym> τύπου 3 code 4 ως απάντηση κατά τη
|
||
διάρκεια της επίσκεψης σας σε μια ιστοσελίδα, (η οποία επιτρέπεται
|
||
από τον αντίστοιχο κανόνα εξερχομένων), θα τους επιτραπεί η είσοδος.
|
||
Οποιοδήποτε πακέτο για το οποίο το IPF είναι σίγουρο ότι πρόκειται
|
||
για τμήμα μιας ενεργής συνεδρίας, θα περάσει ακόμα και αν είναι
|
||
διαφορετικό πρωτόκολλο.</para>
|
||
|
||
<para>Αυτό που συμβαίνει είναι το παρακάτω:</para>
|
||
|
||
<para>Τα πακέτα που προορίζονται να εξέλθουν μέσω της διεπαφής που
|
||
συνδέεται στο Internet, ελέγχονται αρχικά σύμφωνα με το δυναμικό
|
||
πίνακα καταστάσεων. Αν το πακέτο ταιριάζει με το επόμενο που
|
||
αναμένεται σε μια ενεργή συνεδρία, εξέρχεται από το firewall και
|
||
ταυτόχρονα ενημερώνεται η κατάσταση της συγκεκριμένης συνεδρίας στον
|
||
παραπάνω δυναμικό πίνακα. Τα υπόλοιπα πακέτα (που δεν ταιριάζουν με
|
||
κάποια συνεδρία σε εξέλιξη) ελέγχονται σύμφωνα με το σύνολο κανόνων
|
||
για τα εξερχόμενα πακέτα.</para>
|
||
|
||
<para>Τα πακέτα που έρχονται από τη διεπαφή που είναι συνδεμένη με το
|
||
Internet, ελέγχονται αρχικά μέσω του δυναμικού πίνακα καταστάσεων.
|
||
Αν το πακέτο ταιριάζει με το επόμενο που αναμένεται σε μια ενεργή
|
||
συνεδρία, εξέρχεται από το firewall και ταυτόχρονα ενημερώνεται
|
||
η κατάσταση της συγκεκριμένης συνεδρίας στον παραπάνω πίνακα. Τα
|
||
υπόλοιπα πακέτα (που δεν ταιριάζουν με κάποια συνεδρία σε εξέλιξη)
|
||
ελέγχονται σύμφωνα με το σύνολο κανόνων για τα εισερχόμενα
|
||
πακέτα.</para>
|
||
|
||
<para>Όταν η επικοινωνία ολοκληρωθεί, διαγράφεται από τον δυναμικό
|
||
πίνακα καταστάσεων.</para>
|
||
|
||
<para>Το stateful φιλτράρισμα επιτρέπει να εστιάσουμε την προσοχή μας
|
||
στην αποδοχή ή απόρριψη των νέων συνδέσεων. Αν επιτραπεί μια νέα
|
||
συνεδρία, όλα τα υπόλοιπα πακέτα της θα επιτρέπονται αυτόματα, ενώ
|
||
τυχόν ψεύτικα πακέτα θα απορρίπτονται επίσης αυτόματα. Το stateful
|
||
φιλτράρισμα διαθέτει μια σειρά από προχωρημένες ικανότητες διερεύνησης
|
||
των πακέτων, με δυνατότητα να αμύνεται σε πολλές διαφορετικές
|
||
μεθόδους που χρησιμοποιούν οι επιτιθέμενοι.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<!-- XXX: This section needs a rewrite -->
|
||
|
||
<title>Παράδειγμα Συνόλου Κανόνων για ένα Inclusive Firewall</title>
|
||
|
||
<para>Το παρακάτω σύνολο κανόνων δίνεται ως παράδειγμα για
|
||
να φτιάξετε ένα ιδιαίτερα ασφαλές inclusive firewall. Ένα inclusive
|
||
firewall επιτρέπει το πέρασμα μόνο των υπηρεσιών που ταιριάζουν με
|
||
τους κανόνες που έχει για αποδοχή πακέτων, και απορρίπτει όλα τα
|
||
υπόλοιπα. Τα firewalls που προστατεύουν άλλα μηχανήματα (τα οποία
|
||
καλούνται και <quote>network firewalls</quote>) θα πρέπει να διαθέτουν
|
||
τουλάχιστον δύο διεπαφές. Η μια διεπαφή συνδέεται με το τοπικό δίκτυο
|
||
(<acronym>LAN</acronym>) το οποίο θεωρείται έμπιστο, και η άλλη με
|
||
το δημόσιο Internet. Εναλλακτικά, ένα firewall μπορεί να
|
||
προστατεύει μόνο το σύστημα στο οποίο εκτελείται—αυτό καλείται
|
||
<quote>host based firewall</quote> και είναι κατάλληλο ιδιαίτερα
|
||
για εξυπηρετητές που λειτουργούν σε μη έμπιστα δίκτυα.</para>
|
||
|
||
<para>Όλα τα συστήματα τύπου &unix;, συμπεριλαμβανομένου και του &os;,
|
||
έχουν σχεδιαστεί να χρησιμοποιούν την διεπαφή
|
||
<devicename>lo0</devicename> και την IP διεύθυνση
|
||
<hostid role="ipaddr">127.0.0.1</hostid> για εσωτερική επικοινωνία
|
||
μέσα στο ίδιο το λειτουργικό σύστημα. Το firewall πρέπει να περιέχει
|
||
κανόνες που να επιτρέπουν την ελεύθερη και χωρίς περιορισμούς κίνηση
|
||
των ειδικών αυτών εσωτερικών πακέτων.</para>
|
||
|
||
<para>Οι κανόνες που εξουσιοδοτούν την πρόσβαση προς το Internet,
|
||
ορίζονται στην διεπαφή του δικτύου που συνδέεται σε αυτό. Οι κανόνες
|
||
αυτοί ελέγχουν τόσο την εισερχόμενη όσο και την εξερχόμενη κίνηση
|
||
στο Internet. Η διεπαφή αυτή μπορεί να είναι η
|
||
<devicename>tun0</devicename> που χρησιμοποιείται στο PPP χρήστη, ή
|
||
ακόμα και η κάρτα δικτύου που συνδέεται σε ένα DSL router ή
|
||
modem.</para>
|
||
|
||
<para>Σε περίπτωση που μια ή περισσότερες κάρτες δικτύου συνδέονται σε
|
||
εσωτερικά ιδιωτικά δίκτυα πίσω από το firewall, θα πρέπει να υπάρχουν
|
||
οι αντίστοιχοι κανόνες που να επιτρέπουν την ελεύθερη διακίνηση των
|
||
πακέτων ανάμεσα στις διεπαφές αυτές ή/και στο Internet.</para>
|
||
|
||
<para>Οι κανόνες πρέπει να οργανώνονται σε τρεις κύριες ενότητες: αρχικά
|
||
όλες οι διεπαφές στις οποίες επιτρέπεται η ελεύθερη διακίνηση
|
||
δεδομένων, έπειτα η διεπαφή από την οποία εξέρχονται τα πακέτα προς
|
||
το δημόσιο δίκτυο (Internet) και τέλος η διεπαφή από την οποία
|
||
λαμβάνονται πακέτα από το Internet.</para>
|
||
|
||
<para>Σε κάθε μια από τις ενότητες των διεπαφών που
|
||
συνδέονται στο Internet, πρέπει να τοποθετούνται πρώτοι οι κανόνες
|
||
που ταιριάζουν συχνότερα με την αντίστοιχη κίνηση. Ο τελευταίος
|
||
κανόνας της ενότητας θα πρέπει να απορρίπτει και να καταγράφει όλα τα
|
||
πακέτα της συγκεκριμένης διεπαφής/κατεύθυνσης.</para>
|
||
|
||
<para>Η ενότητα των Εξερχομένων (Outbound) στο ακόλουθο σύνολο κανόνων,
|
||
περιέχει μόνο κανόνες τύπου <literal>pass</literal> οι οποίοι
|
||
επιτρέπουν (μέσω κατάλληλων τιμών στις παραμέτρους τους) σε
|
||
συγκεκριμένες υπηρεσίες να αποκτήσουν πρόσβαση στο Internet. Όλοι οι
|
||
κανόνες διαθέτουν τις επιλογές <literal>quick</literal>,
|
||
<literal>on</literal>, <literal>proto</literal>,
|
||
<literal>port</literal> και <literal>keep state</literal>. Οι κανόνες
|
||
<literal>proto tcp</literal> περιλαμβάνουν την επιλογή
|
||
<literal>flag</literal> ώστε να αναγνωρίζουν την αίτηση έναρξης της
|
||
συνεδρίας και να ενεργοποιούν τη λειτουργία διατήρησης της
|
||
κατάστασης (stateful).</para>
|
||
|
||
<para>Στην ενότητα των εισερχόμενων πακέτων (Inbound) που φαίνεται
|
||
παρακάτω, πρώτοι εμφανίζονται οι κανόνες που χρησιμοποιούνται για την
|
||
απόρριψη των ανεπιθύμητων πακέτων. Αυτό γίνεται για δύο διαφορετικούς
|
||
λόγους. Ο πρώτος είναι ότι τα κακόβουλα πακέτα μπορεί εν μέρει να
|
||
ταιριάζουν με κάποια χαρακτηριστικά της έγκυρης κίνησης. Τα πακέτα
|
||
αυτά θα πρέπει να απορριφθούν, αντί να γίνουν δεκτά από κάποιο
|
||
επόμενο κανόνα <literal>allow</literal>. Ο δεύτερος είναι ότι
|
||
μπορείτε να απορρίψετε συγκεκριμένα πακέτα τα οποία γνωρίζετε ότι δεν
|
||
είναι έγκυρα, αλλά σας είναι αδιάφορη η καταγραφή τους. Με τον τρόπο
|
||
αυτό εμποδίζεται η λήψη και καταγραφή τους από τον τελευταίο κανόνα.
|
||
Ο τελευταίος κανόνας τυπικά απορρίπτει και καταγράφει όλα τα πακέτα
|
||
που έφτασαν μέχρι αυτόν. Ο κανόνας αυτός χρησιμοποιείται για την
|
||
παροχή νομικών αποδείξεων σε περίπτωση που κινήσετε δικαστική
|
||
διαδικασία κατά ατόμων που προέβησαν σε επιθέσεις στο σύστημα
|
||
σας.</para>
|
||
|
||
<para>Θα πρέπει επίσης να εξασφαλίσετε ότι το σύστημα σας δεν θα δώσει
|
||
καμιά απάντηση σε κανένα από τα ανεπιθύμητα πακέτα. Τα πακέτα αυτά
|
||
θα πρέπει να απορριφθούν και να εξαφανιστούν. Με τον τρόπο αυτό, ο
|
||
επιτιθέμενος δεν έχει καμιά γνώση αν τα πακέτα του έφτασαν μέχρι το
|
||
σύστημα σας. Όσο λιγότερα μπορούν να μάθουν οι επιτιθέμενοι σχετικά
|
||
με το σύστημα σας, τόσο περισσότερο χρόνο θα χρειαστεί να επενδύσουν
|
||
για να καταφέρουν να σας βλάψουν στα αλήθεια. Οι κανόνες με την
|
||
επιλογή <literal>log first</literal> καταγράφουν το συμβάν μόνο την
|
||
πρώτη φορά που ενεργοποιούνται. Η επιλογή αυτή περιλαμβάνεται στον
|
||
κανόνα <literal>nmap OS fingerprint</literal> στο παράδειγμα που
|
||
φαίνεται παρακάτω. Το βοηθητικό πρόγραμμα <filename
|
||
role="package">security/nmap</filename> χρησιμοποιείται συχνά
|
||
από κακόβουλα άτομα, που προσπαθούν με αυτό τον τρόπο να
|
||
αναγνωρίσουν το λειτουργικό σύστημα του μηχανήματος σας.</para>
|
||
|
||
<para>Κάθε φορά που υπάρχει καταγραφή από κάποιο κανόνα με την επιλογή
|
||
<literal>log first</literal>, θα πρέπει να εκτελέσετε την εντολή
|
||
<command>ipfstat -hio</command> για να δείτε πόσες φορές έχει
|
||
ενεργοποιηθεί αυτός ο κανόνας συνολικά. Έτσι θα ξέρετε αν π.χ. σας
|
||
κάνουν επίθεση υπερχείλισης (flood).</para>
|
||
|
||
<para>Δείτε το αρχείο <filename>/etc/services</filename> για να βρείτε
|
||
αριθμούς θυρών που δεν αναγνωρίζετε. Μπορείτε επίσης να επισκεφθείτε
|
||
την τοποθεσία <ulink
|
||
url="http://www.securitystats.com/tools/portsearch.php"></ulink>
|
||
και να κάνετε αναζήτηση για τη συγκεκριμένη θύρα, ώστε να δείτε ποια
|
||
υπηρεσία εξυπηρετεί.</para>
|
||
|
||
<para>Δείτε την επόμενη τοποθεσία για τις θύρες που χρησιμοποιούνται
|
||
συνήθως από κακόβουλα προγράμματα (trojans): <ulink
|
||
url="http://www.simovits.com/trojans/trojans.html"></ulink>.</para>
|
||
|
||
<para>Το παρακάτω σύνολο κανόνων είναι αρκετά πλήρες και πολύ ασφαλές.
|
||
Δημιουργεί firewall τύπου <literal>inclusive</literal>, και έχει
|
||
δοκιμαστεί σε πραγματικές συνθήκες λειτουργίας. Μπορεί να
|
||
εξυπηρετήσει το ίδιο καλά και το δικό σας σύστημα. Απλώς μετατρέψτε
|
||
σε σχόλιο τους κανόνες για τις υπηρεσίες που δεν θέλετε να
|
||
ενεργοποιήσετε.</para>
|
||
|
||
<para>Για να αποφύγετε την καταγραφή ανεπιθύμητων μηνυμάτων,
|
||
απλώς προσθέστε ένα αντίστοιχο κανόνα απόρριψης
|
||
(<literal>block</literal>) στην ενότητα των εισερχομένων
|
||
(inbound).</para>
|
||
|
||
<para>Θα πρέπει να αλλάξετε το όνομα της διεπαφής
|
||
<devicename>dc0</devicename> του παραδείγματος, με το πραγματικό όνομα
|
||
της κάρτας δικτύου που συνδέει το σύστημα σας με το Internet. Για
|
||
όσους χρησιμοποιούν το PPP χρήστη, το όνομα θα είναι
|
||
<devicename>tun0</devicename>.</para>
|
||
|
||
<para>Προσθέστε τις ακόλουθες καταχωρίσεις στο αρχείο
|
||
<filename>/etc/ipf.rules</filename>:</para>
|
||
|
||
<programlisting>#################################################################
|
||
# No restrictions on Inside LAN Interface for private network
|
||
# Not needed unless you have LAN
|
||
#################################################################
|
||
|
||
#pass out quick on xl0 all
|
||
#pass in quick on xl0 all
|
||
|
||
#################################################################
|
||
# No restrictions on Loopback Interface
|
||
#################################################################
|
||
pass in quick on lo0 all
|
||
pass out quick on lo0 all
|
||
|
||
#################################################################
|
||
# Interface facing Public Internet (Outbound Section)
|
||
# Match session start requests originating from behind the
|
||
# firewall on the private network
|
||
# or from this gateway server destined for the public Internet.
|
||
#################################################################
|
||
|
||
# Allow out access to my ISP's Domain name server.
|
||
# xxx must be the IP address of your ISP's DNS.
|
||
# Dup these lines if your ISP has more than one DNS server
|
||
# Get the IP addresses from /etc/resolv.conf file
|
||
pass out quick on dc0 proto tcp from any to xxx port = 53 flags S keep state
|
||
pass out quick on dc0 proto udp from any to xxx port = 53 keep state
|
||
|
||
# Allow out access to my ISP's DHCP server for cable or DSL networks.
|
||
# This rule is not needed for 'user ppp' type connection to the
|
||
# public Internet, so you can delete this whole group.
|
||
# Use the following rule and check log for IP address.
|
||
# Then put IP address in commented out rule & delete first rule
|
||
pass out log quick on dc0 proto udp from any to any port = 67 keep state
|
||
#pass out quick on dc0 proto udp from any to z.z.z.z port = 67 keep state
|
||
|
||
|
||
# Allow out non-secure standard www function
|
||
pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state
|
||
|
||
# Allow out secure www function https over TLS SSL
|
||
pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state
|
||
|
||
# Allow out send & get email function
|
||
pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state
|
||
pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state
|
||
|
||
# Allow out Time
|
||
pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state
|
||
|
||
# Allow out nntp news
|
||
pass out quick on dc0 proto tcp from any to any port = 119 flags S keep state
|
||
|
||
# Allow out gateway & LAN users' non-secure FTP ( both passive & active modes)
|
||
# This function uses the IP<acronym>NAT</acronym> built in FTP proxy function coded in
|
||
# the nat rules file to make this single rule function correctly.
|
||
# If you want to use the pkg_add command to install application packages
|
||
# on your gateway system you need this rule.
|
||
pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state
|
||
|
||
# Allow out ssh/sftp/scp (telnet/rlogin/FTP replacements)
|
||
# This function is using SSH (secure shell)
|
||
pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state
|
||
|
||
# Allow out insecure Telnet
|
||
pass out quick on dc0 proto tcp from any to any port = 23 flags S keep state
|
||
|
||
# Allow out FreeBSD CVSup function
|
||
pass out quick on dc0 proto tcp from any to any port = 5999 flags S keep state
|
||
|
||
# Allow out ping to public Internet
|
||
pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state
|
||
|
||
# Allow out whois from LAN to public Internet
|
||
pass out quick on dc0 proto tcp from any to any port = 43 flags S keep state
|
||
|
||
# Block and log only the first occurrence of everything
|
||
# else that's trying to get out.
|
||
# This rule implements the default block
|
||
block out log first quick on dc0 all
|
||
|
||
#################################################################
|
||
# Interface facing Public Internet (Inbound Section)
|
||
# Match packets originating from the public Internet
|
||
# destined for this gateway server or the private network.
|
||
#################################################################
|
||
|
||
# Block all inbound traffic from non-routable or reserved address spaces
|
||
block in quick on dc0 from 192.168.0.0/16 to any #RFC 1918 private IP
|
||
block in quick on dc0 from 172.16.0.0/12 to any #RFC 1918 private IP
|
||
block in quick on dc0 from 10.0.0.0/8 to any #RFC 1918 private IP
|
||
block in quick on dc0 from 127.0.0.0/8 to any #loopback
|
||
block in quick on dc0 from 0.0.0.0/8 to any #loopback
|
||
block in quick on dc0 from 169.254.0.0/16 to any #DHCP auto-config
|
||
block in quick on dc0 from 192.0.2.0/24 to any #reserved for docs
|
||
block in quick on dc0 from 204.152.64.0/23 to any #Sun cluster interconnect
|
||
block in quick on dc0 from 224.0.0.0/3 to any #Class D & E multicast
|
||
|
||
##### Block a bunch of different nasty things. ############
|
||
# That I do not want to see in the log
|
||
|
||
# Block frags
|
||
block in quick on dc0 all with frags
|
||
|
||
# Block short tcp packets
|
||
block in quick on dc0 proto tcp all with short
|
||
|
||
# block source routed packets
|
||
block in quick on dc0 all with opt lsrr
|
||
block in quick on dc0 all with opt ssrr
|
||
|
||
# Block nmap OS fingerprint attempts
|
||
# Log first occurrence of these so I can get their IP address
|
||
block in log first quick on dc0 proto tcp from any to any flags FUP
|
||
|
||
# Block anything with special options
|
||
block in quick on dc0 all with ipopts
|
||
|
||
# Block public pings
|
||
block in quick on dc0 proto icmp all icmp-type 8
|
||
|
||
# Block ident
|
||
block in quick on dc0 proto tcp from any to any port = 113
|
||
|
||
# Block all Netbios service. 137=name, 138=datagram, 139=session
|
||
# Netbios is MS/Windows sharing services.
|
||
# Block MS/Windows hosts2 name server requests 81
|
||
block in log first quick on dc0 proto tcp/udp from any to any port = 137
|
||
block in log first quick on dc0 proto tcp/udp from any to any port = 138
|
||
block in log first quick on dc0 proto tcp/udp from any to any port = 139
|
||
block in log first quick on dc0 proto tcp/udp from any to any port = 81
|
||
|
||
# Allow traffic in from ISP's DHCP server. This rule must contain
|
||
# the IP address of your ISP's DHCP server as it's the only
|
||
# authorized source to send this packet type. Only necessary for
|
||
# cable or DSL configurations. This rule is not needed for
|
||
# 'user ppp' type connection to the public Internet.
|
||
# This is the same IP address you captured and
|
||
# used in the outbound section.
|
||
pass in quick on dc0 proto udp from z.z.z.z to any port = 68 keep state
|
||
|
||
# Allow in standard www function because I have apache server
|
||
pass in quick on dc0 proto tcp from any to any port = 80 flags S keep state
|
||
|
||
# Allow in non-secure Telnet session from public Internet
|
||
# labeled non-secure because ID/PW passed over public Internet as clear text.
|
||
# Delete this sample group if you do not have telnet server enabled.
|
||
#pass in quick on dc0 proto tcp from any to any port = 23 flags S keep state
|
||
|
||
# Allow in secure FTP, Telnet, and SCP from public Internet
|
||
# This function is using SSH (secure shell)
|
||
pass in quick on dc0 proto tcp from any to any port = 22 flags S keep state
|
||
|
||
# Block and log only first occurrence of all remaining traffic
|
||
# coming into the firewall. The logging of only the first
|
||
# occurrence avoids filling up disk with Denial of Service logs.
|
||
# This rule implements the default block.
|
||
block in log first quick on dc0 all
|
||
################### End of rules file #####################################</programlisting>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title><acronym>NAT</acronym></title>
|
||
<indexterm><primary>NAT</primary></indexterm>
|
||
|
||
<indexterm>
|
||
<primary>IP masquerading</primary>
|
||
<see>NAT</see>
|
||
</indexterm>
|
||
|
||
<indexterm>
|
||
<primary>network address translation</primary>
|
||
<see>NAT</see>
|
||
</indexterm>
|
||
|
||
<para>Το <acronym>NAT</acronym> είναι ακρωνύμιο των λέξεων
|
||
<emphasis>Network Address Translation</emphasis> ή Μετάφραση
|
||
Διευθύνσεων Δικτύου. Για όσους είναι εξοικειωμένοι με το &linux;,
|
||
βασίζεται στην αρχή του IP Masquerading. Στην πραγματικότητα το
|
||
<acronym>NAT</acronym> και το IP Masquerading είναι το ίδιο πράγμα.
|
||
Μια από τις πολλές δυνατότητες που παρέχει η λειτουργία
|
||
<acronym>NAT</acronym> του IPF, είναι και η δυνατότητα να έχουμε ένα
|
||
ιδιωτικό τοπικό δίκτυο (LAN) πίσω από το firewall το οποίο να
|
||
μοιράζεται μια μοναδική δημόσια διεύθυνση IP στο Internet.</para>
|
||
|
||
<para>Ίσως να αναρωτηθείτε γιατί να θέλει κάποιος να το κάνει αυτό.
|
||
Οι ISPs συνήθως αποδίδουν δυναμικές διευθύνσεις σε μη εταιρικούς
|
||
πελάτες. Αυτό ουσιαστικά σημαίνει ότι η διεύθυνση IP που
|
||
αποδίδεται στο μηχάνημα σας, μπορεί να είναι διαφορετική κάθε φορά
|
||
που κάνετε κλήση για να συνδεθείτε. Για τους χρήστες DSL modem και
|
||
router, η αλλαγή διεύθυνσης πραγματοποιείται κάθε φορά που
|
||
ενεργοποιείται το modem. Η διεύθυνση IP που σας αποδίδεται από
|
||
τον ISP σας, είναι αυτή με την οποία φαίνεστε στο Internet.</para>
|
||
|
||
<para>Ας υποθέσουμε τώρα ότι έχετε πέντε PC στο σπίτι σας, και
|
||
χρειάζεστε σε όλα σύνδεση Internet. Κανονικά, θα έπρεπε να πληρώσετε
|
||
τον ISP σας χωριστό λογαριασμό για κάθε PC και να διαθέτετε πέντε
|
||
γραμμές τηλεφώνου.</para>
|
||
|
||
<para>Με το <acronym>NAT</acronym>, χρειάζεστε μόνο ένα λογαριασμό με
|
||
τον ISP σας. Μπορείτε απλώς να συνδέσετε τα τέσσερα PC σε ένα
|
||
διανομέα ή switch στο οποίο θα συνδέσετε επίσης και το &os; μηχάνημα
|
||
σας. Το μηχάνημα αυτό θα ενεργεί ως πύλη του τοπικού σας δικτύου για
|
||
το Internet. Το <acronym>NAT</acronym> θα μεταφράσει αυτόματα τις
|
||
ιδιωτικές διευθύνσεις IP του κάθε μηχανήματος στην μοναδική δημόσια
|
||
IP διεύθυνση που έχετε, καθώς το πακέτο φεύγει από το firewall και
|
||
κατευθύνεται προς το Internet. Εκτελεί επίσης και την αντίστροφη
|
||
μετάφραση για τα πακέτα που επιστρέφουν.</para>
|
||
|
||
<para>Υπάρχει μια ειδική περιοχή διευθύνσεων IP που έχουν παραχωρηθεί
|
||
για χρήση σε τοπικά δίκτυα με <acronym>NAT</acronym>. Σύμφωνα με το
|
||
RFC 1918, μπορείτε να χρησιμοποιήσετε για αυτό το σκοπό τις παρακάτω
|
||
περιοχές, οι οποίες δεν δρομολογούνται ποτέ απευθείας στο δημόσιο
|
||
Internet:</para>
|
||
|
||
<informaltable frame="none" pgwide="1">
|
||
<tgroup cols="2">
|
||
<colspec colwidth="1*"/>
|
||
|
||
<colspec colwidth="1*"/>
|
||
|
||
<colspec colwidth="1*"/>
|
||
|
||
<tbody>
|
||
<row>
|
||
<entry>Αρχικό IP <hostid role="ipaddr">10.0.0.0</hostid></entry>
|
||
|
||
<entry>-</entry>
|
||
|
||
<entry>Τελικό IP <hostid role="ipaddr">10.255.255.255</hostid></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>Αρχικό IP <hostid role="ipaddr">172.16.0.0</hostid></entry>
|
||
|
||
<entry>-</entry>
|
||
|
||
<entry>Τελικό IP <hostid role="ipaddr">172.31.255.255</hostid></entry>
|
||
</row>
|
||
|
||
<row>
|
||
<entry>Αρχικό IP <hostid role="ipaddr">192.168.0.0</hostid></entry>
|
||
|
||
<entry>-</entry>
|
||
|
||
<entry>Τελικό IP <hostid role="ipaddr">192.168.255.255</hostid></entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>IP<acronym>NAT</acronym></title>
|
||
|
||
<indexterm>
|
||
<primary>NAT</primary>
|
||
<secondary>and IPFILTER</secondary>
|
||
</indexterm>
|
||
|
||
<indexterm><primary><command>ipnat</command></primary></indexterm>
|
||
|
||
<para>Οι κανόνες του <acronym>NAT</acronym> φορτώνονται με τη χρήση της
|
||
εντολής <command>ipnat</command>. Τυπικά, οι κανόνες του
|
||
<acronym>NAT</acronym> αποθηκεύονται στο αρχείο
|
||
<filename>/etc/ipnat.rules</filename>. Δείτε τη σελίδα manual του
|
||
&man.ipnat.1; για λεπτομέρειες.</para>
|
||
|
||
<para>Για να αλλάξετε τους κανόνες του <acronym>NAT</acronym> καθώς αυτό
|
||
εκτελείται, τροποποιήστε το αρχείο που τους περιέχει, και εκτελέστε
|
||
την εντολή <command>ipnat</command> με την παράμετρο
|
||
<option>-CF</option> για να διαγράψετε τους εσωτερικούς κανόνες του
|
||
<acronym>NAT</acronym> και να αδειάσετε όλες τις ενεργές καταχωρίσεις
|
||
του πίνακα μεταφράσεων.</para>
|
||
|
||
<para>Για να φορτώσετε τους κανόνες του <acronym>NAT</acronym> από την
|
||
αρχή, εκτελέστε μια εντολή όπως την παρακάτω:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipnat -CF -f /etc/ipnat.rules</userinput></screen>
|
||
|
||
<para>Για να δείτε κάποια στατιστικά σχετικά με το
|
||
<acronym>NAT</acronym>, χρησιμοποιήστε την παρακάτω εντολή:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipnat -s</userinput></screen>
|
||
|
||
<para>Για να δείτε μια λίστα με τις τρέχουσες καταχωρίσεις του πίνακα
|
||
<acronym>NAT</acronym>, χρησιμοποιήστε την παρακάτω εντολή:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipnat -l</userinput></screen>
|
||
|
||
<para>Για να ενεργοποιήσετε την λεπτομερή απεικόνιση μηνυμάτων και να
|
||
δείτε πληροφορίες που σχετίζονται με την επεξεργασία των κανόνων και
|
||
τους ενεργούς κανόνες και καταχωρίσεις στον πίνακα, γράψτε:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipnat -v</userinput></screen>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Κανόνες του IP<acronym>NAT</acronym></title>
|
||
|
||
<para>Οι κανόνες του <acronym>NAT</acronym> είναι αρκετά ευέλικτοι,
|
||
και διαθέτουν πλήθος δυνατοτήτων ώστε να καλύπτουν τις ανάγκες
|
||
των οικιακών αλλά και των επιχειρησιακών χρηστών.</para>
|
||
|
||
<para>Η σύνταξη των κανόνων που παρουσιάζεται εδώ, έχει απλοποιηθεί
|
||
ώστε να συμβαδίζει με τη συνήθη χρήση σε μη-εμπορικά περιβάλλοντα.
|
||
Για πιο πλήρη περιγραφή της σύνταξης, δείτε τη σελίδα manual του
|
||
&man.ipnat.5;.</para>
|
||
|
||
<para>Η σύνταξη ενός κανόνα <acronym>NAT</acronym> μοιάζει με την
|
||
παρακάτω:</para>
|
||
|
||
<programlisting>map <replaceable>IF</replaceable> <replaceable>LAN_IP_RANGE</replaceable> -> <replaceable>PUBLIC_ADDRESS</replaceable></programlisting>
|
||
|
||
<para>Ο κανόνας ξεκινάει με τη λέξη <literal>map</literal>.</para>
|
||
|
||
<para>Αντικαταστήστε το <replaceable>IF</replaceable> με την εξωτερική
|
||
διεπαφή (τη κάρτα δικτύου που συνδέεται στο Internet).</para>
|
||
|
||
<para>Η παράμετρος <replaceable>LAN_IP_RANGE</replaceable> είναι η
|
||
περιοχή διευθύνσεων που χρησιμοποιείται από το εσωτερικό σας δίκτυο.
|
||
Στην πραγματικότητα θα μοιάζει με κάτι σαν το <hostid
|
||
role="ipaddr">192.168.1.0/24</hostid>.</para>
|
||
|
||
<para>Η παράμετρος <replaceable>PUBLIC_ADDRESS</replaceable> μπορεί να
|
||
είναι είτε η εξωτερική IP διεύθυνση, είτε η ειδική λέξη
|
||
<literal>0/32</literal>, η οποία σημαίνει ότι θα χρησιμοποιηθεί η
|
||
IP διεύθυνση που έχει αποδοθεί στο
|
||
<replaceable>IF</replaceable>.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Πως Λειτουργεί το <acronym>NAT</acronym></title>
|
||
|
||
<para>Ένα πακέτο φτάνει στο firewall από το LAN με προορισμό το
|
||
Internet. Περνάει διαμέσου των κανόνων φιλτραρίσματος εξερχομένων,
|
||
όπου γίνεται η επεξεργασία του από το <acronym>NAT</acronym>.
|
||
Οι κανόνες εφαρμόζονται από τον πρώτο και προς τα κάτω, και κερδίζει
|
||
ο πρώτος που ταιριάζει. Ο έλεγχος γίνεται με βάση τη διεπαφή από την
|
||
οποία λήφθηκε το πακέτο και τη διεύθυνση IP από την οποία προέρχεται.
|
||
Όταν το όνομα της διεπαφής ενός πακέτου ταιριάζει με κάποιο κανόνα του
|
||
<acronym>NAT</acronym>, η διεύθυνση IP της αφετηρίας (που προέρχεται
|
||
από το ιδιωτικό δίκτυο) ελέγχεται για να εξακριβωθεί αν ταιριάζει με
|
||
την περιοχή διευθύνσεων που καθορίζεται στην αριστερά πλευρά του
|
||
συμβόλου (βέλος) του κανόνα <acronym>NAT</acronym>. Αν ταιριάζει, η
|
||
διεύθυνση του πακέτου ξαναγράφεται, χρησιμοποιώντας τη δημόσια
|
||
διεύθυνση IP η οποία παρέχεται από το <literal>0/32</literal>. Το
|
||
<acronym>NAT</acronym> δημιουργεί μια καταχώριση στον εσωτερικό του
|
||
πίνακα, έτσι ώστε όταν επιστρέψει η απάντηση από το Internet, να
|
||
μπορεί να αντιστοιχηθεί ξανά στην αρχική ιδιωτική διεύθυνση IP και να
|
||
περάσει έπειτα από τους κανόνες του φίλτρου για περαιτέρω
|
||
επεξεργασία.</para>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Ενεργοποιώντας το IP<acronym>NAT</acronym></title>
|
||
|
||
<para>Για να ενεργοποιήσετε το IP<acronym>NAT</acronym>, προσθέστε τις
|
||
παρακάτω γραμμές στο <filename>/etc/rc.conf</filename>.</para>
|
||
|
||
<para>Για να επιτρέψετε στο μηχάνημα σας να δρομολογεί πακέτα μεταξύ
|
||
διεπαφών δικτύου:</para>
|
||
|
||
<programlisting>gateway_enable="YES"</programlisting>
|
||
|
||
<para>Για να ξεκινάει αυτόματα το IP<acronym>NAT</acronym> σε κάθε
|
||
εκκίνηση:</para>
|
||
|
||
<programlisting>ipnat_enable="YES"</programlisting>
|
||
|
||
<para>Για να καθορίσετε από που επιθυμείτε να φορτώνονται οι κανόνες
|
||
του IP<acronym>NAT</acronym>:</para>
|
||
|
||
<programlisting>ipnat_rules="/etc/ipnat.rules"</programlisting>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Το <acronym>NAT</acronym> σε Ένα Μεγάλο Τοπικό Δίκτυο</title>
|
||
|
||
<para>Για τοπικά δίκτυα με μεγάλο αριθμό υπολογιστών, ή για δίκτυα που
|
||
διασυνδέουν περισσότερα από ένα LAN, η διαδικασία της μετατροπής όλων
|
||
αυτών των ιδιωτικών διευθύνσεων σε μια μοναδική δημόσια διεύθυνση,
|
||
δημιουργεί πρόβλημα κατανομής πόρων, καθώς χρησιμοποιούνται πολλές
|
||
φορές οι ίδιοι αριθμοί θυρών, οδηγώντας τα PC του δικτύου σε
|
||
συγκρούσεις. Υπάρχουν δύο τρόποι για να ελαττώσουμε αυτό το
|
||
πρόβλημα.</para>
|
||
|
||
<sect3>
|
||
<title>Ανάθεση των θυρών που θα Χρησιμοποιηθούν</title>
|
||
|
||
<!-- What does it mean ? Is there something missing ?-->
|
||
<!-- XXXBLAH <- Apparently you can't start a sect
|
||
with a <programlisting> tag ?-->
|
||
|
||
<para>Ένα συνηθισμένος κανόνας NAT μοιάζει με τον παρακάτω:</para>
|
||
|
||
<programlisting>map dc0 192.168.1.0/24 -> 0/32</programlisting>
|
||
|
||
<para>Στον παραπάνω κανόνα, η θύρα αφετηρίας του πακέτου παραμένει
|
||
αναλλοίωτη καθώς το πακέτο διέρχεται μέσω του
|
||
IP<acronym>NAT</acronym>. Αν προσθέσετε την λέξη-κλειδί
|
||
<literal>portmap</literal>, μπορείτε να ρυθμίσετε το
|
||
IP<acronym>NAT</acronym> να χρησιμοποιεί θύρες που ανήκουν σε μια
|
||
καθορισμένη περιοχή. Για παράδειγμα, ο παρακάτω κανόνας θα
|
||
οδηγήσει το <acronym>NAT</acronym> να τροποποιήσει την θύρα της
|
||
αφετηρίας, ώστε να είναι μέσα στην περιοχή που φαίνεται:</para>
|
||
|
||
<programlisting>map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:60000</programlisting>
|
||
|
||
<para>Μπορούμε επίσης να απλοποιήσουμε ακόμα περισσότερο τη
|
||
διαδικασία χρησιμοποιώντας τη λέξη <literal>auto</literal> ώστε το
|
||
IP<acronym>NAT</acronym> να καθορίζει από μόνο του ποιες θύρες είναι
|
||
διαθέσιμες για χρήση:</para>
|
||
|
||
<programlisting>map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto</programlisting>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>Χρησιμοποιώντας ένα Απόθεμα Δυναμικών Διευθύνσεων</title>
|
||
|
||
<para>Σε ένα πολύ μεγάλο τοπικό δίκτυο, αργά ή γρήγορα φτάνουμε στο
|
||
σημείο που μια μοναδική δημόσια διεύθυνση δεν επαρκεί για να καλύψει
|
||
τόσες πολλές ιδιωτικές. Αν υπάρχει διαθέσιμο ένα εύρος δημοσίων
|
||
διευθύνσεων, μπορούν να χρησιμοποιηθούν ως
|
||
<quote>απόθεμα (pool)</quote>, επιτρέποντας στην
|
||
IP<acronym>NAT</acronym> να επιλέξει μια από αυτές καθώς αντιστοιχεί
|
||
τα πακέτα κατά την έξοδο τους προς το δημόσιο δίκτυο.</para>
|
||
|
||
<para>Για παράδειγμα, αντί να αντιστοιχούν όλα τα πακέτα μέσω μιας
|
||
μοναδικής δημόσιας IP διεύθυνσης όπως παρακάτω:</para>
|
||
|
||
<programlisting>map dc0 192.168.1.0/24 -> 204.134.75.1</programlisting>
|
||
|
||
<para>μπορούμε να χρησιμοποιήσουμε ένα εύρος IP διευθύνσεων, είτε με
|
||
τη χρήση μάσκας δικτύου:</para>
|
||
|
||
<programlisting>map dc0 192.168.1.0/24 -> 204.134.75.0/255.255.255.0</programlisting>
|
||
|
||
<para>είτε με συμβολισμό CIDR:</para>
|
||
|
||
<programlisting>map dc0 192.168.1.0/24 -> 204.134.75.0/24</programlisting>
|
||
</sect3>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>Ανακατεύθυνση Θυρών</title>
|
||
|
||
<para>Είναι κοινή πρακτική να εγκαθίστανται υπηρεσίες όπως ο
|
||
εξυπηρετητής ιστοσελίδων, ταχυδρομείου, βάσης δεδομένων και DNS σε
|
||
διαφορετικά PC στο τοπικό δίκτυο. Στην περίπτωση αυτή, η κίνηση
|
||
πακέτων από αυτά τα μηχανήματα εξακολουθεί να χρειάζεται το
|
||
<acronym>NAT</acronym>, αλλά χρειάζεται επίσης να υπάρχει κάποιος
|
||
τρόπος να κατευθύνεται η εισερχόμενη κίνηση στα σωστά PC του δικτύου.
|
||
Το IP<acronym>NAT</acronym> έχει τις κατάλληλες δυνατότητες για την
|
||
επίλυση αυτού του προβλήματος. Για παράδειγμα, έστω ότι ένας
|
||
εξυπηρετητής ιστοσελίδων βρίσκεται στην διεύθυνση LAN <hostid
|
||
role="ipaddr">10.0.10.25</hostid> και η μοναδική δημόσια IP
|
||
είναι <hostid role="ipaddr">20.20.20.5</hostid>. Ο κανόνας που θα
|
||
γράφατε θα έμοιαζε με τον παρακάτω:</para>
|
||
|
||
<programlisting>rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80</programlisting>
|
||
|
||
<para>ή:</para>
|
||
|
||
<programlisting>rdr dc0 0.0.0.0/0 port 80 -> 10.0.10.25 port 80</programlisting>
|
||
|
||
<para>ή για ένα εξυπηρετητή DNS με διεύθυνση στο τοπικό δίκτυο <hostid
|
||
role="ipaddr">10.0.10.33</hostid> ο οποίος πρέπει να δέχεται
|
||
αναζητήσεις από το δημόσιο δίκτυο:</para>
|
||
|
||
<programlisting>rdr dc0 20.20.20.5/32 port 53 -> 10.0.10.33 port 53 udp</programlisting>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>FTP και <acronym>NAT</acronym></title>
|
||
|
||
<para>Το FTP είναι ένας δεινόσαυρος που έχει απομείνει από την εποχή
|
||
που το Internet ήταν στα αρχικά του στάδια, όπου τα ερευνητικά
|
||
εργαστήρια των πανεπιστήμιων ήταν συνδεμένα μεταξύ τους με
|
||
μισθωμένες γραμμές και οι ερευνητές το χρησιμοποιούσαν για να
|
||
στέλνουν αρχεία ο ένας στον άλλο. Την εποχή εκείνη, δεν υπήρχαν
|
||
ανησυχίες σχετικά με την ασφάλεια. Με το πέρασμα του χρόνου, το
|
||
FTP θάφτηκε στο πίσω μέρος του ταχέως εξελισσόμενου Internet. Δεν
|
||
εξελίχθηκε ποτέ ώστε να ξεπεράσει προβλήματα ασφάλειας, όπως π.χ. το
|
||
γεγονός ότι στέλνει το όνομα και τον κωδικό του χρήστη ως απλό
|
||
κείμενο. Το FTP έχει δυο καταστάσεις λειτουργίας, την ενεργή και την
|
||
παθητική. Η διαφορά είναι στο πως γίνεται η ανάκτηση του καναλιού
|
||
δεδομένων. Η παθητική λειτουργία είναι πιο ασφαλής, καθώς το
|
||
κανάλι δεδομένων αποτελεί το κύριο κανάλι της συνεδρίας. Μπορείτε να
|
||
βρείτε πολύ καλή περιγραφή του πρωτοκόλλου και των διαφορετικών τρόπων
|
||
λειτουργίας του, στο <ulink
|
||
url="http://www.slacksite.com/other/ftp.html"></ulink>.</para>
|
||
|
||
<sect3>
|
||
<title>Κανόνες του IP<acronym>NAT</acronym></title>
|
||
|
||
<para>Το IP<acronym>NAT</acronym> διαθέτει μια ειδική επιλογή για
|
||
διαμεσολάβηση FTP (proxy) η οποία μπορεί να καθοριστεί στον
|
||
κατάλληλο κανόνα του <acronym>NAT</acronym>. Μπορεί να
|
||
παρακολουθήσει όλα τα εξερχόμενα πακέτα για να ανιχνεύσει την
|
||
έναρξη μιας ενεργής ή παθητικής συνεδρίας FTP, και να δημιουργήσει
|
||
δυναμικά προσωρινούς κανόνες στο φίλτρο που να περιέχουν μόνο τον
|
||
αριθμό της θύρας που χρησιμοποιείται από το κανάλι δεδομένων. Αυτό
|
||
εξαλείφει το πρόβλημα ασφάλειας που δημιουργείται από το γεγονός
|
||
ότι διαφορετικά θα χρειαζόταν να ανοιχθεί μια μεγάλη περιοχή θυρών
|
||
(στην υψηλή περιοχή) στο firewall.</para>
|
||
|
||
<para>Ο παρακάτω κανόνας χειρίζεται όλα τα δεδομένα για το εσωτερικό
|
||
δίκτυο (LAN):</para>
|
||
|
||
<programlisting>map dc0 10.0.10.0/29 -> 0/32 proxy port 21 ftp/tcp</programlisting>
|
||
|
||
<para>Ο παρακάτω κανόνας χειρίζεται την κίνηση FTP από την
|
||
πύλη (gateway):</para>
|
||
|
||
<programlisting>map dc0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp</programlisting>
|
||
|
||
<para>Ο παρακάτω κανόνας χειρίζεται όλη την κίνηση από το εσωτερικό
|
||
LAN που δεν ανήκει στο πρωτόκολλο FTP:</para>
|
||
|
||
<programlisting>map dc0 10.0.10.0/29 -> 0/32</programlisting>
|
||
|
||
<para>Ο κανόνας χαρτογράφησης του FTP τοποθετείται πριν από τον
|
||
κανονικό κανόνα χαρτογράφησης. Κάθε πακέτο ελέγχεται αρχικά από
|
||
τον κανόνα που βρίσκεται στην κορυφή. Αν ταιριάζει στη διεπαφή και
|
||
στην ιδιωτική διεύθυνση IP και πρόκειται για πακέτο FTP,
|
||
ο διαμεσολαβητής FTP δημιουργεί προσωρινούς κανόνες στο φίλτρο
|
||
οι οποίοι επιτρέπουν την εισερχόμενη και εξερχόμενη κίνηση FTP ενώ
|
||
ταυτόχρονα εκτελούν και την απαραίτητη μετάφραση
|
||
<acronym>NAT</acronym>. Όλα τα πακέτα που δεν ανήκουν σε μετάδοση
|
||
FTP δεν ταιριάζουν με τον πρώτο κανόνα, έτσι κατευθύνονται στον
|
||
τρίτο κανόνα, εξετάζονται όσο αφορά τη διεπαφή και το IP από το
|
||
οποίο προέρχονται, και γίνεται η αντίστοιχη μετάφραση τους από το
|
||
<acronym>NAT</acronym>.</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>Κανόνες Φίλτρου για το IP<acronym>NAT</acronym></title>
|
||
|
||
<para>Όταν χρησιμοποιείται ο μεσολαβητής FTP, χρειάζεται μόνο ένας
|
||
κανόνας για το <acronym>NAT</acronym>.</para>
|
||
|
||
<para>Χωρίς το μεσολαβητή FTP, χρειάζονται οι παρακάτω τρεις
|
||
κανόνες:</para>
|
||
|
||
<programlisting># Allow out LAN PC client FTP to public Internet
|
||
# Active and passive modes
|
||
pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state
|
||
|
||
# Allow out passive mode data channel high order port numbers
|
||
pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state
|
||
|
||
# Active mode let data channel in from FTP server
|
||
pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state</programlisting>
|
||
</sect3>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 id="firewalls-ipfw">
|
||
<title>IPFW</title>
|
||
|
||
<indexterm>
|
||
<primary>firewall</primary>
|
||
<secondary>IPFW</secondary>
|
||
</indexterm>
|
||
|
||
<para>Το IPFIREWALL (<acronym>IPFW</acronym>) είναι λογισμικό που
|
||
αναπτύχθηκε για το &os;. Έχει γραφεί και συντηρείται από εθελοντές που
|
||
ανήκουν στο Project. Χρησιμοποιεί τους κλασικούς κανόνες χωρίς
|
||
διατήρηση της κατάστασης (stateless) καθώς και μια τεχνική
|
||
κωδικοποίησης που επιτυγχάνει αυτό που αναφέρεται ως Απλή Stateful
|
||
Λογική (Simple Stateful Logic).</para>
|
||
|
||
<para>Το υπόδειγμα κανόνων για το IPFW (στα αρχεία
|
||
<filename>/etc/rc.firewall</filename> και
|
||
<filename>/etc/rc.firewall6</filename>) της τυπικής εγκατάστασης του
|
||
&os; είναι μάλλον απλό και θα χρειαστεί να κάνετε κάποιες αλλαγές
|
||
πριν το χρησιμοποιήσετε. Το παράδειγμα δεν χρησιμοποιεί φιλτράρισμα
|
||
τύπου stateful. Η stateful λειτουργία είναι ευεργετική στις
|
||
περισσότερες περιπτώσεις, έτσι δεν θα χρησιμοποιήσουμε αυτό το
|
||
παράδειγμα ως βάση αυτής της ενότητας.</para>
|
||
|
||
<para>Η σύνταξη των κανόνων stateless του IPFW έχει ενισχυθεί με
|
||
εξελιγμένες δυνατότητες επιλογής οι οποίες συνήθως ξεπερνάνε κατά πολύ
|
||
τις τυπικές γνώσεις του ατόμου που καλείται να το ρυθμίσει. Το IPFW
|
||
απευθύνεται στον επαγγελματία χρήστη ή τον τεχνικά προχωρημένο χομπίστα,
|
||
ο οποίος έχει ανάγκη προχωρημένου φιλτραρίσματος πακέτων. Η πραγματική
|
||
δύναμη των κανόνων του IPFW αποκαλύπτεται μόνο αν διαθέτετε προχωρημένες
|
||
γνώσεις σχετικά με το πως διαφορετικά πρωτόκολλα δημιουργούν και
|
||
χρησιμοποιούν την επικεφαλίδα των πακέτων τους. Τέτοιο επίπεδο
|
||
επεξηγήσεων είναι πέρα από το σκοπό αυτής της ενότητας του
|
||
Εγχειριδίου.</para>
|
||
|
||
<para>Το IPFW αποτελείται από επτά εξαρτήματα. Το βασικό εξάρτημα είναι
|
||
ο επεξεργαστής κανόνων του firewall στον πυρήνα, με ενσωματωμένη τη
|
||
δυνατότητα καταγραφής. Τα υπόλοιπα εξαρτήματα είναι το σύστημα
|
||
καταγραφής (logging), ο κανόνας <literal>divert</literal> ο οποίος
|
||
ενεργοποιεί τη λειτουργία <acronym>NAT</acronym>, καθώς και οι
|
||
προχωρημένες δυνατότητες ειδικού σκοπού: το σύστημα διαμόρφωσης κίνησης
|
||
(traffic shaper) dummynet, η δυνατότητα προώθησης μέσω του
|
||
<literal>fwd rule</literal>, η δυνατότητα γεφύρωσης (bridge) καθώς και
|
||
η δυνατότητα απόκρυψης (ipstealth). To IPFW υποστηρίζει τόσο το
|
||
πρωτόκολλο IPv4 όσο και το IPv6.</para>
|
||
|
||
<sect2 id="firewalls-ipfw-enable">
|
||
<title>Ενεργοποιώντας το IPFW</title>
|
||
|
||
<indexterm>
|
||
<primary>IPFW</primary>
|
||
<secondary>enabling</secondary>
|
||
</indexterm>
|
||
|
||
<para>Το IPFW περιλαμβάνεται στην βασική εγκατάσταση του &os; ως άρθρωμα
|
||
του πυρήνα το οποίο μπορεί να φορτωθεί δυναμικά. Το σύστημα θα
|
||
φορτώσει δυναμικά το άρθρωμα όταν βρει την καταχώριση
|
||
<literal>firewall_enable="YES"</literal> στο αρχείο
|
||
<filename>/etc/rc.conf</filename>. Δεν χρειάζεται να μεταγλωττίσετε
|
||
το IPFW μέσα στον πυρήνα.</para>
|
||
|
||
<para>Αφού επανεκκινήσετε το σύστημα σας με την καταχώριση
|
||
<literal>firewall_enable="YES"</literal> στο
|
||
<filename>rc.conf</filename>, θα δείτε με άσπρα έντονα γράμματα το
|
||
ακόλουθο μήνυμα κατά τη διαδικασία της εκκίνησης:</para>
|
||
|
||
<screen>ipfw2 initialized, divert disabled, rule-based forwarding disabled, default to deny, logging disabled</screen>
|
||
|
||
<para>Το άρθρωμα έχει ενσωματωμένη τη δυνατότητα καταγραφής. Για να
|
||
ενεργοποιήσετε την καταγραφή και να θέσετε το επίπεδο λεπτομέρειας,
|
||
υπάρχουν κάποιες ρυθμίσεις που μπορείτε να θέσετε στο
|
||
<filename>/etc/sysctl.conf</filename>. Προσθέτοντας τις παρακάτω
|
||
καταχωρίσεις, θα ενεργοποιηθεί η καταγραφή στις επόμενες
|
||
εκκινήσεις:</para>
|
||
|
||
<programlisting>net.inet.ip.fw.verbose=1
|
||
net.inet.ip.fw.verbose_limit=5</programlisting>
|
||
</sect2>
|
||
|
||
<sect2 id="firewalls-ipfw-kernel">
|
||
<title>Επιλογές του Πυρήνα</title>
|
||
|
||
<indexterm>
|
||
<primary>kernel options</primary>
|
||
<secondary>IPFIREWALL</secondary>
|
||
</indexterm>
|
||
|
||
<indexterm>
|
||
<primary>kernel options</primary>
|
||
<secondary>IPFIREWALL_VERBOSE</secondary>
|
||
</indexterm>
|
||
|
||
<indexterm>
|
||
<primary>kernel options</primary>
|
||
<secondary>IPFIREWALL_VERBOSE_LIMIT</secondary>
|
||
</indexterm>
|
||
|
||
<indexterm>
|
||
<primary>IPFW</primary>
|
||
<secondary>kernel options</secondary>
|
||
</indexterm>
|
||
|
||
<para>Δεν είναι υποχρεωτικό να ενεργοποιήσετε το IPFW μεταγλωττίζοντας
|
||
τις παρακάτω επιλογές στον πυρήνα του &os;. Ο σκοπός αυτής της
|
||
παρουσίασης είναι καθαρά ενημερωτικός.</para>
|
||
|
||
<programlisting>options IPFIREWALL</programlisting>
|
||
|
||
<para>Η επιλογή αυτή ενεργοποιεί το IPFW ως μέρος του πυρήνα.</para>
|
||
|
||
<programlisting>options IPFIREWALL_VERBOSE</programlisting>
|
||
|
||
<para>Ενεργοποιεί την καταγραφή των πακέτων που περνούν μέσω του IPFW
|
||
και περιλαμβάνουν τη λέξη <literal>log</literal> στον κανόνα
|
||
τους.</para>
|
||
|
||
<programlisting>options IPFIREWALL_VERBOSE_LIMIT=5</programlisting>
|
||
|
||
<para>Περιορίζει τον πλήθος των πακέτων που καταγράφονται μέσω του
|
||
&man.syslogd.8; σε συγκεκριμένο αριθμό ανά καταχώριση. Η ρύθμιση
|
||
είναι χρήσιμη σε εχθρικά περιβάλλοντα στα οποία είναι επιθυμητή
|
||
η καταγραφή. Με αυτό τον τρόπο μπορεί να αποφευχθεί μια πιθανή
|
||
επίθεση με στόχο την υπερχείλιση των αρχείων καταγραφής.</para>
|
||
|
||
<indexterm>
|
||
<primary>kernel options</primary>
|
||
<secondary>IPFIREWALL_DEFAULT_TO_ACCEPT</secondary>
|
||
</indexterm>
|
||
|
||
<programlisting>options IPFIREWALL_DEFAULT_TO_ACCEPT</programlisting>
|
||
|
||
<para>Η επιλογή αυτή αφήνει τα πάντα να περνάνε μέσα από το firewall,
|
||
το οποίο είναι καλή ιδέα την πρώτη φορά που ρυθμίζετε το firewall
|
||
σας.</para>
|
||
|
||
<indexterm>
|
||
<primary>kernel options</primary>
|
||
<secondary>IPDIVERT</secondary>
|
||
</indexterm>
|
||
|
||
<programlisting>options IPDIVERT</programlisting>
|
||
|
||
<para>Η επιλογή αυτή ενεργοποιεί τη λειτουργία
|
||
<acronym>NAT</acronym>.</para>
|
||
|
||
<note>
|
||
<para>Το firewall θα απορρίπτει όλα τα πακέτα που κατευθύνονται από
|
||
και προς το μηχάνημα, αν δεν περιλάβετε την επιλογή
|
||
<literal>IPFIREWALL_DEFAULT_TO_ACCEPT</literal> ή αν δεν ρυθμίσετε
|
||
ένα κατάλληλο κανόνα που να επιτρέπει αυτές τις συνδέσεις.</para>
|
||
</note>
|
||
</sect2>
|
||
|
||
<sect2 id="firewalls-ipfw-rc">
|
||
<title>Επιλογές στο <filename>/etc/rc.conf</filename></title>
|
||
|
||
<para>Ενεργοποιήστε το firewall:</para>
|
||
|
||
<programlisting>firewall_enable="YES"</programlisting>
|
||
|
||
<para>Για να επιλέξετε ένα από τους προεπιλεγμένους τύπους firewall που
|
||
υποστηρίζονται από το &os;, διαβάστε το αρχείο
|
||
<filename>/etc/rc.firewall</filename> και δημιουργήστε μια εγγραφή
|
||
όπως την παρακάτω:</para>
|
||
|
||
<programlisting>firewall_type="open"</programlisting>
|
||
|
||
<para>Οι διαθέσιμες τιμές για αυτή τη ρύθμιση είναι:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><literal>open</literal> — επιτρέπει τη διέλευση όλης
|
||
της κίνησης.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><literal>client</literal> — προστατεύει μόνο το
|
||
συγκεκριμένο μηχάνημα.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><literal>simple</literal> — προστατεύει ολόκληρο το
|
||
δίκτυο.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><literal>closed</literal> — απενεργοποιεί εντελώς την
|
||
κίνηση πακέτων, εκτός από την εσωτερική διεπαφή (loopback).</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><literal>UNKNOWN</literal> — απενεργοποιεί την φόρτωση
|
||
κανόνων του firewall.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><filename><replaceable>filename</replaceable></filename>
|
||
— το πλήρες μονοπάτι του αρχείου που περιέχει τους κανόνες
|
||
του firewall.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Μπορείτε να χρησιμοποιήσετε δύο διαφορετικούς τρόπους για να
|
||
φορτώσετε προσαρμοσμένους κανόνες στο
|
||
<application>ipfw</application> firewall. Ο ένας είναι θέτοντας τη
|
||
μεταβλητή <literal>firewall_type</literal> στην απόλυτη διαδρομή του
|
||
αρχείου που περιέχει τους <emphasis>κανόνες του firewall</emphasis>,
|
||
χωρίς να δώσετε ορίσματα στην γραμμή εντολών για το ίδιο το
|
||
&man.ipfw.8;. Το αρχείο κανόνων που φαίνεται παρακάτω, απορρίπτει
|
||
όλη την εισερχόμενη και εξερχόμενη κίνηση:</para>
|
||
|
||
<programlisting>add deny in
|
||
add deny out</programlisting>
|
||
|
||
<para>Από την άλλη μεριά, είναι επίσης δυνατό να θέσετε τη μεταβλητή
|
||
<literal>firewall_script</literal> στην απόλυτη διαδρομή ενός
|
||
εκτελέσιμου script που περιλαμβάνει μια σειρά από εντολές
|
||
<command>ipfw</command> που θα εκτελεστούν κατά την εκκίνηση.
|
||
Ένα έγκυρο τέτοιο script το οποίο είναι αντίστοιχο με το αρχείο
|
||
κανόνων που δείξαμε παραπάνω, είναι το ακόλουθο:</para>
|
||
|
||
<programlisting>#!/bin/sh
|
||
|
||
ipfw -q flush
|
||
|
||
ipfw add deny in
|
||
ipfw add deny out</programlisting>
|
||
|
||
<note>
|
||
<para>Αν θέσετε την τιμή του <literal>firewall_type</literal> είτε
|
||
σε <literal>client</literal> είτε σε <literal>simple</literal>,
|
||
θα πρέπει να ελέγξετε ότι οι προεπιλεγμένοι κανόνες που περιέχονται
|
||
στο <filename>/etc/rc.firewall</filename> ταιριάζουν με τις
|
||
ρυθμίσεις του συγκεκριμένου μηχανήματος. Παρατηρήστε επίσης ότι τα
|
||
παραδείγματα που χρησιμοποιούνται σε αυτό το κεφάλαιο αναμένουν να
|
||
να έχετε θέσει τη μεταβλητή <literal>firewall_script</literal> στην
|
||
τιμή <filename>/etc/ipfw.rules</filename>.</para>
|
||
</note>
|
||
|
||
<para>Ενεργοποιήστε την καταγραφή:</para>
|
||
|
||
<programlisting>firewall_logging="YES"</programlisting>
|
||
|
||
<warning>
|
||
<para>Το μόνο πράγμα που κάνει η μεταβλητή
|
||
<varname>firewall_logging</varname> είναι να θέσει την τιμή
|
||
της μεταβλητής sysctl <varname>net.inet.ip.fw.verbose</varname> στην
|
||
τιμή <literal>1</literal> (δείτε το <xref
|
||
linkend="firewalls-ipfw-enable"/>). Δεν υπάρχει μεταβλητή του
|
||
<filename>rc.conf</filename> που να ορίζει περιορισμούς στην
|
||
καταγραφή, αλλά αυτό μπορεί να ρυθμιστεί μέσω της παραπάνω
|
||
μεταβλητής sysctl είτε χειροκίνητα, είτε μέσω του αρχείου
|
||
<filename>/etc/sysctl.conf</filename>:</para>
|
||
|
||
<programlisting>net.inet.ip.fw.verbose_limit=5</programlisting>
|
||
</warning>
|
||
|
||
<para>Αν το μηχάνημα σας λειτουργεί ως πύλη (gateway), δηλαδή παρέχει
|
||
υπηρεσία μετάφρασης διευθύνσεων δικτύου (Network Address
|
||
Translation, NAT) μέσω του &man.natd.8;, παρακαλούμε να διαβάσετε το
|
||
<xref linkend="network-natd"/> για πληροφορίες σχετικά με τις
|
||
ρυθμίσεις που απαιτούνται στο αρχείο
|
||
<filename>/etc/rc.conf</filename>.</para>
|
||
</sect2>
|
||
|
||
<sect2 id="firewalls-ipfw-cmd">
|
||
<title>Η Εντολή IPFW</title>
|
||
|
||
<indexterm><primary><command>ipfw</command></primary></indexterm>
|
||
|
||
<para>Η εντολή <command>ipfw</command> είναι ο συνήθης τρόπος για την
|
||
προσθήκη η διαγραφή κανόνων στους εσωτερικούς ενεργούς κανόνες του
|
||
firewall, καθώς αυτό εκτελείται. Το πρόβλημα με τη χρήση αυτής της
|
||
μεθόδου είναι ότι οι αλλαγές χάνονται με τον τερματισμό λειτουργίας
|
||
του μηχανήματος. Μπορείτε να γράψετε όλους τους κανόνες σας σε ένα
|
||
αρχείο και να το χρησιμοποιείτε για να τους φορτώνετε στην εκκίνηση.
|
||
Μπορείτε να χρησιμοποιήσετε το ίδιο αρχείο για να αντικαταστήσετε
|
||
τους τρέχοντες κανόνες του firewall, την ώρα που αυτό εκτελείται.
|
||
Αυτός είναι και ο συνιστώμενος τρόπος που χρησιμοποιούμε στα
|
||
παραδείγματα μας.</para>
|
||
|
||
<para>Η εντολή <command>ipfw</command> είναι επίσης χρήσιμη για να
|
||
απεικονίζει τους τρέχοντες κανόνες στη κονσόλα σας. Το σύστημα
|
||
καταγραφής χρήσης της IPFW δημιουργεί αυτόματα ένα μετρητή για κάθε
|
||
κανόνα, ο οποίος μετράει πόσα πακέτα ταίριαξαν με αυτόν. Κατά τη
|
||
διάρκεια των δοκιμών, η δυνατότητα να ελέγξετε την τιμή του μετρητή
|
||
είναι ένας τρόπος για να διαπιστώσετε αν ο κανόνας λειτουργεί
|
||
κανονικά.</para>
|
||
|
||
<para>Για να δείτε όλους τους κανόνες με τη σειρά:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipfw list</userinput></screen>
|
||
|
||
<para>Για να δείτε μια λίστα όλων των κανόνων, μαζί με την ώρα που
|
||
ενεργοποιήθηκε τελευταία φορά ο κάθε κανόνας, γράψτε:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipfw -t list</userinput></screen>
|
||
|
||
<para>Το επόμενο παράδειγμα δείχνει τον αριθμό των πακέτων που ταίριαξαν
|
||
μαζί με τον αντίστοιχο κανόνα. Η πρώτη στήλη δείχνει τον αριθμό του
|
||
κανόνα, ακολουθείται από τον αριθμό πακέτων που ταίριαξαν (πρώτα τα
|
||
εξερχόμενα και μετά τα εισερχόμενα) και τέλος από τον ίδιο τον
|
||
κανόνα.</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipfw -a list</userinput></screen>
|
||
|
||
<para>Για να δείτε μια λίστα που να περιλαμβάνει τόσο τους δυναμικούς
|
||
όσο και τους στατικούς κανόνες:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipfw -d list</userinput></screen>
|
||
|
||
<para>Για να δείτε και τους δυναμικούς κανόνες που έχουν λήξει:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipfw -d -e list</userinput></screen>
|
||
|
||
<para>Για να μηδενίσετε τους μετρητές:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipfw zero</userinput></screen>
|
||
|
||
<para>Για να μηδενίσετε τους μετρητές μόνο για τον κανόνα με τον αριθμό
|
||
<replaceable>NUM</replaceable>:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipfw zero <replaceable>NUM</replaceable></userinput></screen>
|
||
</sect2>
|
||
|
||
<sect2 id="firewalls-ipfw-rules">
|
||
<title>Το Σύνολο Κανόνων του IPFW</title>
|
||
|
||
<!-- Έχει εμφανιστεί ήδη μια φορά -->
|
||
|
||
<para>Ως <quote>σύνολο κανόνων</quote> στο IPFW, ορίζουμε μια ομάδα
|
||
κανόνων που έχουν γραφεί για να επιτρέπουν ή να απορρίπτουν πακέτα
|
||
ανάλογα με τις τιμές που περιέχονται σε αυτά. Η διπλής κατεύθυνσης
|
||
ανταλλαγή πακέτων μεταξύ υπολογιστών αποτελεί μια συνεδρία.
|
||
Το σύνολο κανόνων του firewall επεξεργάζεται τόσο τα πακέτα που
|
||
έρχονται από το Internet, όσο και τα πακέτα που παράγονται από το
|
||
σύστημα ως απάντηση σε αυτά. Κάθε υπηρεσία <acronym>TCP/IP</acronym>
|
||
(π.χ. telnet, www, mail, κ.λ.π.) καθορίζεται από το πρωτόκολλο και
|
||
την προνομιακή (privileged) θύρα που χρησιμοποιεί για να δέχεται
|
||
αιτήματα εξυπηρέτησης. Τα πακέτα που προορίζονται για μια
|
||
συγκεκριμένη υπηρεσία, ξεκινούν από τη διεύθυνση αφετηρίας
|
||
χρησιμοποιώντας μια μη-προνομιακή θύρα και καταλήγουν στη
|
||
συγκεκριμένη θύρα υπηρεσίας στον προορισμό. Όλες οι παραπάνω
|
||
παράμετροι (θύρες και διευθύνσεις) μπορούν να χρησιμοποιηθούν ως
|
||
κριτήρια επιλογής για την δημιουργία κανόνων που επιτρέπουν
|
||
ή εμποδίζουν την πρόσβαση σε υπηρεσίες.</para>
|
||
|
||
<indexterm>
|
||
<primary>IPFW</primary>
|
||
<secondary>rule processing order</secondary>
|
||
</indexterm>
|
||
|
||
<!-- Needs rewording to include note below -->
|
||
|
||
<para>Όταν ένα πακέτο εισέρχεται στο firewall, συγκρίνεται με βάση τον
|
||
πρώτο κανόνα. Η σύγκριση συνεχίζεται διαδοχικά με τους υπόλοιπους
|
||
κανόνες, από τον πρώτο προς τον τελευταίο, με βάση τον αύξοντα αριθμό
|
||
τους. Όταν το πακέτο ταιριάξει με τις παραμέτρους επιλογής κάποιου
|
||
κανόνα, εκτελείται η οδηγία που αναφέρεται στο πεδίο ενεργειών του
|
||
κανόνα αυτού και η αναζήτηση κανόνων για το συγκεκριμένο πακέτο
|
||
τερματίζεται. Σε αυτή τη μέθοδο αναζήτησης,
|
||
<quote>ο πρώτος κανόνας που ταιριάζει, είναι ο νικητής</quote>. Αν
|
||
το πακέτο δεν ταιριάζει με κανένα από τους κανόνες, θα ληφθεί από τον
|
||
υποχρεωτικό προεπιλεγμένο κανόνα του IPFW, με αριθμό 65535, ο οποίος
|
||
εμποδίζει τη διέλευση όλων των πακέτων, και τα απορρίπτει χωρίς να
|
||
στείλει καμιά απάντηση στον αρχικό αποστολέα τους.</para>
|
||
|
||
<note>
|
||
<para>Η αναζήτηση συνεχίζεται μετά από κανόνες τύπου
|
||
<literal>count</literal>, <literal>skipto</literal> και
|
||
<literal>tee</literal>.</para>
|
||
</note>
|
||
|
||
<para>Οι οδηγίες που φαίνονται εδώ, βασίζονται στη χρήση κανόνων που
|
||
περιέχουν τις οδηγίες <literal>keep state</literal>,
|
||
<literal>limit</literal>, <literal>in</literal>,
|
||
<literal>out</literal> και <literal>via</literal>. Αυτές είναι και
|
||
οι βασικές λειτουργίες για την δόμηση ενός firewall τύπου
|
||
inclusive με stateful λειτουργία.</para>
|
||
|
||
<warning>
|
||
<para>Να δίνετε μεγάλη προσοχή όταν δουλεύετε με τους κανόνες ενός
|
||
firewall. Μπορεί άθελα σας να κλειδωθείτε έξω από το σύστημα
|
||
σας.</para>
|
||
</warning>
|
||
|
||
<sect3 id="firewalls-ipfw-rules-syntax">
|
||
<title>Σύνταξη Κανόνων</title>
|
||
|
||
<indexterm>
|
||
<primary>IPFW</primary>
|
||
<secondary>rule syntax</secondary>
|
||
</indexterm>
|
||
|
||
<para>Στην ενότητα αυτή, θα παρουσιάσουμε μια απλοποιημένη σύνταξη
|
||
κανόνων. Δείχνουμε μόνο ότι χρειάζεται για να δημιουργηθεί ένα
|
||
τυποποιημένο σύνολο κανόνων για ένα inclusive firewall. Για πλήρη
|
||
περιγραφή, δείτε τη σελίδα manual του &man.ipfw.8;.</para>
|
||
|
||
<para>Οι κανόνες περιέχουν λέξεις-κλειδιά. Οι λέξεις αυτές θα πρέπει
|
||
να κωδικοποιηθούν με συγκεκριμένη σειρά από τα αριστερά προς τα
|
||
δεξιά της γραμμής. Οι λέξεις-κλειδιά φαίνονται παρακάτω με έντονα
|
||
γράμματα. Μερικές λέξεις έχουν υπο-επιλογές οι οποίες μπορεί να
|
||
είναι επίσης λέξεις-κλειδιά και να περιλαμβάνουν επίσης ακόμα
|
||
περισσότερες υπο-επιλογές.</para>
|
||
|
||
<para>Η αρχή ενός σχολίου, σηματοδοτείται με το σύμβολο
|
||
<literal>#</literal>, το οποίο μπορεί να εμφανίζεται στο τέλος μιας
|
||
γραμμής κανόνα, ή και σε μια δική του γραμμή. Οι κενές γραμμές
|
||
αγνοούνται.</para>
|
||
|
||
<para><replaceable>CMD RULE_NUMBER ACTION LOGGING SELECTION
|
||
STATEFUL</replaceable></para>
|
||
|
||
<sect4>
|
||
<title>CMD</title>
|
||
|
||
<para>Για να γίνει η προσθήκη ενός νέου κανόνα στον εσωτερικό
|
||
πίνακα, τοποθετείται μπροστά από αυτόν η παράμετρος
|
||
<parameter>add</parameter>.</para>
|
||
</sect4>
|
||
|
||
<sect4>
|
||
<title>RULE_NUMBER</title>
|
||
|
||
<para>Κάθε κανόνας σχετίζεται με ένα αριθμό κανόνα (rule_number)
|
||
στην περιοχή 1..65535.</para>
|
||
</sect4>
|
||
|
||
<sect4>
|
||
<title>ACTION</title>
|
||
|
||
<para>Ένας κανόνας μπορεί να σχετίζεται με μια ή περισσότερες
|
||
ενέργειες, οι οποίες εκτελούνται όταν το πακέτο ταιριάζει με τα
|
||
κριτήρια επιλογής αυτού του κανόνα.</para>
|
||
|
||
<para><parameter>allow | accept | pass |
|
||
permit</parameter></para>
|
||
|
||
<para>Όλα τα παραπάνω έχουν το ίδιο αποτέλεσμα: το πακέτο εξέρχεται
|
||
από την σύστημα του firewall. Η αναζήτηση για το συγκεκριμένο
|
||
πακέτο τερματίζεται σε αυτό τον κανόνα.</para>
|
||
|
||
<para><parameter>check-state</parameter></para>
|
||
|
||
<para>Ελέγχει το πακέτο με βάση το δυναμικό πίνακα κανόνων. Αν
|
||
βρεθεί κανόνας που να ταιριάζει, θα εκτελεστεί η ενέργεια του
|
||
κανόνα ο οποίος δημιούργησε τον συγκεκριμένο δυναμικό κανόνα.
|
||
Διαφορετικά, η αναζήτηση συνεχίζεται με τον επόμενο κανόνα.
|
||
Ένας κανόνας check-state δεν έχει κριτήρια επιλογής. Αν δεν
|
||
υπάρχει κανόνας check-state στο σύνολο κανόνων, ο έλεγχος του
|
||
πίνακα δυναμικών κανόνων ξεκινάει από τον πρώτο κανόνα τύπου
|
||
keep-state ή limit.</para>
|
||
|
||
<para><parameter>deny | drop</parameter></para>
|
||
|
||
<para>Και οι δύο λέξεις σημαίνουν το ίδιο πράγμα: τα πακέτα που
|
||
ταιριάζουν με αυτό τον κανόνα απορρίπτονται. Η αναζήτηση
|
||
τερματίζεται.</para>
|
||
</sect4>
|
||
|
||
<sect4>
|
||
<title>Καταγραφή</title>
|
||
|
||
<para><parameter>log</parameter> ή
|
||
<parameter>logamount</parameter></para>
|
||
|
||
<para>Όταν ένα πακέτο ταιριάζει με ένα κανόνα που περιέχει τη λέξη
|
||
<literal>log</literal>, γίνεται καταγραφή του μηνύματος μέσω του
|
||
&man.syslogd.8; στη δυνατότητα SECURITY. Η καταγραφή συμβαίνει
|
||
μόνο αν ο αριθμός των πακέτων που έχει καταγραφεί μέχρι στιγμής
|
||
δεν υπερβαίνει την παράμετρο <literal>logamount</literal>. Αν η
|
||
παράμετρος αυτή δεν έχει καθοριστεί, το όριο ρυθμίζεται με βάση
|
||
την τιμή της μεταβλητής sysctl
|
||
<literal>net.inet.ip.fw.verbose_limit</literal>. Και στις δύο
|
||
περιπτώσεις, μια μηδενική τιμή σημαίνει ότι δεν θα υπάρχει όριο
|
||
στην καταγραφή. Μόλις η καταγραφή φτάσει στο όριο, μπορεί να
|
||
γίνει επανενεργοποίηση της με το μηδενισμό του μετρητή
|
||
καταγραφής, ή του μετρητή για το συγκεκριμένο κανόνα. Δείτε την
|
||
εντολή <command>ipfw reset log</command>.</para>
|
||
|
||
<note>
|
||
<para>Η καταγραφή γίνεται μόνο αφού επαληθευθούν όλες οι άλλες
|
||
συνθήκες ταιριάσματος του πακέτου, και πριν την τελική αποδοχή
|
||
ή απόρριψη του. Είναι στη δική σας ευχέρεια να αποφασίσετε σε
|
||
ποιους κανόνες θα ενεργοποιήσετε την καταγραφή.</para>
|
||
</note>
|
||
</sect4>
|
||
|
||
<sect4>
|
||
<title>Επιλογή</title>
|
||
|
||
<para>Οι λέξεις-κλειδιά που περιγράφονται σε αυτή την ενότητα,
|
||
χρησιμοποιούνται για να περιγράψουν χαρακτηριστικά του πακέτου που
|
||
θα πρέπει να διερευνηθούν για να καθοριστεί αν το πακέτο ταιριάζει
|
||
ή όχι με τον κανόνα. Η επιλογή μπορεί να γίνει με βάση τα
|
||
παρακάτω γενικής φύσεως χαρακτηριστικά, τα οποία και θα πρέπει να
|
||
χρησιμοποιηθούν με τη σειρά που φαίνονται:</para>
|
||
|
||
<para><parameter>udp | tcp | icmp</parameter></para>
|
||
|
||
<para>Μπορούν επίσης να χρησιμοποιηθούν τα πρωτόκολλα που
|
||
περιέχονται στο αρχείο <filename>/etc/protocols</filename>.
|
||
Η τιμή που καθορίζεται χρησιμοποιείται για το ταίριασμα του
|
||
πρωτοκόλλου. Πρόκειται για υποχρεωτική παράμετρο.</para>
|
||
|
||
<para><parameter>from src to dst</parameter></para>
|
||
|
||
<para>Οι λέξεις <literal>from</literal> και <literal>to</literal>
|
||
χρησιμοποιούνται για το ταίριασμα IP διευθύνσεων. Οι κανόνες
|
||
πρέπει να καθορίζουν <emphasis>τόσο</emphasis> την πηγή όσο και
|
||
τον προορισμό. Η λέξη <literal>any</literal> μπορεί να
|
||
χρησιμοποιηθεί για ταίριασμα με οποιαδήποτε διεύθυνση. Η λέξη
|
||
<literal>me</literal> έχει επίσης ειδική σημασία. Ταιριάζει με
|
||
οποιαδήποτε διεύθυνση που έχει ρυθμιστεί σε κάποια διεπαφή του
|
||
συστήματος σας, αντιπροσωπεύοντας έτσι το PC στο οποίο εκτελείται
|
||
το firewall. Μπορούν έτσι να γραφούν κανόνες του τύπου
|
||
<literal>from me to any</literal> ή
|
||
<literal>from any to me</literal> ή
|
||
<literal>from any to 0.0.0.0/0</literal> ή
|
||
<literal>from 0.0.0.0/0 to me</literal> ή
|
||
<literal>from any to 0.0.0.0</literal> ή
|
||
<literal>from me to 0.0.0.0</literal>. Οι διευθύνσεις IP
|
||
καθορίζονται ως αριθμητικές οκτάδες χωρισμένες με τελείες
|
||
και ακολουθούνται από το μήκος της μάσκας υποδικτύου. Μια
|
||
IP διεύθυνση μπορεί να καθορίζεται με αριθμούς που χωρίζονται
|
||
με τελείες. Μπορεί επίσης να ακολουθείται από το μέγεθος της
|
||
μάσκας υποδικτύου (μορφή CIDR). Πρόκειται για υποχρεωτική
|
||
παράμετρο. Μπορείτε να χρησιμοποιήσετε το βοηθητικό πρόγραμμα
|
||
<filename role="package">net-mgmt/ipcalc</filename> για
|
||
διευκόλυνση σας στους υπολογισμούς. Δείτε την δικτυακή τοποθεσία
|
||
του προγράμματος για περισσότερες πληροφορίες: <ulink
|
||
url="http://jodies.de/ipcalc"></ulink>.</para>
|
||
|
||
<para><parameter>port number</parameter></para>
|
||
|
||
<para>Χρησιμοποιείται σε πρωτόκολλα που υποστηρίζουν αριθμούς θυρών
|
||
(όπως είναι τα <acronym>TCP</acronym> και <acronym>UDP</acronym>).
|
||
Είναι υποχρεωτικό να δίνεται ο αριθμός θύρας της υπηρεσίας
|
||
που θέλετε να ταιριάξετε. Μπορείτε να χρησιμοποιήσετε τα
|
||
ονόματα των υπηρεσιών (μπορείτε να τα βρείτε στο αρχείο
|
||
<filename>/etc/services</filename>) αντί για τους κανονικούς
|
||
αριθμούς θυρών.</para>
|
||
|
||
<para><parameter>in | out</parameter></para>
|
||
|
||
<para>Με το παραπάνω μπορεί να καθοριστεί αν το ταίριασμα θα
|
||
γίνεται σε εισερχόμενα ή σε εξερχόμενα πακέτα αντίστοιχα. Είναι
|
||
υποχρεωτικό να έχετε ως μέρος των κριτηρίων του κανόνα σας, είτε
|
||
τη λέξη <literal>in</literal> είτε τη λέξη
|
||
<literal>out</literal>.</para>
|
||
|
||
<para><parameter>via IF</parameter></para>
|
||
|
||
<para>Ταιριάζει τα πακέτα τα οποία διέρχονται μέσω της διεπαφής με
|
||
το όνομα που καθορίζεται. Η λέξη <literal>via</literal>
|
||
εξασφαλίζει ότι το όνομα της διεπαφής θα είναι πάντα μέρος των
|
||
κριτηρίων κατά τη διαδικασία ταιριάσματος.</para>
|
||
|
||
<para><parameter>setup</parameter></para>
|
||
|
||
<para>Πρόκειται για υποχρεωτική παράμετρο που αναγνωρίζει την
|
||
αίτηση έναρξης μιας συνεδρίας για πακέτα
|
||
<acronym>TCP</acronym>.</para>
|
||
|
||
<para><parameter>keep-state</parameter></para>
|
||
|
||
<para>Πρόκειται για υποχρεωτική παράμετρο. Μόλις υπάρξει ταίριασμα,
|
||
το firewall θα δημιουργήσει ένα δυναμικό κανόνα, του οποίου η
|
||
προεπιλεγμένη συμπεριφορά είναι να ταιριάζει επικοινωνία διπλής
|
||
κατεύθυνσης μεταξύ της διεύθυνσης IP και της θύρας αφετηρίας και
|
||
προορισμού, χρησιμοποιώντας το ίδιο πρωτόκολλο.</para>
|
||
|
||
<para><parameter>limit {src-addr | src-port | dst-addr |
|
||
dst-port}</parameter></para>
|
||
|
||
<para>Το firewall θα επιτρέψει μόνο <replaceable>N</replaceable>
|
||
πλήθος συνδέσεων με τις παραμέτρους που περιγράφονται σε αυτό
|
||
τον κανόνα. Μπορούν να καθοριστούν περισσότερες από μια
|
||
διευθύνσεις και πόρτες αφετηρίας και προορισμού. Δεν μπορούν
|
||
να χρησιμοποιηθούν στον ίδιο κανόνα οι παράμετροι
|
||
<literal>limit</literal> και <literal>keep-state</literal>.
|
||
Η επιλογή <literal>limit</literal> παρέχει την ίδια λειτουργία
|
||
stateful με την <literal>keep-state</literal>, καθώς και
|
||
επιπρόσθετες δικές της λειτουργίες.</para>
|
||
</sect4>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>Επιλογή για Stateful Κανόνες</title>
|
||
|
||
<indexterm>
|
||
<primary>IPFW</primary>
|
||
<secondary>stateful filtering</secondary>
|
||
</indexterm>
|
||
|
||
<!-- XXX: duplicated -->
|
||
|
||
<para>Το stateful φιλτράρισμα, αντιμετωπίζει την κίνηση του δικτύου ως
|
||
διπλής κατεύθυνσης ανταλλαγή πακέτων τα οποία δημιουργούν μια
|
||
συνεδρία. Έχει επίσης τη δυνατότητα να διερευνήσει αν τηρούνται
|
||
οι έγκυροι κανόνες ανταλλαγής μηνυμάτων μεταξύ του αποστολέα και
|
||
του παραλήπτη. Οποιαδήποτε πακέτα δεν ταιριάζουν με το πρότυπο
|
||
αυτής της επικοινωνίας, απορρίπτονται ως ψεύτικα.</para>
|
||
|
||
<para>Η επιλογή <literal>check-state</literal> χρησιμοποιείται για
|
||
να αναγνωριστεί σε ποιο σημείο του συνόλου κανόνων του IPFW θα
|
||
ελεγχθεί το πακέτο με βάση τη δυνατότητα των δυναμικών κανόνων.
|
||
Σε περίπτωση ταιριάσματος, το πακέτο εξέρχεται από το firewall και
|
||
συνεχίζει την πορεία του, ενώ την ίδια στιγμή δημιουργείται ένας
|
||
νέος δυναμικός κανόνας για το επόμενο πακέτο που αναμένεται να
|
||
έρθει με βάση τη συγκεκριμένη διπλής κατεύθυνσης επικοινωνία. Σε
|
||
περίπτωση που το πακέτο δεν ταιριάζει με το δυναμικό κανόνα, θα
|
||
προχωρήσει για να ελεγχθεί από τον επόμενο κανόνα του
|
||
firewall.</para>
|
||
|
||
<para>Η δυνατότητα δυναμικών κανόνων είναι ευάλωτη σε εξάντληση πόρων
|
||
σε περίπτωση επίθεσης υπερχείλισης (flood) SYN. Η επίθεση αυτή
|
||
μπορεί να δημιουργήσει πολύ μεγάλο πλήθος δυναμικών κανόνων.
|
||
Για την αντιμετώπιση μιας τέτοιας επίθεσης, το &os; χρησιμοποιεί
|
||
μια ακόμα επιλογή που ονομάζεται <literal>limit</literal>.
|
||
Η επιλογή αυτή μπορεί να περιορίσει τον αριθμό των ταυτόχρονων
|
||
συνεδριών, εξετάζοντας τα πεδία αφετηρίας και προορισμού των
|
||
κανόνων. Ανιχνεύει με αυτό τον τρόπο το πλήθος των δυναμικών
|
||
κανόνων και πόσες φορές έχει χρησιμοποιηθεί ο καθένας από
|
||
τη συγκεκριμένη IP διεύθυνση. Αν ο αριθμός αυτός ξεπερνάει το
|
||
όριο που έχει τεθεί με την επιλογή <literal>limit</literal>, το
|
||
πακέτο απορρίπτεται.</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>Καταγραφή Μηνυμάτων του Firewall</title>
|
||
|
||
<indexterm>
|
||
<primary>IPFW</primary>
|
||
<secondary>logging</secondary>
|
||
</indexterm>
|
||
|
||
<para>Τα πλεονεκτήματα της καταγραφής συμβάντων του firewall, είναι
|
||
προφανή: παρέχουν τη δυνατότητα να δείτε για ποιο λόγο
|
||
ενεργοποιήθηκαν οι κανόνες στους οποίους έχετε ενεργοποιήσει την
|
||
καταγραφή. Οι πληροφορίες περιλαμβάνουν τα πακέτα που απορρίφθηκαν,
|
||
τις διευθύνσεις από τις οποίες προήλθαν και που κατευθύνονταν.
|
||
Με αυτό τον τρόπο, έχετε ένα σημαντικό πλεονέκτημα στην ανίχνευση
|
||
των εισβολέων.</para>
|
||
|
||
<para>Ακόμα και αν ενεργοποιήσετε τη λειτουργία καταγραφής, το IPFW
|
||
δεν θα αρχίσει από μόνο του την καταγραφή για κανένα κανόνα.
|
||
Ο διαχειριστής του firewall θα αποφασίσει σε ποιους από όλους τους
|
||
κανόνες θα ενεργοποιήσει την καταγραφή, και θα προσθέσει την
|
||
λέξη <literal>log</literal> στην αντίστοιχη καταχώριση.
|
||
Φυσιολογικά, γίνεται καταγραφή μόνο για κανόνες που απορρίπτουν
|
||
πακέτα (κανόνες <literal>deny</literal>), όπως για παράδειγμα ο
|
||
κανόνας απόρριψης των εισερχόμενων <acronym>ICMP</acronym> pings.
|
||
Είναι κοινή πρακτική, να αντιγράφεται στο τέλος των κανόνων ο
|
||
κανόνας <quote>ipfw default deny everything</quote> και να
|
||
προστίθεται σε αυτόν η επιλογή <literal>log</literal>.
|
||
Με τον τρόπο αυτό, μπορείτε να δείτε όλα τα πακέτα που δεν
|
||
ταίριαξαν με κανένα κανόνα του συνόλου.</para>
|
||
|
||
<para>Η καταγραφή συμβάντων είναι δίκοπο μαχαίρι. Αν δεν είστε
|
||
προσεκτικός, θα χαθείτε μέσα στο πλήθος των δεδομένων της
|
||
καταγραφής και θα γεμίσετε το δίσκο σας με άχρηστα αρχεία. Οι πιο
|
||
παλιές και κοινές επιθέσεις τύπου άρνησης υπηρεσίας (DoS), είναι
|
||
αυτές που προσπαθούν να γεμίσουν τους δίσκους σας. Τα μηνύματα
|
||
αυτά όχι μόνο καταγράφονται στο <application>syslogd</application>,
|
||
αλλά εμφανίζονται και στην κονσόλα του συστήματος σας, και σύντομα
|
||
γίνονται πολύ ενοχλητικά.</para>
|
||
|
||
<para>Η επιλογή <literal>IPFIREWALL_VERBOSE_LIMIT=5</literal> στον
|
||
πυρήνα, περιορίζει τον αριθμό των συνεχόμενων όμοιων μηνυμάτων που
|
||
στέλνονται στον καταγραφέα συστήματος &man.syslogd.8; σχετικά με
|
||
το ταίριασμα πακέτων ενός συγκεκριμένου κανόνα. Όταν ενεργοποιείται
|
||
αυτή η επιλογή στον πυρήνα, ο αριθμός των συνεχόμενων μηνυμάτων
|
||
ενός συγκεκριμένου κανόνα, σταματάει μετά τον αριθμό που
|
||
καθορίζεται. Δεν υπάρχει κανένα όφελος από 200 συνεχόμενα μηνύματα
|
||
με το ίδιο ακριβώς περιεχόμενο. Για παράδειγμα, πέντε συνεχόμενα
|
||
μηνύματα για ένα συγκεκριμένο κανόνα θα καταγράφονταν κανονικά στο
|
||
<application>syslogd</application>. Τα υπόλοιπα όμοια μηνύματα θα
|
||
καταμετρηθούν και θα καταγραφούν όπως φαίνεται παρακάτω:</para>
|
||
|
||
<programlisting>last message repeated 45 times</programlisting>
|
||
|
||
<para>Όλα τα μηνύματα καταγραφής των πακέτων, γράφονται από προεπιλογή
|
||
στο αρχείο <filename>/var/log/security</filename> το οποίο
|
||
καθορίζεται στο αρχείο <filename>/etc/syslog.conf</filename>.</para>
|
||
</sect3>
|
||
|
||
<sect3 id="firewalls-ipfw-rules-script">
|
||
<title>Δημιουργία Ενός Script Κανόνων</title>
|
||
|
||
<para>Οι περισσότεροι έμπειροι χρήστες του IPFW, δημιουργούν ένα
|
||
αρχείο που περιέχει τους κανόνες και το γράφουν με τέτοιο τρόπο
|
||
ώστε να να μπορεί να εκτελεστεί ως script. Το βασικό πλεονέκτημα
|
||
του παραπάνω τρόπου, είναι ότι οι κανόνες του firewall μπορούν να
|
||
ανανεωθούν χωρίς την ανάγκη να επανεκκινήσει το σύστημα για να
|
||
φορτωθούν οι νέοι. Η μέθοδος αυτή είναι πολύ βολική για
|
||
την δοκιμή νέων κανόνων, καθώς η διαδικασία μπορεί να επαναληφθεί
|
||
όσες φορές χρειάζεται. Καθώς πρόκειται για κανονικό script,
|
||
μπορείτε να χρησιμοποιήσετε συμβολική υποκατάσταση για να
|
||
κωδικοποιήσετε και να υποκαταστήσετε συχνά χρησιμοποιούμενες τιμές
|
||
σε πολλαπλούς κανόνες. Αυτό φαίνεται στο παρακάτω
|
||
παράδειγμα.</para>
|
||
|
||
<para>Η σύνταξη που χρησιμοποιείται εδώ, είναι συμβατή με τα κελύφη
|
||
&man.sh.1;, &man.csh.1; και &man.tcsh.1;. Μπροστά από τα πεδία
|
||
της συμβολικής υποκατάστασης, υπάρχει το σήμα του δολαρίου,
|
||
$. Το σύμβολο αυτό δεν υπάρχει μπροστά από τα συμβολικά
|
||
πεδία. Η τιμή που θα αποδοθεί στο συμβολικό πεδίο, πρέπει να
|
||
εσωκλείεται σε διπλά εισαγωγικά.</para>
|
||
|
||
<para>Ξεκινήστε το αρχείο των κανόνων σας όπως φαίνεται
|
||
παρακάτω:</para>
|
||
|
||
<programlisting>############### start of example ipfw rules script #############
|
||
#
|
||
ipfw -q -f flush # Delete all rules
|
||
# Set defaults
|
||
oif="tun0" # out interface
|
||
odns="192.0.2.11" # ISP's DNS server IP address
|
||
cmd="ipfw -q add " # build rule prefix
|
||
ks="keep-state" # just too lazy to key this each time
|
||
$cmd 00500 check-state
|
||
$cmd 00502 deny all from any to any frag
|
||
$cmd 00501 deny tcp from any to any established
|
||
$cmd 00600 allow tcp from any to any 80 out via $oif setup $ks
|
||
$cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks
|
||
$cmd 00611 allow udp from any to $odns 53 out via $oif $ks
|
||
################### End of example ipfw rules script ############</programlisting>
|
||
|
||
<para>Αυτό είναι όλο. Στο παράδειγμα αυτό δεν είναι σημαντικοί οι
|
||
κανόνες, αλλά ο τρόπος με τον οποίο λειτουργούν και παίρνουν τιμές
|
||
τα πεδία συμβολικής υποκατάστασης.</para>
|
||
|
||
<para>Αν το παραπάνω παράδειγμα ήταν στο αρχείο
|
||
<filename>/etc/ipfw.rules</filename> θα μπορούσατε να φορτώσετε
|
||
αυτούς τους κανόνες, γράφοντας την παρακάτω εντολή:</para>
|
||
|
||
<screen>&prompt.root; <userinput>sh /etc/ipfw.rules</userinput></screen>
|
||
|
||
<para>Το αρχείο <filename>/etc/ipfw.rules</filename> μπορεί να
|
||
βρίσκεται σε όποιο κατάλογο θέλετε, και να ονομάζεται επίσης όπως
|
||
θέλετε.</para>
|
||
|
||
<para>Θα μπορούσατε να επιτύχετε το ίδιο πράγμα, εκτελώντας τις
|
||
παρακάτω εντολές χειροκίνητα:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ipfw -q -f flush</userinput>
|
||
&prompt.root; <userinput>ipfw -q add check-state</userinput>
|
||
&prompt.root; <userinput>ipfw -q add deny all from any to any frag</userinput>
|
||
&prompt.root; <userinput>ipfw -q add deny tcp from any to any established</userinput>
|
||
&prompt.root; <userinput>ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state</userinput>
|
||
&prompt.root; <userinput>ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state</userinput>
|
||
&prompt.root; <userinput>ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state</userinput></screen>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>Σύνολο Κανόνων Stateful</title>
|
||
|
||
<para>Το παρακάτω σύνολο κανόνων (που δεν περιέχει κανόνες για
|
||
<acronym>NAT</acronym>) είναι ένα παράδειγμα γραφής ενός inclusive
|
||
firewall. Ένα inclusive firewall επιτρέπει την είσοδο μόνο των
|
||
πακέτων που ταιριάζουν με τους κανόνες αποδοχής (pass) και
|
||
απορρίπτει από προεπιλογή όλα τα άλλα. Τα firewalls που έχουν
|
||
σχεδιαστεί να προστατεύουν ολόκληρα δίκτυα, διαθέτουν το λιγότερο
|
||
δύο διεπαφές, στις οποίες πρέπει να υπάρχουν κανόνες ώστε το
|
||
firewall να λειτουργεί.</para>
|
||
|
||
<para>Όλα τα λειτουργικά συστήματα τύπου &unix;, συμπεριλαμβανομένου
|
||
και του &os;, έχουν σχεδιαστεί να χρησιμοποιούν τη διεπαφή
|
||
<devicename>lo0</devicename> και τη διεύθυνση IP
|
||
<hostid role="ipaddr">127.0.0.1</hostid> για εσωτερική επικοινωνία
|
||
με το λειτουργικό σύστημα. Το firewall πρέπει να περιέχει κανόνες
|
||
που να επιτρέπουν την απρόσκοπτη κίνηση αυτών των ειδικών, για
|
||
εσωτερική χρήση, πακέτων.</para>
|
||
|
||
<para>Οι κανόνες που ορίζουν την πρόσβαση εισερχόμενων και
|
||
εξερχόμενων πακέτων, γράφονται για τη διεπαφή που συνδέεται στο
|
||
δημόσιο Internet. Η διεπαφή αυτή μπορεί να είναι για παράδειγμα η
|
||
<devicename>tun0</devicename> (σε περίπτωση που χρησιμοποιείτε το
|
||
<acronym>PPP</acronym> χρήστη), ή η κάρτα δικτύου που συνδέεται στο
|
||
καλωδιακό ή DSL modem σας.</para>
|
||
|
||
<para>Σε περίπτωση που μια ή περισσότερες κάρτες δικτύου συνδέονται σε
|
||
εσωτερικά ιδιωτικά δίκτυα πίσω από το firewall, θα πρέπει να
|
||
υπάρχουν οι αντίστοιχοι κανόνες που να επιτρέπουν την ελεύθερη
|
||
διακίνηση των πακέτων ανάμεσα στις διεπαφές αυτές ή/και στο
|
||
Internet.</para>
|
||
|
||
<para>Οι κανόνες πρέπει να οργανώνονται σε τρεις κύριες ενότητες:
|
||
αρχικά όλες οι διεπαφές στις οποίες επιτρέπεται η ελεύθερη διακίνηση
|
||
δεδομένων, έπειτα η διεπαφή από την οποία εξέρχονται τα πακέτα προς
|
||
το δημόσιο δίκτυο (Internet) και τέλος η διεπαφή από την οποία
|
||
λαμβάνονται πακέτα από το Internet.</para>
|
||
|
||
<para>Σε κάθε μια από τις ενότητες των διεπαφών που συνδέονται στο
|
||
Internet, πρέπει να τοποθετούνται πρώτοι οι κανόνες που ταιριάζουν
|
||
συχνότερα με την αντίστοιχη κίνηση. Ο τελευταίος κανόνας της
|
||
ενότητας θα πρέπει να απορρίπτει και να καταγράφει όλα τα πακέτα
|
||
της συγκεκριμένης διεπαφής/κατεύθυνσης.</para>
|
||
|
||
<para>Η ενότητα εξερχομένων (Outbound) στο σύνολο κανόνων που φαίνεται
|
||
παρακάτω, περιέχει μόνο κανόνες τύπου <literal>allow</literal>. Οι
|
||
κανόνες αυτοί περιέχουν συγκεκριμένες επιλεγμένες τιμές, με τις
|
||
οποίες αναγνωρίζεται με μοναδικό τρόπο η υπηρεσία στην οποία
|
||
επιτρέπεται η πρόσβαση από το δημόσιο Internet. Όλοι οι κανόνες
|
||
έχουν τις επιλογές <literal>proto</literal>,
|
||
<literal>port</literal>, <literal>in/out</literal> και
|
||
<literal>keep-state</literal>. Οι κανόνες τύπου
|
||
<literal>proto tcp</literal> περιέχουν την επιλογή
|
||
<literal>setup</literal> για την αναγνώριση του πακέτου έναρξης της
|
||
συνεδρίας, ώστε να γίνει η καταχώριση της στον πίνακα συνδέσεων
|
||
(stateful).</para>
|
||
|
||
<para>Στην ενότητα των εισερχόμενων πακέτων (Inbound) που φαίνεται
|
||
παρακάτω, εμφανίζονται πρώτοι οι κανόνες που χρησιμοποιούνται για
|
||
την απόρριψη των ανεπιθύμητων πακέτων. Αυτό γίνεται για δύο
|
||
διαφορετικούς λόγους. Ο πρώτος είναι ότι τα κακόβουλα πακέτα
|
||
μπορεί εν μέρει να ταιριάζουν με κάποια χαρακτηριστικά της έγκυρης
|
||
κίνησης. Τα πακέτα αυτά θα πρέπει να απορριφθούν, αντί να γίνουν
|
||
δεκτά από κάποιο επόμενο κανόνα <literal>allow</literal>.
|
||
Ο δεύτερος είναι ότι μπορείτε να απορρίψετε συγκεκριμένα πακέτα τα
|
||
οποία γνωρίζετε ότι δεν είναι έγκυρα, αλλά σας είναι αδιάφορη η
|
||
καταγραφή τους. Με τον τρόπο αυτό εμποδίζεται η λήψη και καταγραφή
|
||
τους από τον τελευταίο κανόνα. Ο τελευταίος κανόνας τυπικά
|
||
απορρίπτει και καταγράφει όλα τα πακέτα που έφτασαν μέχρι αυτόν.
|
||
Ο κανόνας αυτός χρησιμοποιείται για την παροχή νομικών αποδείξεων
|
||
σε περίπτωση που κινήσετε νομική διαδικασία κατά ατόμων που
|
||
προέβησαν σε επιθέσεις στο σύστημα σας.</para>
|
||
|
||
<para>Θα πρέπει επίσης να εξασφαλίσετε ότι το σύστημα σας δεν θα
|
||
δώσει καμιά απάντηση σε κανένα από τα ανεπιθύμητα πακέτα.
|
||
Τα πακέτα αυτά θα πρέπει να απορριφθούν και να εξαφανιστούν.
|
||
Με τον τρόπο αυτό, ο επιτιθέμενος δεν έχει καμιά γνώση αν τα πακέτα
|
||
του έφτασαν μέχρι το σύστημα σας. Όσο λιγότερα μπορούν να μάθουν
|
||
οι επιτιθέμενοι σχετικά με το σύστημα σας, τόσο πιο ασφαλές
|
||
είναι. Όταν εκτελείτε καταγραφή πακέτων με αριθμούς θυρών που δεν
|
||
αναγνωρίζετε, κοιτάξτε στο αρχείο
|
||
<filename>/etc/services/</filename> ή δείτε το <ulink
|
||
url="http://www.securitystats.com/tools/portsearch.php"></ulink>
|
||
και αναζητήστε τον αριθμό της θύρας για να δείτε ποιος είναι ο
|
||
σκοπός της. Ελέγξτε την παρακάτω τοποθεσία για τους αριθμούς θυρών
|
||
που χρησιμοποιούνται συχνά από κακόβουλα προγράμματα (Trojans):
|
||
<ulink url="http://www.simovits.com/trojans/trojans.html"></ulink>.</para>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>Ένα Υπόδειγμα Συνόλου Κανόνων Inclusive</title>
|
||
|
||
<para>Το παρακάτω σύνολο κανόνων (στο οποίο δεν υλοποιείται λειτουργία
|
||
<acronym>NAT</acronym>) είναι αρκετά πλήρες και πολύ ασφαλές.
|
||
Δημιουργεί firewall τύπου inclusive, και έχει δοκιμαστεί σε
|
||
πραγματικές συνθήκες λειτουργίας. Μπορεί να εξυπηρετήσει το ίδιο
|
||
καλά και το δικό σας σύστημα. Απλώς μετατρέψτε σε σχόλιο τους
|
||
κανόνες <literal>pass</literal> για τις υπηρεσίες που δεν θέλετε
|
||
να ενεργοποιήσετε. Για να αποφύγετε την καταγραφή ανεπιθύμητων
|
||
μηνυμάτων, απλώς προσθέστε ένα κανόνα τύπου
|
||
<literal>deny</literal> στην ενότητα των εισερχομένων. Σε όλους
|
||
τους κανόνες, Θα πρέπει να αλλάξετε το όνομα της διεπαφής από
|
||
<devicename>dc0</devicename> στο πραγματικό όνομα της διεπαφής που
|
||
συνδέεται στο δημόσιο Internet. Σε περίπτωση που χρησιμοποιείτε το
|
||
<acronym>PPP</acronym> χρήστη, το όνομα της διεπαφής θα είναι
|
||
<devicename>tun0</devicename>.</para>
|
||
|
||
<para>Θα διαπιστώσετε ότι υπάρχει μια συγκεκριμένη λογική στη χρήση
|
||
αυτών των κανόνων.</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Όλοι οι κανόνες που αποτελούν αίτηση για έναρξη μιας νέας
|
||
συνεδρίας με το δημόσιο Internet, χρησιμοποιούν την επιλογή
|
||
<literal>keep-state</literal>.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Όλες οι διαπιστευμένες υπηρεσίες που προέρχονται από το
|
||
δημόσιο Internet, διαθέτουν την επιλογή
|
||
<literal>limit</literal>, για την αποφυγή επιθέσεων
|
||
υπερχείλισης (flooding).</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Όλοι οι κανόνες χρησιμοποιούν τις επιλογές
|
||
<literal>in</literal> ή <literal>out</literal> για να
|
||
διευκρινίζουν την κατεύθυνση της επικοινωνίας.</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>Όλοι οι κανόνες χρησιμοποιούν την επιλογή
|
||
<literal>via <replaceable>όνομα-διεπαφής</replaceable></literal>
|
||
για να καθορίσουν τη διεπαφή από την οποία διέρχεται το
|
||
πακέτο.</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>Οι κανόνες που φαίνονται παρακάτω, θα πρέπει να γραφούν στο
|
||
<filename>/etc/ipfw.rules</filename>.</para>
|
||
|
||
<programlisting>################ Start of IPFW rules file ###############################
|
||
# Flush out the list before we begin.
|
||
ipfw -q -f flush
|
||
|
||
# Set rules command prefix
|
||
cmd="ipfw -q add"
|
||
pif="dc0" # public interface name of NIC
|
||
# facing the public Internet
|
||
|
||
#################################################################
|
||
# No restrictions on Inside LAN Interface for private network
|
||
# Not needed unless you have LAN.
|
||
# Change xl0 to your LAN NIC interface name
|
||
#################################################################
|
||
#$cmd 00005 allow all from any to any via xl0
|
||
|
||
#################################################################
|
||
# No restrictions on Loopback Interface
|
||
#################################################################
|
||
$cmd 00010 allow all from any to any via lo0
|
||
|
||
#################################################################
|
||
# Allow the packet through if it has previous been added to the
|
||
# the "dynamic" rules table by a allow keep-state statement.
|
||
#################################################################
|
||
$cmd 00015 check-state
|
||
|
||
#################################################################
|
||
# Interface facing Public Internet (Outbound Section)
|
||
# Check session start requests originating from behind the
|
||
# firewall on the private network or from this gateway server
|
||
# destined for the public Internet.
|
||
#################################################################
|
||
|
||
# Allow out access to my ISP's Domain name server.
|
||
# x.x.x.x must be the IP address of your ISP.s DNS
|
||
# Dup these lines if your ISP has more than one DNS server
|
||
# Get the IP addresses from /etc/resolv.conf file
|
||
$cmd 00110 allow tcp from any to x.x.x.x 53 out via $pif setup keep-state
|
||
$cmd 00111 allow udp from any to x.x.x.x 53 out via $pif keep-state
|
||
|
||
# Allow out access to my ISP's DHCP server for cable/DSL configurations.
|
||
# This rule is not needed for .user ppp. connection to the public Internet.
|
||
# so you can delete this whole group.
|
||
# Use the following rule and check log for IP address.
|
||
# Then put IP address in commented out rule & delete first rule
|
||
$cmd 00120 allow log udp from any to any 67 out via $pif keep-state
|
||
#$cmd 00120 allow udp from any to x.x.x.x 67 out via $pif keep-state
|
||
|
||
# Allow out non-secure standard www function
|
||
$cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state
|
||
|
||
# Allow out secure www function https over TLS SSL
|
||
$cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state
|
||
|
||
# Allow out send & get email function
|
||
$cmd 00230 allow tcp from any to any 25 out via $pif setup keep-state
|
||
$cmd 00231 allow tcp from any to any 110 out via $pif setup keep-state
|
||
|
||
# Allow out FBSD (make install & CVSUP) functions
|
||
# Basically give user root "GOD" privileges.
|
||
$cmd 00240 allow tcp from me to any out via $pif setup keep-state uid root
|
||
|
||
# Allow out ping
|
||
$cmd 00250 allow icmp from any to any out via $pif keep-state
|
||
|
||
# Allow out Time
|
||
$cmd 00260 allow tcp from any to any 37 out via $pif setup keep-state
|
||
|
||
# Allow out nntp news (i.e. news groups)
|
||
$cmd 00270 allow tcp from any to any 119 out via $pif setup keep-state
|
||
|
||
# Allow out secure FTP, Telnet, and SCP
|
||
# This function is using SSH (secure shell)
|
||
$cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state
|
||
|
||
# Allow out whois
|
||
$cmd 00290 allow tcp from any to any 43 out via $pif setup keep-state
|
||
|
||
# deny and log everything else that.s trying to get out.
|
||
# This rule enforces the block all by default logic.
|
||
$cmd 00299 deny log all from any to any out via $pif
|
||
|
||
#################################################################
|
||
# Interface facing Public Internet (Inbound Section)
|
||
# Check packets originating from the public Internet
|
||
# destined for this gateway server or the private network.
|
||
#################################################################
|
||
|
||
# Deny all inbound traffic from non-routable reserved address spaces
|
||
$cmd 00300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP
|
||
$cmd 00301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP
|
||
$cmd 00302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP
|
||
$cmd 00303 deny all from 127.0.0.0/8 to any in via $pif #loopback
|
||
$cmd 00304 deny all from 0.0.0.0/8 to any in via $pif #loopback
|
||
$cmd 00305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config
|
||
$cmd 00306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs
|
||
$cmd 00307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster interconnect
|
||
$cmd 00308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast
|
||
|
||
# Deny public pings
|
||
$cmd 00310 deny icmp from any to any in via $pif
|
||
|
||
# Deny ident
|
||
$cmd 00315 deny tcp from any to any 113 in via $pif
|
||
|
||
# Deny all Netbios service. 137=name, 138=datagram, 139=session
|
||
# Netbios is MS/Windows sharing services.
|
||
# Block MS/Windows hosts2 name server requests 81
|
||
$cmd 00320 deny tcp from any to any 137 in via $pif
|
||
$cmd 00321 deny tcp from any to any 138 in via $pif
|
||
$cmd 00322 deny tcp from any to any 139 in via $pif
|
||
$cmd 00323 deny tcp from any to any 81 in via $pif
|
||
|
||
# Deny any late arriving packets
|
||
$cmd 00330 deny all from any to any frag in via $pif
|
||
|
||
# Deny ACK packets that did not match the dynamic rule table
|
||
$cmd 00332 deny tcp from any to any established in via $pif
|
||
|
||
# Allow traffic in from ISP's DHCP server. This rule must contain
|
||
# the IP address of your ISP.s DHCP server as it.s the only
|
||
# authorized source to send this packet type.
|
||
# Only necessary for cable or DSL configurations.
|
||
# This rule is not needed for .user ppp. type connection to
|
||
# the public Internet. This is the same IP address you captured
|
||
# and used in the outbound section.
|
||
#$cmd 00360 allow udp from any to x.x.x.x 67 in via $pif keep-state
|
||
|
||
# Allow in standard www function because I have apache server
|
||
$cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2
|
||
|
||
# Allow in secure FTP, Telnet, and SCP from public Internet
|
||
$cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2
|
||
|
||
# Allow in non-secure Telnet session from public Internet
|
||
# labeled non-secure because ID & PW are passed over public
|
||
# Internet as clear text.
|
||
# Delete this sample group if you do not have telnet server enabled.
|
||
$cmd 00420 allow tcp from any to me 23 in via $pif setup limit src-addr 2
|
||
|
||
# Reject & Log all incoming connections from the outside
|
||
$cmd 00499 deny log all from any to any in via $pif
|
||
|
||
# Everything else is denied by default
|
||
# deny and log all packets that fell through to see what they are
|
||
$cmd 00999 deny log all from any to any
|
||
################ End of IPFW rules file ###############################</programlisting>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>Ένα Υπόδειγμα <acronym>NAT</acronym> με Stateful Σύνολο
|
||
Κανόνων</title>
|
||
|
||
<indexterm>
|
||
<primary>NAT</primary>
|
||
<secondary>and IPFW</secondary>
|
||
</indexterm>
|
||
|
||
<para>Για να ενεργοποιηθεί η λειτουργία <acronym>NAT</acronym> στο
|
||
IPFW, χρειάζονται κάποιες επιπλέον ρυθμίσεις. Θα πρέπει να
|
||
προσθέσετε την επιλογή <literal>option IPDIVERT</literal> μαζί με
|
||
τις υπόλοιπες επιλογές για το IPFIREWALL στο αρχείο ρυθμίσεων του
|
||
πυρήνα. Θα πρέπει έπειτα να μεταγλωττίσετε και να εγκαταστήσετε
|
||
το νέο σας προσαρμοσμένο πυρήνα.</para>
|
||
|
||
<para>Εκτός από τις συνηθισμένες επιλογές για το IPFW, θα πρέπει να
|
||
προσθέσετε και τις παρακάτω στο αρχείο
|
||
<filename>/etc/rc.conf</filename>:</para>
|
||
|
||
<programlisting>natd_enable="YES" # Enable <acronym>NAT</acronym>D function
|
||
natd_interface="rl0" # interface name of public Internet NIC
|
||
natd_flags="-dynamic -m" # -m = preserve port numbers if possible</programlisting>
|
||
|
||
<para>Η χρήση κανόνων stateful μαζί με τον κανόνα
|
||
<literal>divert natd</literal> (NAT), περιπλέκει πολύ την λογική
|
||
συγγραφής των κανόνων. Η θέση εμφάνισης των κανόνων
|
||
<literal>check-state</literal> και <literal>divert natd</literal>
|
||
μέσα στο σύνολο κανόνων γίνεται πολύ κρίσιμη. Δεν πρόκειται πλέον
|
||
για απλή λογική περάσματος από τον ένα κανόνα στον επόμενο.
|
||
Χρησιμοποιείται ένα νέο είδος ενέργειας που ονομάζεται
|
||
<literal>skipto</literal>. Για να χρησιμοποιηθεί η εντολή
|
||
<literal>skipto</literal>, είναι υποχρεωτικό να έχετε αριθμήσει τους
|
||
κανόνες, ώστε να ξέρετε σε ποιο κανόνα θα καταλήξει το άλμα που θα
|
||
εκτελεστεί από την εντολή αυτή.</para>
|
||
|
||
<para>Παρακάτω θα βρείτε ένα υπόδειγμα (χωρίς πρόσθετα σχόλια) μιας
|
||
μεθόδου συγγραφής που επιλέξαμε εδώ για να εξηγήσουμε την ακολουθία
|
||
ροής του πακέτου μέσα στο σύνολο κανόνων.</para>
|
||
|
||
<para>Η ροή της επεξεργασίας ξεκινάει με τον πρώτο από την κορυφή
|
||
κανόνα και συνεχίζει ένα κανόνα κάθε φορά προς τα κάτω, είτε μέχρι
|
||
να φτάσει τον τελευταίο, ή μέχρι το πακέτο να ταιριάξει με τα
|
||
κριτήρια επιλογής κάποιου κανόνα και να ελευθερωθεί από το firewall.
|
||
Είναι σημαντικό να παρατηρήσουμε τη θέση των κανόνων με αριθμούς
|
||
100, 101, 450, 500 και 510. Οι κανόνες αυτοί ελέγχουν την
|
||
μετάφραση των εξερχόμενων και εισερχόμενων πακέτων, ώστε οι
|
||
καταχωρήσεις τους στο δυναμικό πίνακα καταστάσεων να περιέχουν
|
||
πάντα την ιδιωτική IP διεύθυνση του τοπικού δικτύου. Παρατηρήστε
|
||
επίσης ότι όλοι οι κανόνες allow και deny καθορίζουν την κατεύθυνση
|
||
κίνησης του πακέτου καθώς και την διεπαφή. Επίσης, όλες οι
|
||
εξερχόμενες αιτήσεις για νέες συνεδρίες μεταφέρονται απευθείας
|
||
(μέσω του <literal>skipto rule 500</literal>) στον κανόνα 500 για
|
||
να γίνει η μετάφραση διευθύνσεων δικτύου (NAT).</para>
|
||
|
||
<para>Ας υποθέσουμε ότι ένα χρήστης του τοπικού δικτύου χρησιμοποιεί
|
||
τον φυλλομετρητή του για να δει μια ιστοσελίδα. Οι ιστοσελίδες
|
||
χρησιμοποιούν την πόρτα 80 για την επικοινωνία. Το πακέτο
|
||
εισέρχεται στο firewall. Δεν ταιριάζει με τον κανόνα 100 γιατί
|
||
είναι εξερχόμενο και όχι εισερχόμενο. Περνάει τον κανόνα 101 γιατί
|
||
πρόκειται για νέα επικοινωνία και έτσι δεν υπάρχει ακόμα στον
|
||
δυναμικό πίνακα καταστάσεων. Το πακέτο τελικά φτάνει στον κανόνα
|
||
125 με τον οποίο και ταιριάζει. Εξέρχεται μέσω της κάρτας δικτύου
|
||
που συνδέεται στο δημόσιο Internet. Το πακέτο έχει ακόμα ως IP
|
||
αφετηρίας την ιδιωτική διεύθυνση του τοπικού δικτύου. Το ταίριασμα
|
||
με αυτό τον κανόνα προκαλεί δύο ενέργειες. Η επιλογή
|
||
<literal>keep-state</literal> θα δημιουργήσει ένα νέο δυναμικό
|
||
κανόνα, θα τον καταχωρήσει στον πίνακα, και θα εκτελέσει την
|
||
αντίστοιχη ενέργεια. Η ενέργεια αυτή είναι μέρος της πληροφορίας
|
||
που γράφεται στον δυναμικό πίνακα. Στην περίπτωση αυτή είναι
|
||
η <quote>skipto rule 500</quote>. Ο κανόνας 500 μεταφράζει μέσω
|
||
<acronym>NAT</acronym> τη διεύθυνση IP του πακέτου, πριν αυτό
|
||
εξέλθει προς το Internet. Αυτό είναι ιδιαίτερα σημαντικό.
|
||
Το πακέτο κατευθύνεται προς τον προορισμό του, όπου δημιουργείται
|
||
και αποστέλλεται ένα νέο πακέτο ως απάντηση. Το νέο αυτό πακέτο
|
||
εισέρχεται ξανά στο firewall, στον κανόνα που είναι στην κορυφή
|
||
της λίστας. Αυτή τη φορά ταιριάζει με τον κανόνα 100 και η
|
||
διεύθυνση προορισμού του αλλάζει ξανά στην αρχική του τοπικού
|
||
δικτύου. Έπειτα, γίνεται η επεξεργασία του από τον κανόνα
|
||
<literal>check-state</literal> ο οποίος ανακαλύπτει ότι πρόκειται
|
||
για πακέτο συνεδρίας σε εξέλιξη και το απελευθερώνει στο τοπικό
|
||
δίκτυο. Κατευθύνεται προς τον υπολογιστή του τοπικού δικτύου που το
|
||
έστειλε, ο οποίος στέλνει ένα νέο πακέτο ζητώντας περισσότερα
|
||
δεδομένα από τον απομακρυσμένο εξυπηρετητή. Το πακέτο αυτό
|
||
ελέγχεται από τον κανόνα <literal>check-state</literal>, ο οποίος
|
||
βρίσκει την καταχώριση του στα εξερχόμενα και εκτελεί την αντίστοιχη
|
||
ενέργεια που σε αυτή την περίπτωση είναι <quote>skipto 500</quote>.
|
||
Το πακέτο προωθείται στον κανόνα 500, γίνεται η μετάφραση της
|
||
διεύθυνσης του μέσω <acronym>NAT</acronym> και απελευθερώνεται στο
|
||
Internet.</para>
|
||
|
||
<para>Από την μεριά των εισερχόμενων, όποιο πακέτο αναγνωρίζεται ως
|
||
μέρος μιας υπάρχουσας συνεδρίας, ελέγχεται αυτόματα από τον κανόνα
|
||
<literal>check-state</literal> και τους αντίστοιχους κανόνες
|
||
<literal>divert natd</literal>. Το μόνο που χρειάζεται να
|
||
αντιμετωπίσουμε είναι η απόρριψη όλων των προβληματικών πακέτων και
|
||
η έγκριση μόνο των πακέτων που προορίζονται για εγκεκριμένες
|
||
υπηρεσίες. Ας υποθέσουμε ότι έχουμε ένα εξυπηρετητή apache ο οποίος
|
||
εκτελείται στο μηχάνημα με το firewall, και επιθυμούμε το τοπικό
|
||
site να είναι προσβάσιμο από το δημόσιο Internet. Η εισερχόμενη
|
||
αίτηση νέας συνεδρίας ταιριάζει με τον κανόνα 100 και η IP διεύθυνση
|
||
της αντιστοιχίζεται στο τοπικό IP του μηχανήματος με το firewall.
|
||
Το πακέτο έπειτα ελέγχεται για οποιοδήποτε πρόβλημα μπορεί να έχει
|
||
σύμφωνα με τους κανόνες που χρησιμοποιούμε, και τελικά ταιριάζει με
|
||
τον κανόνα 425. Στην περίπτωση αυτή συμβαίνουν δύο πράγματα.
|
||
Ο κανόνας για το πακέτο γράφεται στο δυναμικό πίνακα καταστάσεων,
|
||
αλλά αυτή τη φορά περιορίζεται ο αριθμός αιτήσεων νέας συνεδρίας
|
||
από το συγκεκριμένο IP σε 2. Με αυτό τον τρόπο μπορούμε να
|
||
αμυνθούμε σε επιθέσεις τύπου άρνησης υπηρεσίας (DoS) όσο αφορά τη
|
||
συγκεκριμένη θύρα επικοινωνίας. Η ενέργεια του κανόνα είναι το
|
||
<literal>allow</literal>, και έτσι το πακέτο απελευθερώνεται στο
|
||
τοπικό δίκτυο. Το πακέτο που παράγεται ως απάντηση, ελέγχεται από
|
||
τον κανόνα <literal>check-state</literal>, ο οποίος αναγνωρίζει ότι
|
||
ανήκει σε μια ήδη ενεργή συνεδρία, και αποστέλλεται στον κανόνα 500
|
||
όπου γίνεται η μετάφραση της διεύθυνσης του μέσω
|
||
<acronym>NAT</acronym>. Το πακέτο τελικά απελευθερώνεται μέσω της
|
||
διεπαφής εξερχομένων.</para>
|
||
|
||
<para>Υπόδειγμα Κανόνων #1:</para>
|
||
|
||
<programlisting>#!/bin/sh
|
||
cmd="ipfw -q add"
|
||
skip="skipto 500"
|
||
pif=rl0
|
||
ks="keep-state"
|
||
good_tcpo="22,25,37,43,53,80,443,110,119"
|
||
|
||
ipfw -q -f flush
|
||
|
||
$cmd 002 allow all from any to any via xl0 # exclude LAN traffic
|
||
$cmd 003 allow all from any to any via lo0 # exclude loopback traffic
|
||
|
||
$cmd 100 divert natd ip from any to any in via $pif
|
||
$cmd 101 check-state
|
||
|
||
# Authorized outbound packets
|
||
$cmd 120 $skip udp from any to xx.168.240.2 53 out via $pif $ks
|
||
$cmd 121 $skip udp from any to xx.168.240.5 53 out via $pif $ks
|
||
$cmd 125 $skip tcp from any to any $good_tcpo out via $pif setup $ks
|
||
$cmd 130 $skip icmp from any to any out via $pif $ks
|
||
$cmd 135 $skip udp from any to any 123 out via $pif $ks
|
||
|
||
|
||
# Deny all inbound traffic from non-routable reserved address spaces
|
||
$cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP
|
||
$cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP
|
||
$cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP
|
||
$cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback
|
||
$cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback
|
||
$cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config
|
||
$cmd 306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs
|
||
$cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster
|
||
$cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast
|
||
|
||
# Authorized inbound packets
|
||
$cmd 400 allow udp from xx.70.207.54 to any 68 in $ks
|
||
$cmd 420 allow tcp from any to me 80 in via $pif setup limit src-addr 1
|
||
|
||
|
||
$cmd 450 deny log ip from any to any
|
||
|
||
# This is skipto location for outbound stateful rules
|
||
$cmd 500 divert natd ip from any to any out via $pif
|
||
$cmd 510 allow ip from any to any
|
||
|
||
######################## end of rules ##################</programlisting>
|
||
|
||
<para>Οι παρακάτω κανόνες είναι σχεδόν ίδιοι με τους παραπάνω, αλλά
|
||
περιέχουν περισσότερα σχόλια για να βοηθήσουν τον αρχάριο χρήστη
|
||
του IPFW να καταλάβει καλύτερα πως λειτουργούν.</para>
|
||
|
||
<para>Υπόδειγμα Κανόνων #2:</para>
|
||
|
||
<programlisting>#!/bin/sh
|
||
################ Start of IPFW rules file ###############################
|
||
# Flush out the list before we begin.
|
||
ipfw -q -f flush
|
||
|
||
# Set rules command prefix
|
||
cmd="ipfw -q add"
|
||
skip="skipto 800"
|
||
pif="rl0" # public interface name of NIC
|
||
# facing the public Internet
|
||
|
||
#################################################################
|
||
# No restrictions on Inside LAN Interface for private network
|
||
# Change xl0 to your LAN NIC interface name
|
||
#################################################################
|
||
$cmd 005 allow all from any to any via xl0
|
||
|
||
#################################################################
|
||
# No restrictions on Loopback Interface
|
||
#################################################################
|
||
$cmd 010 allow all from any to any via lo0
|
||
|
||
#################################################################
|
||
# check if packet is inbound and nat address if it is
|
||
#################################################################
|
||
$cmd 014 divert natd ip from any to any in via $pif
|
||
|
||
#################################################################
|
||
# Allow the packet through if it has previous been added to the
|
||
# the "dynamic" rules table by a allow keep-state statement.
|
||
#################################################################
|
||
$cmd 015 check-state
|
||
|
||
#################################################################
|
||
# Interface facing Public Internet (Outbound Section)
|
||
# Check session start requests originating from behind the
|
||
# firewall on the private network or from this gateway server
|
||
# destined for the public Internet.
|
||
#################################################################
|
||
|
||
# Allow out access to my ISP's Domain name server.
|
||
# x.x.x.x must be the IP address of your ISP's DNS
|
||
# Dup these lines if your ISP has more than one DNS server
|
||
# Get the IP addresses from /etc/resolv.conf file
|
||
$cmd 020 $skip tcp from any to x.x.x.x 53 out via $pif setup keep-state
|
||
|
||
|
||
# Allow out access to my ISP's DHCP server for cable/DSL configurations.
|
||
$cmd 030 $skip udp from any to x.x.x.x 67 out via $pif keep-state
|
||
|
||
# Allow out non-secure standard www function
|
||
$cmd 040 $skip tcp from any to any 80 out via $pif setup keep-state
|
||
|
||
# Allow out secure www function https over TLS SSL
|
||
$cmd 050 $skip tcp from any to any 443 out via $pif setup keep-state
|
||
|
||
# Allow out send & get email function
|
||
$cmd 060 $skip tcp from any to any 25 out via $pif setup keep-state
|
||
$cmd 061 $skip tcp from any to any 110 out via $pif setup keep-state
|
||
|
||
# Allow out FreeBSD (make install & CVSUP) functions
|
||
# Basically give user root "GOD" privileges.
|
||
$cmd 070 $skip tcp from me to any out via $pif setup keep-state uid root
|
||
|
||
# Allow out ping
|
||
$cmd 080 $skip icmp from any to any out via $pif keep-state
|
||
|
||
# Allow out Time
|
||
$cmd 090 $skip tcp from any to any 37 out via $pif setup keep-state
|
||
|
||
# Allow out nntp news (i.e. news groups)
|
||
$cmd 100 $skip tcp from any to any 119 out via $pif setup keep-state
|
||
|
||
# Allow out secure FTP, Telnet, and SCP
|
||
# This function is using SSH (secure shell)
|
||
$cmd 110 $skip tcp from any to any 22 out via $pif setup keep-state
|
||
|
||
# Allow out whois
|
||
$cmd 120 $skip tcp from any to any 43 out via $pif setup keep-state
|
||
|
||
# Allow ntp time server
|
||
$cmd 130 $skip udp from any to any 123 out via $pif keep-state
|
||
|
||
#################################################################
|
||
# Interface facing Public Internet (Inbound Section)
|
||
# Check packets originating from the public Internet
|
||
# destined for this gateway server or the private network.
|
||
#################################################################
|
||
|
||
# Deny all inbound traffic from non-routable reserved address spaces
|
||
$cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP
|
||
$cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP
|
||
$cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP
|
||
$cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback
|
||
$cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback
|
||
$cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config
|
||
$cmd 306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs
|
||
$cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster
|
||
$cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast
|
||
|
||
# Deny ident
|
||
$cmd 315 deny tcp from any to any 113 in via $pif
|
||
|
||
# Deny all Netbios service. 137=name, 138=datagram, 139=session
|
||
# Netbios is MS/Windows sharing services.
|
||
# Block MS/Windows hosts2 name server requests 81
|
||
$cmd 320 deny tcp from any to any 137 in via $pif
|
||
$cmd 321 deny tcp from any to any 138 in via $pif
|
||
$cmd 322 deny tcp from any to any 139 in via $pif
|
||
$cmd 323 deny tcp from any to any 81 in via $pif
|
||
|
||
# Deny any late arriving packets
|
||
$cmd 330 deny all from any to any frag in via $pif
|
||
|
||
# Deny ACK packets that did not match the dynamic rule table
|
||
$cmd 332 deny tcp from any to any established in via $pif
|
||
|
||
# Allow traffic in from ISP's DHCP server. This rule must contain
|
||
# the IP address of your ISP's DHCP server as it's the only
|
||
# authorized source to send this packet type.
|
||
# Only necessary for cable or DSL configurations.
|
||
# This rule is not needed for 'user ppp' type connection to
|
||
# the public Internet. This is the same IP address you captured
|
||
# and used in the outbound section.
|
||
$cmd 360 allow udp from x.x.x.x to any 68 in via $pif keep-state
|
||
|
||
# Allow in standard www function because I have Apache server
|
||
$cmd 370 allow tcp from any to me 80 in via $pif setup limit src-addr 2
|
||
|
||
# Allow in secure FTP, Telnet, and SCP from public Internet
|
||
$cmd 380 allow tcp from any to me 22 in via $pif setup limit src-addr 2
|
||
|
||
# Allow in non-secure Telnet session from public Internet
|
||
# labeled non-secure because ID & PW are passed over public
|
||
# Internet as clear text.
|
||
# Delete this sample group if you do not have telnet server enabled.
|
||
$cmd 390 allow tcp from any to me 23 in via $pif setup limit src-addr 2
|
||
|
||
# Reject & Log all unauthorized incoming connections from the public Internet
|
||
$cmd 400 deny log all from any to any in via $pif
|
||
|
||
# Reject & Log all unauthorized out going connections to the public Internet
|
||
$cmd 450 deny log all from any to any out via $pif
|
||
|
||
# This is skipto location for outbound stateful rules
|
||
$cmd 800 divert natd ip from any to any out via $pif
|
||
$cmd 801 allow ip from any to any
|
||
|
||
# Everything else is denied by default
|
||
# deny and log all packets that fell through to see what they are
|
||
$cmd 999 deny log all from any to any
|
||
################ End of IPFW rules file ###############################</programlisting>
|
||
</sect3>
|
||
</sect2>
|
||
</sect1>
|
||
</chapter>
|