# Σύνδεση μέσω τηλεφώνου και firewalling στο FreeBSD

Marc
Silver

    marcs@draenor.org

$FreeBSD$

Αυτό το άρθρο περιγράφει πως μπορείτε να ρυθμίσετε ένα firewall χρησιμοποιώντας μια PPP σύνδεση μέσω τηλεφώνου στο FreeBSD με το IPFW. Πιο συγκεκριμένα, ένα firewall πάνω από μια σύνδεση μέσω τηλεφώνου που έχει δυναμική IP διεύθυνση. Αυτό το κείμενο δεν ασχολείται με το πως θα ρυθμίσετε την PPP σύνδεσή σας.

## Πρόλογος

Σύνδεση μέσω τηλεφώνου και firewalling στο FreeBSD

Αυτό το κείμενο περιγράφει την διαδικασία που χρειάζεται για να ρυθμίσετε ένα firewall στο FreeBSD όταν η IP διεύθυνση δίνεται δυναμικά από τον ISP σας. Παρόλο που έχω προσπαθήσει να κάνω αυτό το κείμενο όσο το δυνατόν πιο πλήρες και σωστό, είστε ευπρόσδεκτοι να στείλετε τα σχόλιά ή τις προτάσεις σας στην διεύθυνση marcs@draenor.org.

## Παράμετροι του πυρήνα

Το πρώτο πράγμα που θα χρειαστεί να κάνετε είναι να μεταγλωττίσετε τον πυρήνα σας. Αν χρειάζεστε βοήθεια για να το κάνετε αυτό, τότε το καλύτερο μέρος να ξεκινήσετε είναι το τμήμα ρυθμίσεων του πυρήνα στο Εγχειρίδιο. Θα πρέπει να προσθέσετε τις παρακάτω επιλογές στις ρυθμίσεις του πυρήνα σας:

`options IPFIREWALL`

  Ενεργοποιεί τον firewall κώδικα του πυρήνα.

`options IPFW2`

  Ενεργοποιεί την νέα έκδοση του IPFW.

  Αυτή η επιλογή έχει νόημα μόνο αν χρησιμοποιείτε την έκδοση 4.X του FreeBSD, είναι ενεργοποιημένη ήδη στις νεώτερες εκδόσεις.

`options IPFIREWALL_VERBOSE`

  Στέλνει τα μηνύματα για τα κατάλληλα πακέτα στο log του συστήματος.

`options IPFIREWALL_VERBOSE_LIMIT=100`

  Βάζει κάποιο όριο στις φορές που κάποια εγγραφή θα καταγράφεται. Αυτό εμποδίζει τα log αρχεία σας από το να γεμίσουν με πολλές επαναλαμβανόμενες εγγραφές. 100 είναι μια αρκετά λογική τιμή, αλλά μπορείτε να το ρυθμίσετε ανάλογα με τις απαιτήσεις σας.

`options IPDIVERT`

  Ενεργοποιεί τα divert sockets, που θα δούμε αργότερα τι κάνουν.

Υπάρχουν κι άλλα προαιρετικά πράγματα που μπορείτε να προσθέσετε στον πυρήνα σας για ακόμα μεγαλύτερη ασφάλεια. Δεν είναι απαραίτητα για να ρυθμίσετε ένα firewall έτσι ώστε να δουλεύει, αλλά κάποιοι αρκετά παρανοϊκοί χρήστες μπορεί να θέλουν να τα ενεργοποιήσουν.

`options TCP_DROP_SYNFIN`

  Αυτή η επιλογή δίνει την δυνατότητα στον πυρήνα να αγνοεί τα TCP πακέτα που έχουν και την SYN και την FIN επιλογή. Έτσι εμποδίζονται εργαλεία όπως το `security/nmap` κλπ. στην προσπάθειά τους να αναγνωρίσουν το TCP stack του μηχανήματος, αλλά επίσης είναι ασύμβατο με τις επεκτάσεις που περιγράφει το RFC1644. Αυτό δεν προτείνεται για ένα μηχάνημα που θα τρέχει κάποιο web server.

Μην κάνετε reboot όταν έχετε μεταγλωττίσει τον πυρήνα. Ελπίζουμε πως θα χρειαστεί μόνο μια επανεκκίνηση, στο τέλος της εγκατάστασης του firewall.

## Αλλαγές στο `/etc/rc.conf` για να φορτώνεται το firewall

Τώρα πρέπει να κάνουμε κάποιες αλλαγές στο `/etc/rc.conf` με τις ρυθμίσεις μας για το firewall. Απλά προσθέστε τις παρακάτω γραμμές:

    firewall_enable="YES"
    firewall_script="/etc/firewall/fwrules"
    natd_enable="YES"
    natd_interface="tun0"
    natd_flags="-dynamic"

Για περισσότερες πληροφορίες σχετικά με τη σημασίας καθεμιάς από αυτές τις γραμμές, ρίξτε μια ματιά στο `/etc/defaults/rc.conf` και διαβάστε την man σελίδα &man.rc.conf.5;

