doc/el_GR.ISO8859-7/books/handbook/firewalls/chapter.sgml
Gabor Kovesdan 7ba98a21ad MFH
Approved by:	doceng (implicit)
2012-08-19 23:05:52 +00:00

3544 lines
154 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;&nbsp;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&nbsp;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;&nbsp;8.<replaceable>X</replaceable> και οι προηγούμενες
εκδόσεις χρησιμοποιούν την ίδια έκδοση του <acronym>PF</acronym>
που χρησιμοποιεί και το OpenBSD&nbsp;4.1.
Το &os;&nbsp;9.<replaceable>X</replaceable> και νεώτερες
εκδόσεις χρησιμοποιούν την ίδια έκδοση του
<acronym>PF</acronym> με το OpenBSD&nbsp;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 &amp; 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 &amp; 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>Οι διευθύνσεις. Πρόκειται στην πραγματικότητα για τρία
πεδία: τη διεύθυνση και τη θύρα αφετηρίας (χωρίζονται με κόμμα),
το σύμβολο -&gt; και την διεύθυνση και θύρα προορισμού, π.χ.
<literal>209.53.17.22,80 -&gt; 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>&dollar;</literal>.</para>
<para>Τα συμβολικά πεδία δεν έχουν την προσημείωση με το
&dollar;.</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 &gt; /etc/ipf.rules &lt;&lt; EOF
#
# 2) This can be used to run script "as is":
/sbin/ipf -Fa -f - &lt;&lt; EOF
# Allow out access to my ISP's Domain name server.
pass out quick on &dollar;oif proto tcp from any to &dollar;odns port = 53 &dollar;fks
pass out quick on &dollar;oif proto udp from any to &dollar;odns port = 53 &dollar;ks
# Allow out non-secure standard www function
pass out quick on &dollar;oif proto tcp from &dollar;myip to any port = 80 &dollar;fks
# Allow out secure www function https over TLS SSL
pass out quick on &dollar;oif proto tcp from &dollar;myip to any port = 443 &dollar;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 "=" | "!=" | "&lt;" | "&gt;" | "&lt;=" | "&gt;=" |
"eq" | "ne" | "lt" | "gt" | "le" | "ge".</para>
<para>Για να καθορίσετε περιοχές θυρών, χρησιμοποιήστε
port "&lt;&gt;" | "&gt;&lt;"</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 μπορεί να
προστατεύει μόνο το σύστημα στο οποίο εκτελείται&mdash;αυτό καλείται
<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 &amp; 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 &amp; 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 &amp; LAN users' non-secure FTP ( both passive &amp; 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 &amp; 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> -&gt; <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 -&gt; 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 -&gt; 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 -&gt; 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 -&gt; 204.134.75.1</programlisting>
<para>μπορούμε να χρησιμοποιήσουμε ένα εύρος IP διευθύνσεων, είτε με
τη χρήση μάσκας δικτύου:</para>
<programlisting>map dc0 192.168.1.0/24 -&gt; 204.134.75.0/255.255.255.0</programlisting>
<para>είτε με συμβολισμό CIDR:</para>
<programlisting>map dc0 192.168.1.0/24 -&gt; 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 -&gt; 10.0.10.25 port 80</programlisting>
<para>ή:</para>
<programlisting>rdr dc0 0.0.0.0/0 port 80 -&gt; 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 -&gt; 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 -&gt; 0/32 proxy port 21 ftp/tcp</programlisting>
<para>Ο παρακάτω κανόνας χειρίζεται την κίνηση FTP από την
πύλη (gateway):</para>
<programlisting>map dc0 0.0.0.0/0 -&gt; 0/32 proxy port 21 ftp/tcp</programlisting>
<para>Ο παρακάτω κανόνας χειρίζεται όλη την κίνηση από το εσωτερικό
LAN που δεν ανήκει στο πρωτόκολλο FTP:</para>
<programlisting>map dc0 10.0.10.0/29 -&gt; 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 &gt; 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> &mdash; επιτρέπει τη διέλευση όλης
της κίνησης.</para>
</listitem>
<listitem>
<para><literal>client</literal> &mdash; προστατεύει μόνο το
συγκεκριμένο μηχάνημα.</para>
</listitem>
<listitem>
<para><literal>simple</literal> &mdash; προστατεύει ολόκληρο το
δίκτυο.</para>
</listitem>
<listitem>
<para><literal>closed</literal> &mdash; απενεργοποιεί εντελώς την
κίνηση πακέτων, εκτός από την εσωτερική διεπαφή (loopback).</para>
</listitem>
<listitem>
<para><literal>UNKNOWN</literal> &mdash; απενεργοποιεί την φόρτωση
κανόνων του firewall.</para>
</listitem>
<listitem>
<para><filename><replaceable>filename</replaceable></filename>
&mdash; το πλήρες μονοπάτι του αρχείου που περιέχει τους κανόνες
του 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;. Μπροστά από τα πεδία
της συμβολικής υποκατάστασης, υπάρχει το σήμα του δολαρίου,
&dollar;. Το σύμβολο αυτό δεν υπάρχει μπροστά από τα συμβολικά
πεδία. Η τιμή που θα αποδοθεί στο συμβολικό πεδίο, πρέπει να
εσωκλείεται σε διπλά εισαγωγικά.</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
&dollar;cmd 00500 check-state
&dollar;cmd 00502 deny all from any to any frag
&dollar;cmd 00501 deny tcp from any to any established
&dollar;cmd 00600 allow tcp from any to any 80 out via &dollar;oif setup &dollar;ks
&dollar;cmd 00610 allow tcp from any to &dollar;odns 53 out via &dollar;oif setup &dollar;ks
&dollar;cmd 00611 allow udp from any to &dollar;odns 53 out via &dollar;oif &dollar;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
#################################################################
#&dollar;cmd 00005 allow all from any to any via xl0
#################################################################
# No restrictions on Loopback Interface
#################################################################
&dollar;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.
#################################################################
&dollar;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
&dollar;cmd 00110 allow tcp from any to x.x.x.x 53 out via &dollar;pif setup keep-state
&dollar;cmd 00111 allow udp from any to x.x.x.x 53 out via &dollar;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 &amp; delete first rule
&dollar;cmd 00120 allow log udp from any to any 67 out via &dollar;pif keep-state
#&dollar;cmd 00120 allow udp from any to x.x.x.x 67 out via &dollar;pif keep-state
# Allow out non-secure standard www function
&dollar;cmd 00200 allow tcp from any to any 80 out via &dollar;pif setup keep-state
# Allow out secure www function https over TLS SSL
&dollar;cmd 00220 allow tcp from any to any 443 out via &dollar;pif setup keep-state
# Allow out send &amp; get email function
&dollar;cmd 00230 allow tcp from any to any 25 out via &dollar;pif setup keep-state
&dollar;cmd 00231 allow tcp from any to any 110 out via &dollar;pif setup keep-state
# Allow out FBSD (make install &amp; CVSUP) functions
# Basically give user root "GOD" privileges.
&dollar;cmd 00240 allow tcp from me to any out via &dollar;pif setup keep-state uid root
# Allow out ping
&dollar;cmd 00250 allow icmp from any to any out via &dollar;pif keep-state
# Allow out Time
&dollar;cmd 00260 allow tcp from any to any 37 out via &dollar;pif setup keep-state
# Allow out nntp news (i.e. news groups)
&dollar;cmd 00270 allow tcp from any to any 119 out via &dollar;pif setup keep-state
# Allow out secure FTP, Telnet, and SCP
# This function is using SSH (secure shell)
&dollar;cmd 00280 allow tcp from any to any 22 out via &dollar;pif setup keep-state
# Allow out whois
&dollar;cmd 00290 allow tcp from any to any 43 out via &dollar;pif setup keep-state
# deny and log everything else that.s trying to get out.
# This rule enforces the block all by default logic.
&dollar;cmd 00299 deny log all from any to any out via &dollar;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
&dollar;cmd 00300 deny all from 192.168.0.0/16 to any in via &dollar;pif #RFC 1918 private IP
&dollar;cmd 00301 deny all from 172.16.0.0/12 to any in via &dollar;pif #RFC 1918 private IP
&dollar;cmd 00302 deny all from 10.0.0.0/8 to any in via &dollar;pif #RFC 1918 private IP
&dollar;cmd 00303 deny all from 127.0.0.0/8 to any in via &dollar;pif #loopback
&dollar;cmd 00304 deny all from 0.0.0.0/8 to any in via &dollar;pif #loopback
&dollar;cmd 00305 deny all from 169.254.0.0/16 to any in via &dollar;pif #DHCP auto-config
&dollar;cmd 00306 deny all from 192.0.2.0/24 to any in via &dollar;pif #reserved for docs
&dollar;cmd 00307 deny all from 204.152.64.0/23 to any in via &dollar;pif #Sun cluster interconnect
&dollar;cmd 00308 deny all from 224.0.0.0/3 to any in via &dollar;pif #Class D &amp; E multicast
# Deny public pings
&dollar;cmd 00310 deny icmp from any to any in via &dollar;pif
# Deny ident
&dollar;cmd 00315 deny tcp from any to any 113 in via &dollar;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
&dollar;cmd 00320 deny tcp from any to any 137 in via &dollar;pif
&dollar;cmd 00321 deny tcp from any to any 138 in via &dollar;pif
&dollar;cmd 00322 deny tcp from any to any 139 in via &dollar;pif
&dollar;cmd 00323 deny tcp from any to any 81 in via &dollar;pif
# Deny any late arriving packets
&dollar;cmd 00330 deny all from any to any frag in via &dollar;pif
# Deny ACK packets that did not match the dynamic rule table
&dollar;cmd 00332 deny tcp from any to any established in via &dollar;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.
#&dollar;cmd 00360 allow udp from any to x.x.x.x 67 in via &dollar;pif keep-state
# Allow in standard www function because I have apache server
&dollar;cmd 00400 allow tcp from any to me 80 in via &dollar;pif setup limit src-addr 2
# Allow in secure FTP, Telnet, and SCP from public Internet
&dollar;cmd 00410 allow tcp from any to me 22 in via &dollar;pif setup limit src-addr 2
# Allow in non-secure Telnet session from public Internet
# labeled non-secure because ID &amp; PW are passed over public
# Internet as clear text.
# Delete this sample group if you do not have telnet server enabled.
&dollar;cmd 00420 allow tcp from any to me 23 in via &dollar;pif setup limit src-addr 2
# Reject &amp; Log all incoming connections from the outside
&dollar;cmd 00499 deny log all from any to any in via &dollar;pif
# Everything else is denied by default
# deny and log all packets that fell through to see what they are
&dollar;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
&dollar;cmd 002 allow all from any to any via xl0 # exclude LAN traffic
&dollar;cmd 003 allow all from any to any via lo0 # exclude loopback traffic
&dollar;cmd 100 divert natd ip from any to any in via &dollar;pif
&dollar;cmd 101 check-state
# Authorized outbound packets
&dollar;cmd 120 &dollar;skip udp from any to xx.168.240.2 53 out via &dollar;pif &dollar;ks
&dollar;cmd 121 &dollar;skip udp from any to xx.168.240.5 53 out via &dollar;pif &dollar;ks
&dollar;cmd 125 &dollar;skip tcp from any to any &dollar;good_tcpo out via &dollar;pif setup &dollar;ks
&dollar;cmd 130 &dollar;skip icmp from any to any out via &dollar;pif &dollar;ks
&dollar;cmd 135 &dollar;skip udp from any to any 123 out via &dollar;pif &dollar;ks
# Deny all inbound traffic from non-routable reserved address spaces
&dollar;cmd 300 deny all from 192.168.0.0/16 to any in via &dollar;pif #RFC 1918 private IP
&dollar;cmd 301 deny all from 172.16.0.0/12 to any in via &dollar;pif #RFC 1918 private IP
&dollar;cmd 302 deny all from 10.0.0.0/8 to any in via &dollar;pif #RFC 1918 private IP
&dollar;cmd 303 deny all from 127.0.0.0/8 to any in via &dollar;pif #loopback
&dollar;cmd 304 deny all from 0.0.0.0/8 to any in via &dollar;pif #loopback
&dollar;cmd 305 deny all from 169.254.0.0/16 to any in via &dollar;pif #DHCP auto-config
&dollar;cmd 306 deny all from 192.0.2.0/24 to any in via &dollar;pif #reserved for docs
&dollar;cmd 307 deny all from 204.152.64.0/23 to any in via &dollar;pif #Sun cluster
&dollar;cmd 308 deny all from 224.0.0.0/3 to any in via &dollar;pif #Class D &amp; E multicast
# Authorized inbound packets
&dollar;cmd 400 allow udp from xx.70.207.54 to any 68 in &dollar;ks
&dollar;cmd 420 allow tcp from any to me 80 in via &dollar;pif setup limit src-addr 1
&dollar;cmd 450 deny log ip from any to any
# This is skipto location for outbound stateful rules
&dollar;cmd 500 divert natd ip from any to any out via &dollar;pif
&dollar;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
#################################################################
&dollar;cmd 005 allow all from any to any via xl0
#################################################################
# No restrictions on Loopback Interface
#################################################################
&dollar;cmd 010 allow all from any to any via lo0
#################################################################
# check if packet is inbound and nat address if it is
#################################################################
&dollar;cmd 014 divert natd ip from any to any in via &dollar;pif
#################################################################
# Allow the packet through if it has previous been added to the
# the "dynamic" rules table by a allow keep-state statement.
#################################################################
&dollar;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
&dollar;cmd 020 &dollar;skip tcp from any to x.x.x.x 53 out via &dollar;pif setup keep-state
# Allow out access to my ISP's DHCP server for cable/DSL configurations.
&dollar;cmd 030 &dollar;skip udp from any to x.x.x.x 67 out via &dollar;pif keep-state
# Allow out non-secure standard www function
&dollar;cmd 040 &dollar;skip tcp from any to any 80 out via &dollar;pif setup keep-state
# Allow out secure www function https over TLS SSL
&dollar;cmd 050 &dollar;skip tcp from any to any 443 out via &dollar;pif setup keep-state
# Allow out send &amp; get email function
&dollar;cmd 060 &dollar;skip tcp from any to any 25 out via &dollar;pif setup keep-state
&dollar;cmd 061 &dollar;skip tcp from any to any 110 out via &dollar;pif setup keep-state
# Allow out FreeBSD (make install &amp; CVSUP) functions
# Basically give user root "GOD" privileges.
&dollar;cmd 070 &dollar;skip tcp from me to any out via &dollar;pif setup keep-state uid root
# Allow out ping
&dollar;cmd 080 &dollar;skip icmp from any to any out via &dollar;pif keep-state
# Allow out Time
&dollar;cmd 090 &dollar;skip tcp from any to any 37 out via &dollar;pif setup keep-state
# Allow out nntp news (i.e. news groups)
&dollar;cmd 100 &dollar;skip tcp from any to any 119 out via &dollar;pif setup keep-state
# Allow out secure FTP, Telnet, and SCP
# This function is using SSH (secure shell)
&dollar;cmd 110 &dollar;skip tcp from any to any 22 out via &dollar;pif setup keep-state
# Allow out whois
&dollar;cmd 120 &dollar;skip tcp from any to any 43 out via &dollar;pif setup keep-state
# Allow ntp time server
&dollar;cmd 130 &dollar;skip udp from any to any 123 out via &dollar;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
&dollar;cmd 300 deny all from 192.168.0.0/16 to any in via &dollar;pif #RFC 1918 private IP
&dollar;cmd 301 deny all from 172.16.0.0/12 to any in via &dollar;pif #RFC 1918 private IP
&dollar;cmd 302 deny all from 10.0.0.0/8 to any in via &dollar;pif #RFC 1918 private IP
&dollar;cmd 303 deny all from 127.0.0.0/8 to any in via &dollar;pif #loopback
&dollar;cmd 304 deny all from 0.0.0.0/8 to any in via &dollar;pif #loopback
&dollar;cmd 305 deny all from 169.254.0.0/16 to any in via &dollar;pif #DHCP auto-config
&dollar;cmd 306 deny all from 192.0.2.0/24 to any in via &dollar;pif #reserved for docs
&dollar;cmd 307 deny all from 204.152.64.0/23 to any in via &dollar;pif #Sun cluster
&dollar;cmd 308 deny all from 224.0.0.0/3 to any in via &dollar;pif #Class D &amp; E multicast
# Deny ident
&dollar;cmd 315 deny tcp from any to any 113 in via &dollar;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
&dollar;cmd 320 deny tcp from any to any 137 in via &dollar;pif
&dollar;cmd 321 deny tcp from any to any 138 in via &dollar;pif
&dollar;cmd 322 deny tcp from any to any 139 in via &dollar;pif
&dollar;cmd 323 deny tcp from any to any 81 in via &dollar;pif
# Deny any late arriving packets
&dollar;cmd 330 deny all from any to any frag in via &dollar;pif
# Deny ACK packets that did not match the dynamic rule table
&dollar;cmd 332 deny tcp from any to any established in via &dollar;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.
&dollar;cmd 360 allow udp from x.x.x.x to any 68 in via &dollar;pif keep-state
# Allow in standard www function because I have Apache server
&dollar;cmd 370 allow tcp from any to me 80 in via &dollar;pif setup limit src-addr 2
# Allow in secure FTP, Telnet, and SCP from public Internet
&dollar;cmd 380 allow tcp from any to me 22 in via &dollar;pif setup limit src-addr 2
# Allow in non-secure Telnet session from public Internet
# labeled non-secure because ID &amp; PW are passed over public
# Internet as clear text.
# Delete this sample group if you do not have telnet server enabled.
&dollar;cmd 390 allow tcp from any to me 23 in via &dollar;pif setup limit src-addr 2
# Reject &amp; Log all unauthorized incoming connections from the public Internet
&dollar;cmd 400 deny log all from any to any in via &dollar;pif
# Reject &amp; Log all unauthorized out going connections to the public Internet
&dollar;cmd 450 deny log all from any to any out via &dollar;pif
# This is skipto location for outbound stateful rules
&dollar;cmd 800 divert natd ip from any to any out via &dollar;pif
&dollar;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
&dollar;cmd 999 deny log all from any to any
################ End of IPFW rules file ###############################</programlisting>
</sect3>
</sect2>
</sect1>
</chapter>