401 lines
17 KiB
Text
401 lines
17 KiB
Text
<!--
|
||
Dialup Firewall
|
||
The FreeBSD Greek Documentation Project
|
||
|
||
Original version: 1.30
|
||
-->
|
||
|
||
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
|
||
<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
|
||
%man;
|
||
]>
|
||
|
||
<article lang="el">
|
||
<articleinfo>
|
||
<title>Σύνδεση μέσω τηλεφώνου και firewalling στο FreeBSD</title>
|
||
|
||
<authorgroup>
|
||
<author>
|
||
<firstname>Marc</firstname>
|
||
<surname>Silver</surname>
|
||
|
||
<affiliation>
|
||
<address><email>marcs@draenor.org</email></address>
|
||
</affiliation>
|
||
</author>
|
||
</authorgroup>
|
||
|
||
<pubdate>$FreeBSD$</pubdate>
|
||
|
||
<abstract>
|
||
<para>Αυτό το άρθρο περιγράφει πως μπορείτε να ρυθμίσετε ένα firewall
|
||
χρησιμοποιώντας μια PPP σύνδεση μέσω τηλεφώνου στο FreeBSD με το IPFW.
|
||
Πιο συγκεκριμένα, ένα firewall πάνω από μια σύνδεση μέσω τηλεφώνου που
|
||
έχει δυναμική IP διεύθυνση. Αυτό το κείμενο δεν ασχολείται με το πως
|
||
θα ρυθμίσετε την PPP σύνδεσή σας.</para>
|
||
</abstract>
|
||
</articleinfo>
|
||
|
||
<sect1 id="preface">
|
||
<title>Πρόλογος</title>
|
||
|
||
<para>Σύνδεση μέσω τηλεφώνου και firewalling στο FreeBSD</para>
|
||
|
||
<para>Αυτό το κείμενο περιγράφει την διαδικασία που χρειάζεται για να
|
||
ρυθμίσετε ένα firewall στο FreeBSD όταν η IP διεύθυνση δίνεται δυναμικά
|
||
από τον ISP σας. Παρόλο που έχω προσπαθήσει να κάνω αυτό το κείμενο
|
||
όσο το δυνατόν πιο πλήρες και σωστό, είστε ευπρόσδεκτοι να στείλετε τα
|
||
σχόλιά ή τις προτάσεις σας στην διεύθυνση
|
||
<email>marcs@draenor.org</email>.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="kernel">
|
||
<title>Παράμετροι του πυρήνα</title>
|
||
|
||
<para>Το πρώτο πράγμα που θα χρειαστεί να κάνετε είναι να μεταγλωττίσετε
|
||
τον πυρήνα σας. Αν χρειάζεστε βοήθεια για να το κάνετε αυτό, τότε το
|
||
καλύτερο μέρος να ξεκινήσετε είναι το <ulink
|
||
URL="../../books/handbook/kernelconfig.html">τμήμα
|
||
ρυθμίσεων του πυρήνα στο Εγχειρίδιο</ulink>. Θα πρέπει να προσθέσετε
|
||
τις παρακάτω επιλογές στις ρυθμίσεις του πυρήνα σας:</para>
|
||
|
||
<variablelist>
|
||
<varlistentry>
|
||
<term><literal>options IPFIREWALL</literal></term>
|
||
|
||
<listitem>
|
||
<para>Ενεργοποιεί τον firewall κώδικα του πυρήνα.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><literal>options IPFW2</literal></term>
|
||
|
||
<listitem>
|
||
<para>Ενεργοποιεί την νέα έκδοση του IPFW.</para>
|
||
<important>
|
||
<para>Αυτή η επιλογή έχει νόημα μόνο αν χρησιμοποιείτε την έκδοση
|
||
4.X του FreeBSD, είναι ενεργοποιημένη ήδη στις νεώτερες
|
||
εκδόσεις.<para>
|
||
</important>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><literal>options IPFIREWALL_VERBOSE</literal></term>
|
||
|
||
<listitem>
|
||
<para>Στέλνει τα μηνύματα για τα κατάλληλα πακέτα στο log του
|
||
συστήματος.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><literal>options
|
||
IPFIREWALL_VERBOSE_LIMIT=<replaceable>100</replaceable></literal></term>
|
||
|
||
<listitem>
|
||
<para>Βάζει κάποιο όριο στις φορές που κάποια εγγραφή θα
|
||
καταγράφεται. Αυτό εμποδίζει τα log αρχεία σας από το να γεμίσουν
|
||
με πολλές επαναλαμβανόμενες εγγραφές.
|
||
<replaceable>100</replaceable> είναι μια αρκετά λογική τιμή, αλλά
|
||
μπορείτε να το ρυθμίσετε ανάλογα με τις απαιτήσεις σας.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><literal>options IPDIVERT</literal></term>
|
||
|
||
<listitem>
|
||
<para>Ενεργοποιεί τα <emphasis>divert</emphasis> sockets, που θα
|
||
δούμε αργότερα τι κάνουν.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
</variablelist>
|
||
|
||
<para>Υπάρχουν κι άλλα <emphasis>προαιρετικά</emphasis> πράγματα που
|
||
μπορείτε να προσθέσετε στον πυρήνα σας για ακόμα μεγαλύτερη ασφάλεια.
|
||
Δεν είναι απαραίτητα για να ρυθμίσετε ένα firewall έτσι ώστε να
|
||
δουλεύει, αλλά κάποιοι αρκετά παρανοϊκοί χρήστες μπορεί να θέλουν να τα
|
||
ενεργοποιήσουν.</para>
|
||
|
||
<variablelist>
|
||
<varlistentry>
|
||
<term><literal>options TCP_DROP_SYNFIN</literal></term>
|
||
|
||
<listitem>
|
||
<para>Αυτή η επιλογή δίνει την δυνατότητα στον πυρήνα να αγνοεί τα
|
||
TCP πακέτα που έχουν και την SYN και την FIN επιλογή. Έτσι
|
||
εμποδίζονται εργαλεία όπως το
|
||
<filename role="package">security/nmap</filename> κλπ. στην
|
||
προσπάθειά τους να
|
||
αναγνωρίσουν το TCP stack του μηχανήματος, αλλά επίσης είναι
|
||
ασύμβατο με τις επεκτάσεις που περιγράφει το RFC1644. Αυτό
|
||
<emphasis>δεν</emphasis> προτείνεται για ένα μηχάνημα που θα
|
||
τρέχει κάποιο web server.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
</variablelist>
|
||
|
||
<para>Μην κάνετε reboot όταν έχετε μεταγλωττίσει τον πυρήνα. Ελπίζουμε
|
||
πως θα χρειαστεί μόνο μια επανεκκίνηση, στο τέλος της
|
||
εγκατάστασης του firewall.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="rcconf">
|
||
<title>Αλλαγές στο <filename>/etc/rc.conf</filename> για να φορτώνεται
|
||
το firewall</title>
|
||
|
||
<para>Τώρα πρέπει να κάνουμε κάποιες αλλαγές στο
|
||
<filename>/etc/rc.conf</filename> με τις ρυθμίσεις μας για το
|
||
firewall. Απλά προσθέστε τις παρακάτω γραμμές:</para>
|
||
|
||
<programlisting>firewall_enable="YES"
|
||
firewall_script="/etc/firewall/fwrules"
|
||
natd_enable="YES"
|
||
natd_interface="tun0"
|
||
natd_flags="-dynamic"</programlisting>
|
||
|
||
<para>Για περισσότερες πληροφορίες σχετικά με τη σημασίας καθεμιάς από
|
||
αυτές τις γραμμές, ρίξτε μια ματιά στο
|
||
<filename>/etc/defaults/rc.conf</filename> και διαβάστε την man σελίδα
|
||
&man.rc.conf.5;</para>
|
||
</sect1>
|
||
|
||
<sect1>
|
||
<title>Απενεργοποιήστε την ενσωματωμένη μετάφραση διευθύνσεων του
|
||
PPP</title>
|
||
|
||
<para>Μπορεί ήδη να χρησιμοποιείτε την ενσωματωμένη μετάφραση διευθύνσεων
|
||
του PPP (NAT). Αν ναι, τότε θα πρέπει να την απενεργοποιήσετε, αφού τα
|
||
παραδείγματα που θα δούμε παρακάτω χρησιμοποιούν το &man.natd.8; για να
|
||
κάνουν το ίδιο πράγμα.</para>
|
||
|
||
<para>Αν έχετε ήδη τις απαραίτητες γραμμές για να ξεκινάει το PPP
|
||
αυτόματα, μάλλον μοιάζουν κάπως έτσι:</para>
|
||
|
||
<programlisting>ppp_enable="YES"
|
||
ppp_mode="auto"
|
||
ppp_nat="YES"
|
||
ppp_profile="<replaceable>profile</replaceable>"</programlisting>
|
||
|
||
<para>Αν ναι, πρέπει να απενεργοποιήσετε το <literal>ppp_nat</literal>
|
||
προσθέτοντας στο αρχείο <filename>rc.conf</filename> σας την γραμμή
|
||
<literal>ppp_nat="YES"</literal>.
|
||
Θα πρέπει επίσης να αφαιρέσετε τυχόν <literal>nat enable yes</literal> ή
|
||
<literal>alias enable yes</literal> έχει το
|
||
<filename>/etc/ppp/ppp.conf</filename> σας.</para>
|
||
</sect1>
|
||
|
||
<sect1 id="rules">
|
||
<title>Οι κανόνες του firewall</title>
|
||
|
||
<para>Έχουμε σχεδόν τελειώσει. Το μόνο που απομένει τώρα είναι να
|
||
ορίσουμε τους κανόνες του firewall και τότε μπορούμε να επανεκκινήσουμε
|
||
το σύστημα ώστε να ξεκινήσει το firewall. Καταλαβαίνω πως ο καθένας θα
|
||
θέλει κάτι λίγο ή πολύ διαφορετικό στους κανόνες του. Αυτό που
|
||
προσπάθησα να κάνω είναι να γράψω κάποιους βασικούς κανόνες που
|
||
ταιριάζουν στους πιο πολλούς χρήστες που συνδέονται στο δίκτυο μέσω
|
||
τηλεφώνου. Μπορείτε προφανώς να κάνετε αλλαγές σύμφωνα με τις ανάγκες
|
||
σας, χρησιμοποιώντας τους παρακάτω κανόνες σαν την βάση για το δικό σας
|
||
σετ κανόνων. Ας αρχίσουμε όμως με τις βασικές αρχές ενός κλειστού
|
||
firewall. Αυτό που θέλετε να κάνετε είναι να κλείσετε τα πάντα και μετά
|
||
να ανοίξετε μόνο ότι πραγματικά σας χρειάζεται. Οι κανόνες θα πρέπει
|
||
λοιπόν πρώτα να επιτρέπουν και μετά να απαγορεύουν. Η λογική πίσω από
|
||
αυτό είναι ότι πρώτα βάζετε τους κανόνες που επιτρέπουν πράγματα να
|
||
περάσουν και ύστερα όλα τα άλλα απαγορεύονται. :)</para>
|
||
|
||
<para>Ύστερα, φτιάξτε ένα κατάλογο <filename
|
||
class="directory">/etc/firewall</filename>. Αλλάξτε κατάλογο μέσα σε
|
||
αυτόν και δημιουργήστε το αρχείο <filename>fwrules</filename> που το
|
||
όνομά του είχαμε γράψει στο <filename>rc.conf</filename>. Σημειώστε πως
|
||
μπορείτε να αλλάξετε το όνομα του αρχείου αυτού σε ότι θέλετε. Αυτός ο
|
||
οδηγός δίνει αυτό το όνομα σαν παράδειγμα και μόνο.</para>
|
||
|
||
<para>Ας δούμε τώρα ένα παράδειγμα firewall, που έχει αρκετά καλά
|
||
σχόλια.</para>
|
||
|
||
<programlisting># Define the firewall command (as in /etc/rc.firewall) for easy
|
||
# reference. Helps to make it easier to read.
|
||
fwcmd="/sbin/ipfw"
|
||
|
||
# Force a flushing of the current rules before we reload.
|
||
$fwcmd -f flush
|
||
|
||
# Divert all packets through the tunnel interface.
|
||
$fwcmd add divert natd all from any to any via tun0
|
||
|
||
# Allow all connections that have dynamic rules built for them,
|
||
# but deny established connections that don't have a dynamic rule.
|
||
# See ipfw(8) for details.
|
||
$fwcmd add check-state
|
||
$fwcmd add deny tcp from any to any established
|
||
|
||
# Allow all localhost connections
|
||
$fwcmd add allow tcp from me to any out via lo0 setup keep-state
|
||
$fwcmd add deny tcp from me to any out via lo0
|
||
$fwcmd add allow ip from me to any out via lo0 keep-state
|
||
|
||
# Allow all connections from my network card that I initiate
|
||
$fwcmd add allow tcp from me to any out xmit any setup keep-state
|
||
$fwcmd add deny tcp from me to any
|
||
$fwcmd add allow ip from me to any out xmit any keep-state
|
||
|
||
# Everyone on the Internet is allowed to connect to the following
|
||
# services on the machine. This example shows that people may connect
|
||
# to sshd and a webserver.
|
||
$fwcmd add allow tcp from any to me dst-port 22,80 in recv any setup keep-state
|
||
|
||
# This sends a RESET to all ident packets.
|
||
$fwcmd add reset log tcp from any to me 113 in recv any
|
||
|
||
# Enable ICMP: remove type 8 if you don't want your host to be pingable
|
||
$fwcmd add allow icmp from any to any icmptypes 0,3,8,11,12,13,14
|
||
|
||
# Deny all the rest.
|
||
$fwcmd add deny log ip from any to any</programlisting>
|
||
|
||
<para>Τώρα έχετε ένα ολοκληρωμένο firewall που επιτρέπει συνδέσεις στις
|
||
θύρες 22 και 80 και καταγράφει όλες τις άλλες συνδέσεις στο log του
|
||
συστήματος. Πλέον είστε έτοιμοι για επανεκκίνηση και το firewall θα
|
||
πρέπει να ξεκινήσει να δουλεύει. Αν δείτε ότι αυτό είναι λάθος, ή έχετε
|
||
οποιαδήποτε προβλήματα, ή ακόμα καλύτερα έχετε κάποιες προτάσεις για να
|
||
διορθωθεί αυτή η σελίδα, επικοινωνήστε μαζί μου με email.</para>
|
||
</sect1>
|
||
|
||
<sect1>
|
||
<title>Ερωτήσεις</title>
|
||
|
||
<qandaset>
|
||
<qandaentry>
|
||
<question>
|
||
<para>Γιατί χρησιμοποιείς το &man.natd.8; και το &man.ipfw.8; αφού
|
||
θα μπορούσες να χρησιμοποιήσεις τα φίλτρα του &man.ppp.8;;</para>
|
||
</question>
|
||
|
||
<answer>
|
||
<para>Θα πρέπει να είμαι ειλικρινής και να πω ότι δεν υπάρχει
|
||
κάποιος σοβαρός λόγος που χρησιμοποιώ το <command>ipfw</command>
|
||
και το <command>natd</command> αντί για τα ενσωματωμένα φίλτρα του
|
||
<command>ppp</command>. Από συζητήσεις που είχα με διάφορα άτομα
|
||
φαίνεται πως οι πιο πολλοί συμφωνούν στο εξής: το
|
||
<command>ipfw</command> έχει σαφώς πιο πολλές δυνατότητες και
|
||
είναι πιο ευέλικτο στις ρυθμίσεις του από ότι τα φίλτρα του
|
||
<command>ppp</command>, αλλά ότι κερδίζει σε δυνατότητες το χάνει
|
||
σε ευκολία τροποποίησης των ρυθμίσεων. Ένας από τους λόγους που
|
||
το χρησιμοποιώ είναι επειδή προτιμώ το φιλτράρισμα του firewall να
|
||
γίνεται στο επίπεδο του πυρήνα, κι όχι από ένα πρόγραμμα στο
|
||
επίπεδο του χρήστη.</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry>
|
||
<question>
|
||
<para>Βλέπω μηνύματα όπως <errorname>limit 100 reached on entry
|
||
2800</errorname> και μετά από αυτό δεν ξαναβλέπω ποτέ μηνύματα στο
|
||
log μου. Δουλεύει ακόμα το firewall μου;</para>
|
||
</question>
|
||
|
||
<answer>
|
||
<para>Αυτό απλά σημαίνει πως έχει χρησιμοποιηθεί το μέγιστο όριο
|
||
καταγραφής (logging) για αυτό τον κανόνα. Ο κανόνας ο ίδιος
|
||
εξακολουθεί να δουλεύει, αλλά δεν θα στέλνει πια μηνύματα στο log
|
||
του συστήματος μέχρι να μηδενίσετε πάλι τους μετρητές. Μπορείτε
|
||
να μηδενίσετε τους μετρητές με την εντολή <command>ipfw
|
||
resetlog</command>. Εναλλακτικά, μπορείτε να αυξήσετε το όριο
|
||
καταγραφής στις ρυθμίσεις του πυρήνα σας με την επιλογή
|
||
<option>IPFIREWALL_VERBOSE_LIMIT</option> όπως περιγράψαμε
|
||
παραπάνω. Μπορείτε να αλλάξετε αυτό το όριο (χωρίς να
|
||
μεταγλωττίσετε πάλι τον πυρήνα σας και να κάνετε reboot)
|
||
χρησιμοποιώντας την &man.sysctl.8; τιμή
|
||
net.inet.ip.fw.verbose_limit.</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry>
|
||
<question>
|
||
<para>Αν χρησιμοποιώ διευθύνσεις εσωτερικά που ανήκουν στην ομάδα
|
||
192.168.0.0 range, μπορώ να αλλάξω την εντολή σε κάτι όπως
|
||
<literal>$fwcmd add deny all from any to 192.168.0.0:255.255.0.0
|
||
via tun0</literal> στους κανόνες του firewall για να εμποδίσω τα
|
||
μηχανήματα έξω από το δίκτυο από το να συνδέονται με τα εσωτερικά
|
||
μηχανήματα;</para>
|
||
</question>
|
||
|
||
<answer>
|
||
<para>Η σύντομη απάντηση είναι όχι. Ο λόγος γι αυτό είναι ότι το
|
||
<command>natd</command> κάνει μετάφραση διευθύνσεων για
|
||
<emphasis>οτιδήποτε</emphasis> περνάει μέσω του interface
|
||
<devicename>tun0</devicename>. Έτσι, τα εισερχόμενα πακέτα θα
|
||
εμφανίζονται μόνο στην δυναμικά ορισμένη IP διεύθυνση του
|
||
εξωτερικού interface και <emphasis>όχι</emphasis> στην διεύθυνση
|
||
του εσωτερικού δικτύου. Σημειώστε όμως ότι μπορείτε να προσθέσετε
|
||
ένα κανόνα <literal>$fwcmd add deny all from
|
||
192.168.0.4:255.255.0.0 to any via tun0</literal> ο οποίος θα
|
||
απαγορεύει σε ένα μηχάνημα του εσωτερικού δικτύου να στείλει
|
||
οτιδήποτε πέρα από το firewall.</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry>
|
||
<question>
|
||
<para>Κάποιο λάθος πρέπει να έγινε. Ακολούθησα τις εντολές κατά
|
||
γράμμα και τώρα κλειδώθηκα απέξω.</para>
|
||
</question>
|
||
|
||
<answer>
|
||
<para>Αυτός ο οδηγός υποθέτει ότι χρησιμοποιείτε το
|
||
<emphasis>userland-ppp</emphasis>, γι αυτό κι οι κανόνες που
|
||
δίνονται χρησιμοποιούν το <devicename>tun0</devicename> interface,
|
||
που αντιστοιχεί στην πρώτη σύνδεση που φτιάχνεται με το
|
||
&man.ppp.8; (αλλιώς γνωστό και ως <emphasis>user-ppp</emphasis>).
|
||
Η επόμενη σύνδεση θα χρησιμοποιούσε το
|
||
<devicename>tun1</devicename>, μετά το
|
||
<devicename>tun2</devicename> και πάει λέγοντας.</para>
|
||
|
||
<para>Θα πρέπει επίσης να θυμάστε ότι το &man.pppd.8; χρησιμοποιεί
|
||
το interface <devicename>ppp0</devicename>, οπότε αν ξεκινήσετε τη
|
||
σύνδεσή σας με το &man.pppd.8; θα πρέπει να αντικαταστήσετε το
|
||
<devicename>tun0</devicename> με <devicename>ppp0</devicename>.
|
||
Παρακάτω θα δείξουμε ένα εύκολο τρόπο να αλλάξετε τους κανόνες του
|
||
firewall κατάλληλα. Οι αρχικοί κανόνες σώζονται σε ένα αρχείο με
|
||
όνομα <filename>fwrules_tun0</filename>.</para>
|
||
|
||
<screen> &prompt.user; <userinput>cd /etc/firewall</userinput>
|
||
/etc/firewall&prompt.user; <userinput>su</userinput>
|
||
<prompt>Password:</prompt>
|
||
/etc/firewall&prompt.root; <userinput>mv fwrules fwrules_tun0</userinput>
|
||
/etc/firewall&prompt.root; <userinput>cat fwrules_tun0 | sed s/tun0/ppp0/g > fwrules</userinput>
|
||
</screen>
|
||
|
||
<para>Για να καταλάβετε αν χρησιμοποιείτε το &man.ppp.8; ή το
|
||
&man.pppd.8; μπορείτε να εξετάσετε την έξοδο της &man.ifconfig.8;
|
||
αφού ενεργοποιηθεί η σύνδεσή σας. Π.χ., για μια σύνδεση που
|
||
ενεργοποιήθηκε από το &man.pppd.8; θα δείτε κάτι σαν αυτό
|
||
(δείχνονται μόνο οι σχετικές γραμμές):</para>
|
||
|
||
<screen> &prompt.user; <userinput>ifconfig</userinput>
|
||
<emphasis>(skipped...)</emphasis>
|
||
ppp0: flags=<replaceable>8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524</replaceable>
|
||
inet <replaceable>xxx.xxx.xxx.xxx</replaceable> --> <replaceable>xxx.xxx.xxx.xxx</replaceable> netmask <replaceable>0xff000000</replaceable>
|
||
<emphasis>(skipped...)</emphasis>
|
||
</screen>
|
||
|
||
<para>Από την άλλη, για μια σύνδεση που ενεργοποιήθηκε με το
|
||
&man.ppp.8; (<emphasis>user-ppp</emphasis>) θά πρεπε να δείτε κάτι
|
||
παρόμοιο με το παρακάτω:</para>
|
||
|
||
<screen> &prompt.user; <userinput>ifconfig</userinput>
|
||
<emphasis>(skipped...)</emphasis>
|
||
ppp0: flags=<replaceable>8010<POINTOPOINT,MULTICAST> mtu 1500</replaceable>
|
||
<emphasis>(skipped...)</emphasis>
|
||
tun0: flags=<replaceable>8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524</replaceable>
|
||
<emphasis>(IPv6 stuff skipped...)</emphasis>
|
||
inet <replaceable>xxx.xxx.xxx.xxx</replaceable> --> <replaceable>xxx.xxx.xxx.xxx</replaceable> netmask <replaceable>0xffffff00</replaceable>
|
||
Opened by PID <replaceable>xxxxx</replaceable>
|
||
<emphasis>(skipped...)</emphasis></screen>
|
||
</answer>
|
||
</qandaentry>
|
||
</qandaset>
|
||
</sect1>
|
||
</article>
|