Πως να χειριστείτε το firewall του Linux, το πανίσχυρο iptables

dimitris | Σάβ, 05/10/2014 - 00:07 | 13' | 1

Σε αυτό το άρθρο, κάνουμε μια μικρή βουτιά ή καλύτερα μια εισαγωγική βόλτα στο μαγικό κόσμο του iptables, δηλαδή του firewall του Linux.

Πριν ξεκινήσουμε, να υπενθυμίσω σε όσους δεν το θυμουνται ότι όλες οι παρακάτω εντολές που ξεκινού με # σημαίνει ότι απαιτούν προνόμια root, οπότε πριν τις δοκιμάσετε, δώστε sudo su ή su – και τον κωδικό του χρήστη root.

Καταρχήν, ελέγξτε ότι τρέχει το firewall.

# lsmod |grep ip

Δώστε την παραπάνω εντολή και θα πρέπει να δείτε κάτι σαν το παρακάτω, που λέει ότι το απαραίτητο module του πυρήνα έχει φορτωθεί:

iptable_filter 1302 0
ip_tables 10460 1 iptable_filter
x_tables 15921 2 iptable_filter,ip_tables

Ας δούμε τώρα ποιοι κανόνες έχουν φορτωθεί στο firewall.

# iptables -L

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

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Να το αναλύσουμε λίγο. Το iptables ταξινομεί τους κανόνες σε διάφορους πίνακες: filter, nat, mangle, κλπ. Εδώ θα ασχοληθούμε μόνο με τον πίνακα filter ο οποίος περιέχει κανόνες για το φιλτράρισμα των πακέτων IP, δηλαδή οποιασδήποτε πληροφορίας μπαίνει ή βγαίνει από τον υπολογιστή μας. Εξορισμού, η παραπάνω εντολή δείχνει τους κανόνες για τον πίνακα filter.

Οι κανόνες του πίνακα filter ταξινομούνται σε τρεις αλυσίδες (chains):

  • INPUT, για να φιλτράρουμε πακέτα που εισέρχονται στον υπολογιστή,
  • OUTPUT για να ελέγχουμε τα πακέτα που εξέρχονται από τον υπολογιστή
  • FORWARD, για το φιλτράρισμα πακέτων που έχουν προωθηθεί

Κάθε πακέτο ελέγχεται για το αν εμπίπτει σε κάποιον από τους κανόνες αυτών των αλυσίδων. Ανάλογα με τον κανόνα, ο πυρήνας αποφασίζει για το τι ενέργεια θα εκτελέσει τελικά με το εν λόγω πακέτο. Οι πλέον συνηθισμένες ενέργειες (λέγονται targets) είναι η DROP, για το μπλοκάρισμα του πακέτου, και η ACCEPT για την αποδοχή του πακέτου.

Στο παράδειγμα μας δεν έχει οριστεί κανένας κανόνας. Επιπλέον, η προκαθορισμένη ενέργεια για κάθε αλυσίδα ειναι η ACCEPT. Άρα, ο υπολογιστής μου είναι ανοικτός σε όλους. Σκέτο ελβετικό τυρί  :)

Αν όμως έχουμε ορίσει κανόνες στο firewall και θέλουμε να τους σβήσουμε όλους (π.χ. γιατί κάναμε λάθη), τι κάνουμε;

# iptables -F

Με την παραπάνω εντολή, διαγράφουμε (flush) όλους τους υπάρχοντες κανόνες του firewall. Αν θέλουμε να ξεκινήσουμε από το μηδέν, δίνουμε την παραπάνω εντολή και καθαρίζουμε.

Επόμενη εντολή (μην την τρέξετε ακόμα!):

# iptables -P INPUT DROP