## Απενεργοποιήστε την ενσωματωμένη μετάφραση διευθύνσεων του PPP

Μπορεί ήδη να χρησιμοποιείτε την ενσωματωμένη μετάφραση διευθύνσεων του PPP (NAT). Αν ναι, τότε θα πρέπει να την απενεργοποιήσετε, αφού τα παραδείγματα που θα δούμε παρακάτω χρησιμοποιούν το &man.natd.8; για να κάνουν το ίδιο πράγμα.

Αν έχετε ήδη τις απαραίτητες γραμμές για να ξεκινάει το PPP αυτόματα, μάλλον μοιάζουν κάπως έτσι:

    ppp_enable="YES"
    ppp_mode="auto"
    ppp_nat="YES"
    ppp_profile="profile"

Αν ναι, πρέπει να απενεργοποιήσετε το `ppp_nat` προσθέτοντας στο αρχείο `rc.conf` σας την γραμμή `ppp_nat="YES"`. Θα πρέπει επίσης να αφαιρέσετε τυχόν `nat enable yes` ή `alias enable yes` έχει το `/etc/ppp/ppp.conf` σας.

## Οι κανόνες του firewall

Έχουμε σχεδόν τελειώσει. Το μόνο που απομένει τώρα είναι να ορίσουμε τους κανόνες του firewall και τότε μπορούμε να επανεκκινήσουμε το σύστημα ώστε να ξεκινήσει το firewall. Καταλαβαίνω πως ο καθένας θα θέλει κάτι λίγο ή πολύ διαφορετικό στους κανόνες του. Αυτό που προσπάθησα να κάνω είναι να γράψω κάποιους βασικούς κανόνες που ταιριάζουν στους πιο πολλούς χρήστες που συνδέονται στο δίκτυο μέσω τηλεφώνου. Μπορείτε προφανώς να κάνετε αλλαγές σύμφωνα με τις ανάγκες σας, χρησιμοποιώντας τους παρακάτω κανόνες σαν την βάση για το δικό σας σετ κανόνων. Ας αρχίσουμε όμως με τις βασικές αρχές ενός κλειστού firewall. Αυτό που θέλετε να κάνετε είναι να κλείσετε τα πάντα και μετά να ανοίξετε μόνο ότι πραγματικά σας χρειάζεται. Οι κανόνες θα πρέπει λοιπόν πρώτα να επιτρέπουν και μετά να απαγορεύουν. Η λογική πίσω από αυτό είναι ότι πρώτα βάζετε τους κανόνες που επιτρέπουν πράγματα να περάσουν και ύστερα όλα τα άλλα απαγορεύονται. :)

Ύστερα, φτιάξτε ένα κατάλογο `/etc/firewall`. Αλλάξτε κατάλογο μέσα σε αυτόν και δημιουργήστε το αρχείο `fwrules` που το όνομά του είχαμε γράψει στο `rc.conf`. Σημειώστε πως μπορείτε να αλλάξετε το όνομα του αρχείου αυτού σε ότι θέλετε. Αυτός ο οδηγός δίνει αυτό το όνομα σαν παράδειγμα και μόνο.

Ας δούμε τώρα ένα παράδειγμα firewall, που έχει αρκετά καλά σχόλια.

    # 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

Τώρα έχετε ένα ολοκληρωμένο firewall που επιτρέπει συνδέσεις στις θύρες 22 και 80 και καταγράφει όλες τις άλλες συνδέσεις στο log του συστήματος. Πλέον είστε έτοιμοι για επανεκκίνηση και το firewall θα πρέπει να ξεκινήσει να δουλεύει. Αν δείτε ότι αυτό είναι λάθος, ή έχετε οποιαδήποτε προβλήματα, ή ακόμα καλύτερα έχετε κάποιες προτάσεις για να διορθωθεί αυτή η σελίδα, επικοινωνήστε μαζί μου με email.

## Ερωτήσεις

Γιατί χρησιμοποιείς το &man.natd.8; και το &man.ipfw.8; αφού θα μπορούσες να χρησιμοποιήσεις τα φίλτρα του &man.ppp.8;;

Θα πρέπει να είμαι ειλικρινής και να πω ότι δεν υπάρχει κάποιος σοβαρός λόγος που χρησιμοποιώ το `ipfw` και το `natd` αντί για τα ενσωματωμένα φίλτρα του `ppp`. Από συζητήσεις που είχα με διάφορα άτομα φαίνεται πως οι πιο πολλοί συμφωνούν στο εξής: το `ipfw` έχει σαφώς πιο πολλές δυνατότητες και είναι πιο ευέλικτο στις ρυθμίσεις του από ότι τα φίλτρα του `ppp`, αλλά ότι κερδίζει σε δυνατότητες το χάνει σε ευκολία τροποποίησης των ρυθμίσεων. Ένας από τους λόγους που το χρησιμοποιώ είναι επειδή προτιμώ το φιλτράρισμα του firewall να γίνεται στο επίπεδο του πυρήνα, κι όχι από ένα πρόγραμμα στο επίπεδο του χρήστη.

