Πώς να ρυθμίσετε ένα τείχος προστασίας Iptables για να ενεργοποιήσετε την απομακρυσμένη πρόσβαση σε υπηρεσίες στο Linux - Μέρος 8


Παρουσίαση του προγράμματος πιστοποίησης του Linux Foundation

Θα θυμάστε από το Μέρος 1 – Σχετικά με τα Iptables αυτής της σειράς LFCE (Linux Foundation Certified Engineer) ότι δώσαμε μια βασική περιγραφή του τι είναι ένα τείχος προστασίας: ένας μηχανισμός διαχείρισης πακέτα που εισέρχονται και εξέρχονται από το δίκτυο. Με τον όρο διαχείριση εννοούμε στην πραγματικότητα:

  1. Για να επιτρέψουμε ή να αποτρέψουμε ορισμένα πακέτα να εισέλθουν ή να εξέλθουν από το δίκτυό μας.
  2. Για να προωθήσετε άλλα πακέτα από ένα σημείο του δικτύου σε άλλο.

με βάση προκαθορισμένα κριτήρια.

Σε αυτό το άρθρο θα συζητήσουμε πώς να εφαρμόσετε το βασικό φιλτράρισμα πακέτων και πώς να ρυθμίσετε το τείχος προστασίας με το iptables, ένα frontend στο netfilter, το οποίο είναι μια μονάδα εγγενούς πυρήνα που χρησιμοποιείται για τείχος προστασίας.

Λάβετε υπόψη ότι το τείχος προστασίας είναι ένα τεράστιο θέμα και αυτό το άρθρο δεν προορίζεται να αποτελέσει έναν περιεκτικό οδηγό για την κατανόηση όλων όσων πρέπει να γνωρίζουμε για αυτό, αλλά μάλλον ως σημείο εκκίνησης για μια βαθύτερη μελέτη αυτού του θέματος. Ωστόσο, θα επανεξετάσουμε το θέμα στο Μέρος 10 αυτής της σειράς όταν εξερευνήσουμε ορισμένες συγκεκριμένες περιπτώσεις χρήσης ενός τείχους προστασίας στο Linux.

Μπορείτε να σκεφτείτε ένα τείχος προστασίας ως ένα διεθνές αεροδρόμιο όπου τα επιβατικά αεροπλάνα έρχονται και φεύγουν σχεδόν 24/7. Βάσει ορισμένων προϋποθέσεων, όπως η ισχύς του διαβατηρίου ενός ατόμου ή η χώρα προέλευσής του (για να αναφέρουμε μερικά παραδείγματα), μπορεί ή όχι να του επιτραπεί η είσοδος ή η έξοδος από μια συγκεκριμένη χώρα.

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

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

  1. Άτομα=Πακέτα
  2. Τείχος προστασίας=Αεροδρόμιο
  3. Χώρα #1=Δίκτυο #1
  4. Χώρα #2=Δίκτυο #2
  5. Κανονισμοί αεροδρομίου που επιβάλλονται από αξιωματικούς=κανόνες τείχους προστασίας

Iptables – Τα βασικά

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

Η πρώτη ενέργεια που θα γίνει από το iptables θα συνίσταται στο να αποφασίσετε τι να κάνετε με ένα πακέτο:

  1. Το αποδεχτείτε (να το αφήσετε να περάσει στο δίκτυό μας);
  2. Απορρίψτε το (να το αποτρέψετε από την πρόσβαση στο δίκτυό μας);
  3. Προωθήστε το (σε άλλη αλυσίδα);

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

1. Η αλυσίδα INPUT χειρίζεται πακέτα που εισέρχονται στο δίκτυο, τα οποία προορίζονται για τοπικά προγράμματα.

2. Η αλυσίδα OUTPUT χρησιμοποιείται για την ανάλυση πακέτων που προέρχονται από το τοπικό δίκτυο, τα οποία πρόκειται να σταλούν προς τα έξω.

3. Η αλυσίδα FORWARD επεξεργάζεται τα πακέτα που πρέπει να προωθηθούν σε άλλο προορισμό (όπως στην περίπτωση ενός δρομολογητή).

Για καθεμία από αυτές τις αλυσίδες υπάρχει μια προεπιλεγμένη πολιτική, η οποία υπαγορεύει τι πρέπει να γίνει από προεπιλογή όταν τα πακέτα δεν ταιριάζουν με κανέναν από τους κανόνες της αλυσίδας. Μπορείτε να δείτε τους κανόνες που δημιουργήθηκαν για κάθε αλυσίδα και την προεπιλεγμένη πολιτική εκτελώντας την ακόλουθη εντολή:

# iptables -L

Οι διαθέσιμες πολιτικές είναι οι εξής:

  1. ACCEPT → αφήνει το πακέτο να περάσει. Κάθε πακέτο που δεν ταιριάζει με κανέναν κανόνα της αλυσίδας επιτρέπεται στο δίκτυο.
  2. ΑΠΟΣΥΝΣΗ → ρίχνει το πακέτο αθόρυβα. Οποιοδήποτε πακέτο δεν ταιριάζει με κανέναν κανόνα της αλυσίδας εμποδίζεται να εισέλθει στο δίκτυο.
  3. ΑΠΟΡΡΙΨΗ → απορρίπτει το πακέτο και επιστρέφει ένα ενημερωτικό μήνυμα. Αυτό συγκεκριμένα δεν λειτουργεί ως προεπιλεγμένη πολιτική. Αντίθετα, προορίζεται να συμπληρώσει τους κανόνες φιλτραρίσματος πακέτων.

Όταν πρόκειται να αποφασίσετε ποια πολιτική θα εφαρμόσετε, πρέπει να λάβετε υπόψη τα πλεονεκτήματα και τα μειονεκτήματα κάθε προσέγγισης, όπως εξηγήθηκε παραπάνω – σημειώστε ότι δεν υπάρχει ένα ενιαίο μέγεθος -όλα λύση.

Προσθήκη κανόνων

Για να προσθέσετε έναν κανόνα στο τείχος προστασίας, καλέστε την εντολή iptables ως εξής:

# iptables -A chain_name criteria -j target

που,

  1. -A σημαίνει Προσάρτηση (προσάρτηση του τρέχοντος κανόνα στο τέλος της αλυσίδας).
  2. Το
  3. chain_name είναι είτε INPUT, OUTPUT ή FORWARD.
  4. Ο
  5. στόχος είναι η ενέργεια ή η πολιτική που πρέπει να εφαρμοστεί σε αυτήν την περίπτωση (ΑΠΟΔΟΧΗ, ΑΠΟΡΡΙΨΗ ή ΑΠΟΡΡΙΨΗ).
  6. κριτήρια είναι το σύνολο των συνθηκών βάσει των οποίων θα εξεταστούν τα πακέτα. Αποτελείται από τουλάχιστον μία (πιθανότατα περισσότερες) από τις ακόλουθες σημαίες. Οι επιλογές μέσα στις αγκύλες, που χωρίζονται με κάθετη ράβδο, είναι ισοδύναμες μεταξύ τους. Το υπόλοιπο αντιπροσωπεύει προαιρετικούς διακόπτες:

[--protocol | -p] protocol: specifies the protocol involved in a rule.
[--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated.
[--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined.
[--source | -s] address[/mask]: represents the source address or network/mask.
[--destination | -d] address[/mask]: represents the destination address or network/mask.
[--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID.
[--in-interface | -i] interface: specifies the input interface of the packet.
[--out-interface | -o] interface: the output interface.
[--jump | -j] target: what to do when the packet matches the rule.

Το περιβάλλον δοκιμών μας

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

Firewall: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
Source: CentOS 7 
Hostname: dev1.gabrielcanepa.com
IP Address: 192.168.0.17

Και αυτό για το τελευταίο παράδειγμα

NFSv4 server and firewall: Debian Wheezy 7.5 
Hostname: debian
IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15

Θα ορίσουμε πρώτα μια πολιτική DROP για τα ping εισόδου στο τείχος προστασίας μας. Δηλαδή, τα πακέτα icmp θα απορρίπτονται αθόρυβα.

# ping -c 3 192.168.0.15
# iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP

Πριν προχωρήσουμε στο τμήμα ΑΠΟΡΡΙΨΗ, θα ξεπλύνουμε όλους τους κανόνες από την αλυσίδα INPUT για να βεβαιωθούμε ότι τα πακέτα μας θα δοκιμαστούν με αυτόν τον νέο κανόνα:

# iptables -F INPUT
# iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
# ping -c 3 192.168.0.15

Θα ασχολούμαστε με την αλυσίδα OUTPUT καθώς διαχειριζόμαστε την εξερχόμενη κίνηση:

# iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT

Εκτελέστε τις ακόλουθες εντολές στον διακομιστή/τείχος προστασίας NFSv4 για να κλείσετε τις θύρες 2049 και 111 για κάθε είδους κίνηση:

# iptables -F
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT

Τώρα ας ανοίξουμε αυτές τις θύρες και ας δούμε τι συμβαίνει.

# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT

Όπως μπορείτε να δείτε, μπορέσαμε να προσαρτήσουμε το κοινόχρηστο στοιχείο NFSv4 μετά το άνοιγμα της κυκλοφορίας.

Εισαγωγή, προσάρτηση και διαγραφή κανόνων

Στα προηγούμενα παραδείγματα δείξαμε πώς να προσαρτήσετε κανόνες στις αλυσίδες INPUT και OUTPUT. Αν θέλουμε να τα εισάγουμε σε μια προκαθορισμένη θέση, θα πρέπει να χρησιμοποιήσουμε τον διακόπτη -I (κεφαλαία i).

Πρέπει να θυμάστε ότι οι κανόνες θα αξιολογούνται ο ένας μετά τον άλλο και ότι η αξιολόγηση σταματά (ή μεταπηδά) όταν αντιστοιχιστεί μια πολιτική ΑΠΟΣΥΝΣΗ ή ΑΠΟΔΟΧΗ. Για αυτόν τον λόγο, μπορεί να βρεθείτε στην ανάγκη να μετακινήσετε κανόνες προς τα πάνω ή προς τα κάτω στη λίστα αλυσίδων, όπως χρειάζεται.

Θα χρησιμοποιήσουμε ένα ασήμαντο παράδειγμα για να το δείξουμε:

Ας βάλουμε τον παρακάτω κανόνα,

# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

στη θέση 2) στην αλυσίδα INPUT (με αποτέλεσμα να μετακινηθεί το προηγούμενο #2 ως #3)

Χρησιμοποιώντας την παραπάνω ρύθμιση, η κυκλοφορία θα ελεγχθεί για να διαπιστωθεί εάν κατευθύνεται στη θύρα 80 πριν από τον έλεγχο για τη θύρα 2049.

Εναλλακτικά, μπορείτε να διαγράψετε έναν κανόνα και να αλλάξετε τον στόχο των υπόλοιπων κανόνων σε ΑΠΟΡΡΙΨΗ (χρησιμοποιώντας το διακόπτη -R):

# iptables -D INPUT 1
# iptables -nL -v --line-numbers
# iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
# iptables -R INPUT 1 -p tcp --dport 80 -j REJECT

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

Αποθήκευση κανόνων τείχους προστασίας:

# iptables-save > /etc/iptables/rules.v4		[On Ubuntu]
# iptables-save > /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

Κανόνες επαναφοράς:

# iptables-restore < /etc/iptables/rules.v4		[On Ubuntu]
# iptables-restore < /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

Εδώ μπορούμε να δούμε μια παρόμοια διαδικασία (αποθήκευση και επαναφορά κανόνων τείχους προστασίας με το χέρι) χρησιμοποιώντας ένα εικονικό αρχείο που ονομάζεται iptables.dump αντί του προεπιλεγμένου όπως φαίνεται παραπάνω.

# iptables-save > iptables.dump

Για να κάνετε αυτές τις αλλαγές επίμονες σε όλες τις μπότες:

Ubuntu: Εγκαταστήστε το πακέτο iptables-persistent, το οποίο θα φορτώσει τους κανόνες που είναι αποθηκευμένοι στο αρχείο /etc/iptables/rules.v4.

# apt-get install iptables-persistent

CentOS: Προσθέστε τις ακόλουθες 2 γραμμές στο αρχείο /etc/sysconfig/iptables-config.

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

OpenSUSE: Λίστα επιτρεπόμενων θυρών, πρωτοκόλλων, διευθύνσεων κ.λπ. (χωρισμένα με κόμμα) στο /etc/sysconfig/SuSEfirewall2.

Για περισσότερες πληροφορίες, ανατρέξτε στο ίδιο το αρχείο, το οποίο σχολιάζεται έντονα.

συμπέρασμα

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

Για όσους από εσάς είστε λάτρεις του τείχους προστασίας, έχετε υπόψη σας ότι θα επανεξετάσουμε αυτό το θέμα με πιο συγκεκριμένες εφαρμογές στο Μέρος 10 αυτής της σειράς LFCE.

Μη διστάσετε να με ενημερώσετε εάν έχετε ερωτήσεις ή σχόλια.