H παράμετρος -P καθορίζει την πολιτική (Policy) για μια αλυσίδα, δηλαδή την εξορισμού ενέργεια/target. Με την παραπάνω εντολή, ορίζουμε ότι η εξορισμού ενέργεια για την αλυσίδα INPUT θα είναι η DROP. Με άλλα λόγια, λέμε στο firewall να μην δέχεται κανένα πακέτο, εκτός κι αν υπάρχει άλλος κανόνας που να ταιριάζει. Εφόσον δεν έχουμε ορίσει κανέναν άλλο κανόνα μέχρι τώρα, αυτό σημαίνει ότι δεν δεχόμαστε τίποτε. O υπολογιστής μας είναι στεγανός. Ανοίξτε ένα άλλο παράθυρο τερματικού και δοκιμάστε να κάνετε ping:

ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.

και θα μείνει εκεί χωρίς να πάρετε ποτέ απόκριση. Το ίδιο θα συμβεί και σε οποιοσδήποτε άλλον υπολογιστή επιχειρήσει να επικοινωνήσει με τον υπολογιστή σας, από οπουδήποτε στο Internet.

# iptables -P INPUT ACCEPT

Αν κάνουμε DROP όλα τα εισερχόμενα πακέτα, τότε δεν θα έχουμε καν πρόσβαση στο διαδίκτυο. Η παραπάνω εντολή αλλάζει την εξορισμού ενέργεια σε αποδοχή όλων των εισερχόμενων πακέτων – αυτό δεν είναι καλό, αλλά κάντε το μόνο για δοκιμή: δώστε την παραπάνω εντολή και θα δείτε ότι η ping (στο άλλο τερματικό που ανοίξατε) ξεμπλόκαρε:

ping 192.168.1.2

PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_req=1 ttl=64 time=0.072 ms
64 bytes from 192.168.1.2: icmp_req=2 ttl=64 time=0.032 ms
...

Στη συνέχεια ξαναδώστε iptables -P INPUT DROP για να σταματήσετε κάθε εισερχόμενο πακέτο. Παρακάτω, θα δώσουμε μια καλύτερη λύση, που θα προσφέρει μεγαλύτερη ασφάλεια από το να επιτρέπουμε τα πάντα...

# iptables -P FORWARD DROP

Ορίζουμε την εξορισμού πολιτική για την αλυσίδα FORWARD, δηλαδή για όλα τα πακέτα που δεν έχουν παραλήπτη εμάς αλλά περνάνε από εμάς προς κάποιον άλλο υπολογιστή, σε DROP. Αν δεν χρησιμοποιούμε τον υπολογιστή ως router δεν έχει νόημα να δεχόμαστε αυτά τα πακέτα, οπότε τα απορρίπτουμε.

# iptables -P OUTPUT ACCEPT

Δεχόμαστε όλα τα πακέτα που εμπίπτουν στην αλυσίδα OUTPUT, δηλαδή όλα τα πακέτα που φεύγουν από εμάς. Αυτό είναι λογικό, εκτός κι αν υποπτευόμαστε ότι ο υπολογιστής μας έχει καταληφθεί από κακόβουλο λογισμικό...

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Με την παραπάνω εντολή, προσθέτουμε τον πρώτο μας κανόνα στην αλυσίδα INPUT. Η προσθήκη ενός κανόνα στο τέλος της αλυσίδας γίνεται με την παράμετρο -Α και ακολουθείται από το όνομα της αλυσίδας που μας ενδιαφέρει (π.χ. -A INPUT). Η παράμετρος -m μας επιτρέπει να φορτώσουμε ένα module, όπως το state. Το state module ελέγχει την κατάσταση κάθε πακέτου:

  • Αν το πακέτο έχει κατάσταση «νέο» (NEW) τότε πρόκειται για εισερχόμενες συνδέσεις που δεν ζήτησε ο υπολογιστής μας
  • Αν το πακέτο έχει κατάσταση ESTABLISHED ή RELATED, τότε πρόκειται για εισερχόμενο πακέτο από μια σύνδεση που έχουμε ζητήσει εμείς ή σχετιζόμενο πακέτο.