Βλέπω μηνύματα όπως limit 100 reached on entry 2800 και μετά από αυτό δεν ξαναβλέπω ποτέ μηνύματα στο log μου. Δουλεύει ακόμα το firewall μου;

Αυτό απλά σημαίνει πως έχει χρησιμοποιηθεί το μέγιστο όριο καταγραφής (logging) για αυτό τον κανόνα. Ο κανόνας ο ίδιος εξακολουθεί να δουλεύει, αλλά δεν θα στέλνει πια μηνύματα στο log του συστήματος μέχρι να μηδενίσετε πάλι τους μετρητές. Μπορείτε να μηδενίσετε τους μετρητές με την εντολή `ipfw resetlog`. Εναλλακτικά, μπορείτε να αυξήσετε το όριο καταγραφής στις ρυθμίσεις του πυρήνα σας με την επιλογή `IPFIREWALL_VERBOSE_LIMIT` όπως περιγράψαμε παραπάνω. Μπορείτε να αλλάξετε αυτό το όριο (χωρίς να μεταγλωττίσετε πάλι τον πυρήνα σας και να κάνετε reboot) χρησιμοποιώντας την &man.sysctl.8; τιμή net.inet.ip.fw.verbose_limit.

Αν χρησιμοποιώ διευθύνσεις εσωτερικά που ανήκουν στην ομάδα 192.168.0.0 range, μπορώ να αλλάξω την εντολή σε κάτι όπως `$fwcmd add deny all from any to 192.168.0.0:255.255.0.0 via tun0` στους κανόνες του firewall για να εμποδίσω τα μηχανήματα έξω από το δίκτυο από το να συνδέονται με τα εσωτερικά μηχανήματα;

Η σύντομη απάντηση είναι όχι. Ο λόγος γι αυτό είναι ότι το `natd` κάνει μετάφραση διευθύνσεων για οτιδήποτε περνάει μέσω του interface tun0. Έτσι, τα εισερχόμενα πακέτα θα εμφανίζονται μόνο στην δυναμικά ορισμένη IP διεύθυνση του εξωτερικού interface και όχι στην διεύθυνση του εσωτερικού δικτύου. Σημειώστε όμως ότι μπορείτε να προσθέσετε ένα κανόνα `$fwcmd add deny all from 192.168.0.4:255.255.0.0 to any via tun0` ο οποίος θα απαγορεύει σε ένα μηχάνημα του εσωτερικού δικτύου να στείλει οτιδήποτε πέρα από το firewall.

Κάποιο λάθος πρέπει να έγινε. Ακολούθησα τις εντολές κατά γράμμα και τώρα κλειδώθηκα απέξω.

Αυτός ο οδηγός υποθέτει ότι χρησιμοποιείτε το userland-ppp, γι αυτό κι οι κανόνες που δίνονται χρησιμοποιούν το tun0 interface, που αντιστοιχεί στην πρώτη σύνδεση που φτιάχνεται με το &man.ppp.8; (αλλιώς γνωστό και ως user-ppp). Η επόμενη σύνδεση θα χρησιμοποιούσε το tun1, μετά το tun2 και πάει λέγοντας.

Θα πρέπει επίσης να θυμάστε ότι το &man.pppd.8; χρησιμοποιεί το interface ppp0, οπότε αν ξεκινήσετε τη σύνδεσή σας με το &man.pppd.8; θα πρέπει να αντικαταστήσετε το tun0 με ppp0. Παρακάτω θα δείξουμε ένα εύκολο τρόπο να αλλάξετε τους κανόνες του firewall κατάλληλα. Οι αρχικοί κανόνες σώζονται σε ένα αρχείο με όνομα `fwrules_tun0`.

              &prompt.user; cd /etc/firewall
                /etc/firewall&prompt.user; su
                Password:
                /etc/firewall&prompt.root; mv fwrules fwrules_tun0
                /etc/firewall&prompt.root; cat fwrules_tun0 | sed s/tun0/ppp0/g > fwrules

Για να καταλάβετε αν χρησιμοποιείτε το &man.ppp.8; ή το &man.pppd.8; μπορείτε να εξετάσετε την έξοδο της &man.ifconfig.8; αφού ενεργοποιηθεί η σύνδεσή σας. Π.χ., για μια σύνδεση που ενεργοποιήθηκε από το &man.pppd.8; θα δείτε κάτι σαν αυτό (δείχνονται μόνο οι σχετικές γραμμές):

              &prompt.user; ifconfig
                (skipped...)
                ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524
                        inet xxx.xxx.xxx.xxx --> xxx.xxx.xxx.xxx netmask 0xff000000
                (skipped...)

Από την άλλη, για μια σύνδεση που ενεργοποιήθηκε με το &man.ppp.8; (user-ppp) θά πρεπε να δείτε κάτι παρόμοιο με το παρακάτω:

              &prompt.user; ifconfig
                (skipped...)
                ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
                (skipped...)
                tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524
                        (IPv6 stuff skipped...)
                        inet xxx.xxx.xxx.xxx --> xxx.xxx.xxx.xxx netmask 0xffffff00
                        Opened by PID xxxxx
                (skipped...)