Η παράμετρος -j (jump) καθορίζει την ενέργεια/target, δηλαδή τι πρέπει να γίνει αν ένα πακέτο ταιριάζει με τον κανόνα. Εδώ καθορίζουμε την ενέργεια ACCEPT, που σημαίνει ότι με την παραπάνω εντολή, υποχρεώνουμε το firewall να δεχτεί οποιοδήποτε πακέτο προορίζεται για ή σχετίζεται με κάποια υπάρχουσα σύνδεση. Με αυτήν την εντολή λύνουμε το πρόβλημα που είδαμε παραπάνω με την iptables -P INPUT DROP. Σε συνδυασμό με εκείνη την εντολή, κλείνουμε το σύστημα σε όλες τις εισερχόμενες συνδέσεις και όλα τα εισερχόμενα πακέτα, εκτός κι αν προέρχονται από συνδέσεις που έχουμε ανοίξει εμείς.

# iptables -A INPUT -i lo -j ACCEPT

Προσθέτουμε (-Α INPUT) έναν νέο κανόνα στην αλυσίδα INPUT, όπου ζητάμε από το firewall να αποδέχεται (-j ACCEPT) οποιοδήποτε πακέτο προορίζεται για το interface του localhost (-i lo). Δηλαδή, ο κανόνας υποχρεώνει το firewall να δέχεται όποιο πακέτο προορίζεται για το localhost (127.0.0.1). Αυτό είναι απαραίτητο για τη λειτουργία αρκετών προγραμμάτων.

# iptables -I INPUT 1 -i lo -j ACCEPT

Η παράμετρος -Α προσθέτει έναν κανόνα στο τέλος της εκάστοτε αλυσίδας. Εναλλακτικά, για να προσθέσουμε τον κανόνα σε συγκεκριμένη σειρά, θα χρησιμοποιήσουμε την παράμετρο -Ι, όπως στην παραπάνω εντολή.

# iptables -A INPUT -p tcp --dport ssh -j ACCEPT

Εδώ επιτρέπουμε την εισερχόμενη κίνηση στην πόρτα 22 που χρησιμοποιείται από το SSH. Για να το πετύχουμε αυτό, φιλτράρουμε τα πακέτα για το πρωτόκολλο tcp (-p tcp), ελέγχουμε αν κατευθύνονται (--dport ssh) στην πόρτα 22 και ορίζουμε ως ενέργεια την ACCEPT.

# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Αντίστοιχη εντολή για να επιτρέψουμε την κίνηση προς τον web server μας που τρέχει στην πόρτα 80.

# iptables -D INPUT 1

Με την εντολή αυτή, διαγράφουμε (-D) τον πρώτο κανόνα που υπάρχει στην αλυσίδα INPUT.

# iptables-save > rules.txt

Αποθηκεύουμε τους κανόνες που έχουμε δημιουργήσει σε ένα αρχείο (rules.txt)

# iptables-restore < rules.txt

Τέλος, με την παραπάνω εντολή, ξαναφορτώνουμε τους κανόνες από το αρχείο rules.txt.

 

 

Που τρέχω όλες αυτές τις εντολές;

Για να χρησιμοποιήσετε αυτές τις εντολές, πρέπει να τρέξετε ένα τερματικό (ή κονσόλα), δηλαδή ένα πρόγραμμα που σας επιτρέπει να γράψετε εντολές απευθείας στο κέλυφος του Linux. Αν έχετε Ubuntu, θα βρείτε το Τερματικό στο μενού “Εφαρμογές” > “Βοηθήματα”. Αν έχετε Fedora, θα το βρείτε στο μενού “Εφαρμογές” > “Εργαλεία Συστήματος”. Αν δεν το βρίσκετε, πατήστε το συνδυασμό πλήκτρων ALT+F2 και γράψτε gnome-terminal (αν έχετε Gnome) ή konsole (αν έχετε KDE).

 

Σύνδεσμοι:

[1] Ενα πλήρες tutorial για το iptables: goo.gl/JA7Ml

[2] Αξιοποίηση του iptables για φιλτράρισμα: goo.gl/ewUZ5

 

Δώσε αστέρια!

MO: 5 (ψήφοι: 2)

Σχόλια