Προς το περιεχόμενο

iptables


The_Mentor

Προτεινόμενες αναρτήσεις

Έχω καταμπερδευτεί... προσπαθώ να αποκλείσω μια διεύθυνση ΙΡ (10.10.10.10) απο το να μπαινει στο ιντερνετ και δεν μπορώ ότι και να δοκίμασα...

Διάβασα και του αποικου το ποστ αλλά είμαι σε κατάσταση σοκ!!!

Προφανώς πρέπει να μπεί πρίν την δήλωση

iptables -I INPUT -s XXX.XXX.XXX.XXX -j DROP

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

διαφορετικά δεν θα παίζει αλλά...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Περίγραψε την τοπολογία του δικτύου σου και τι ακριβώς θέλεις να κάνεις, αλλιώς δε μπορεί κανείς να βοηθήσει ;)

 

Αν μάντεψα καλά, έχεις ένα εσωτερικό δίκτυο (ας πούμε 10.10.10.0/24), έχεις επίσης και ένα μηχάνημα με IPtables το οποίο έχει ένα interface στο εσωτερικό δίκτυο και ένα interface με public IP address προς το Internet και το μηχάνημα αυτό το έχεις να κάνει NAT ώστε να χρησιμεύει ως gateway του εσωτερικού δικτύου προς το Internet. Όμως σε έναν από τους hosts του εσωτερικού δικτύου θέλεις να απαγορεύσεις την πρόσβαση στο Internet. Έτσι είναι;

 

Σε αυτήν την περίπτωση θα πρέπει να χρησιμοποιήσεις την αλυσίδα Forward, καθώς η αλυσίδα Input αναφέρεται σε πακέτα που προορίζονται για το ίδιο το μηχάνημα με τα Iptables, και να τοποθετήσεις σε κάποιο μέρος αυτής της αλυσίδας αρκετά υψηλό ώστε να μην προλάβει κάποιος κανόνας με ALLOW target να τερματίσει τα πακέτα που σε ενδιαφέρουν (αν υπάρχει τέτοιος κανόνας φυσικά), κάτι σαν:

 

>iptables -A FORWARD -s 10.10.10.10 -j DROP

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μια NIC κάρτα με eth0 62.x.x.x & eth0:1 10.10.10.11

 

Λοιπόν, Ξεκινάω έτσι:

 

>iptables -F INPUT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -d 10.Χ.Χ.11 -j ACCEPT
iptables -A INPUT -i eth0 -s 10.x.x.0/24 -j ACCEPT

 

Επίσης κάνω accept τα ICMP πακέτα

 

και προχωρώ:

>iptables -A INPUT -p tcp --dport 80 -j ACCEPT
+ διάφορά άλλα πορτ που χρειάζομαι για το δίκτυο

 

Τερματίζω:

>iptables -P INPUT DROP

 

και μασκάρώ με

 

>echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -d ! 10.x.x.0/24 -j SNAT --to-source 62.x.x.x

 

Στο παραπάνω φαίνεται πως κάνω accept όλοι την κίνηση από το eth0.

Θα ήθελα όμως να κόψω Internet (αλλά όχι mail αν γίνεται) από την διεύθυνση 10.10.10.30 πχ.

 

Δοκίμασα όπως είπα και παραπάνω ότι μου περνούσε από το μυαλό (προσπαθώντας να εφαρμόσω και του αποικου το how-to αλλά μπερδεύτηκα μάλλον περισσότερο...

 

Μιά βοήθεια κατανοητή παιδιά...

 

Ευχαριστώ!!!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το σημαντικό είναι να δεις τη διαφορά ανάμεσα στις 3 βασικές αλυσίδες: την INPUT, την OUTPUT και την FORWARD.

 

- Ο,τιδήποτε βάλεις στην αλυσίδα INPUT θα εφαρμοστεί σε πακέτα τα οποία απευθύνονται στον ίδιον τον host που τρέχει τα iptables. Όχι σε πακέτα τα οποία θα δρομολογηθούν.

- Ο,τιδήποτε βάλεις στην αλυσίδα FORWARD θα εφαρμοστεί σε πακέτα τα οποία φθάνουν σε κάποιο interface του host που τρέχει τα iptables, όμως δεν έχουν Destination Address κάποια από τις ίδιες IP αυτού του host, οπότε πρόκειται να δρομολογηθούν από κάποιο άλλο Interface.

- Ο,τιδήποτε βάλεις στην αλυσίδα OUTPUT θα εφαρμοστεί σε πακέτα τα οποία προέρχονται από τον ίδιον τον host που τρέχει τα iptables.

 

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

 

Αυτή τη στιγμή, αφού δεν έχεις κανέναν κανόνα για την αλυσίδα forward, θα εφαρμοστεί το policy για αυτή την αλυσίδα, το οποίο by default είναι ACCEPT. Αν θέλεις να απαγορεύσεις την πρόσβαση του 10.10.10.30 προς το internet, μπορείς να προσθέσεις κάτι σαν:

>iptables -A FORWARD -s 10.10.10.30 -j DROP

 

Αν θέλεις να επιτρέψεις την πρόσβαση του 10.10.10.30 μόνο προς SMTP servers που ακούν στην port 25, μπορείς να προσθέσεις πριν από αυτόν τον κανόνα, κάτι σαν:

 

>iptables -A FORWARD -p tcp --dport 25 -s 10.10.10.30 -j ACCEPT

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

 

 

Οπότε π.χ. αν έβαζες πρώτα τον rule

 

>iptables -A FORWARD -s 10.10.10.30 -j DROP

 

και μετά τον rule

>iptables -A FORWARD -p tcp --dport 25 -s 10.10.10.30 -j ACCEPT

 

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ευχαριστώ πολύ για την βοήθεια...

 

Στον κανόνα στις πρώτες εντολές φάίνεται πως

 

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

 

με αυτή κάνω accept όλη την κίνηση που ξεκινάω εγώ (από το δίκτυο μου). Επομένως ΠΡΙΝ απο αυτή θα πρέπει να μπεί? Ρωτάω διότι λογικά δεν θα έχει πρόβλημα αν του λές:

 

1. Κάνε accept όλη την κίνηση που ξεκινάω εγώ

2. Κάνε Accept την κίνηση μόνο από την πόρτα 25 της ΙΡ 10.10.10.30

 

Αυτό το σημείο με έχει μπερδέψει...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

με αυτή κάνω accept όλη την κίνηση που ξεκινάω εγώ (από το δίκτυο μου)

Όχι την κίνηση προς το Internet! Οι υπολογιστές του δικτύου σου για να βγουν στο internet δε θα περάσουν ποτέ από την αλυσίδα INPUT. Η INPUT έχει σχέση αποκλειστικά με το ποιος θα μπορεί να επικοινωνήσει απευθείας με το ίδιο το μηχάνημα που τρέχει τα iptables.

 

- Ο,τιδήποτε βάλεις στην αλυσίδα INPUT θα εφαρμοστεί σε πακέτα τα οποία απευθύνονται στον ίδιον τον host που τρέχει τα iptables. Όχι σε πακέτα τα οποία θα δρομολογηθούν.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Συνολικός κανόνας

 

>
#!/usr/local/bin/bash
#
# καθαρίζω τον πίνακα συνολικά
iptables -F
# δέχομαι το loopback από την μηχανή μου
iptables -A INPUT -i lo -j ACCEPT
# δέχομαι INTRANET συνδέσεις που γίνονται από το δίκτυό μου
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Δέχομαι 5 ping max ta 10
iptables -A INPUT -p icmp --icmp-type echo-request -m limit \ --limit 5/s --limit-burst 10 -j ACCEPT
# δέχομαι ICMP packets except echo-request
iptables -p icmp --icmp-type ! echo-request -j ACCEPT
# δέχομαι traffic στην κάρτα μου eth0 
iptables -A INPUT -i eth0 -d 10.10.10.11 -j ACCEPT
iptables -A INPUT -i eth0 -s 10.10.10.0/24 -j ACCEPT
# Σύνδεση μόνο για email από συγκεκριμένες IPs
iptables -A FORWARD -p tcp --dport 25 -s 10.10.10.10 -j ACCEPT
# ΑΡΝΟΥΜΑΙ συνδέσεις προς INTERNET από συγκεκριμένες IPs
iptables -A FORWARD -s 10.10.10.10 -j DROP
# Setting Ports
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 23 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT
# πετάμε την υπόλοιπη κίνηση
iptables -P INPUT DROP
# FTP (passive and active mode) από το firewall
modprobe ip_conntrack_ftp
# Masquerating
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -d ! 10.10.10.0/24 -j SNAT --to-source 62.x.x.x
#

 

Είναι σωστό???

Βάση αυτού θα έχει ο κόσμος Internet εκτός από το 10.10.10.10 που θα έχει ΜΟΝΟ μαιλ????

 

Και πάλι ευχαριστώ...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι, αν το

># iptables -A FORWARD -s 10.10.10.30 -j DROP

το κάνεις

>iptables -A FORWARD -s 10.10.10.10 -j DROP

 

πρέπει να δουλέψει.

 

ΥΣ. Αν θέλεις, αφού δεις ότι δουλεύει, αντικατάστησε το policy της FORWARD με default deny, όπως κάνεις με την INPUT, και κάνε accept όσο το δυνατόν λιγότερα και πιο συγκεκριμένα πράγματα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Thanks...

 

Eternal Respect...

 

Να ρωτήσω κάτι ακόμα...

 

Στο σημείο που κάνουμε

># δέχομαι traffic στην κάρτα μου eth0 
iptables -A INPUT -i eth0 -d 10.10.10.11 -j ACCEPT
iptables -A INPUT -i eth0 -s 10.10.10.0/24 -j ACCEPT

 

δέχομαι όλη την κίνηση στην eth0 μου.

 

Αν ήθελα να βγάλω έξω ΜΟΝΟ 5 διευθύνσεις ιρ (10.10.10.10 έως 10.10.10.14) θα έπρεπε να κάνω DROP όλη την κίνηση και μετά ACCEPT τις συγκεκριμένες διευθύνσεις????????

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μα αφού είπαμε ότι η αλυσίδα INPUT δε σχετίζεται με ο,τι δρομολογείται από ένα interface σε ένα άλλο, μόνο η αλυσίδα FORWARD σχετίζεται! Την INPUT μην την κοιτάς καν όταν θέλεις να καθορίσεις την πρόσβαση του εσωτερικού δικτύου στο Internet, σα να μην υπάρχει.

 

Οπότε θα πάρεις 1-1 τους κανόνες της Forward και θα επαληθεύσεις τη σειρά μεταξύ τους όταν θέλεις να κάνεις οποιαδήποτε αλλαγή. Αυτή τη στιγμή έχεις 2 κανόνες και το default policy της Forward είναι ACCEPT.

 

Λες:

 

1) iptables -A FORWARD -p tcp --dport 25 -s 10.10.10.10 -j ACCEPT

# Όταν ο host 10.10.10.10 προσπαθεί να συνδεθεί στην port 25 απομακρυσμένων hosts επίτρεψε στα πακέτα να περάσουν.

 

2) iptables -A FORWARD -s 10.10.10.10 -j DROP

# Όταν ο host 10.10.10.10 προσπαθεί να συνδεθεί οπουδήποτε πέταξε τα πακέτα του στα σκουπίδια. Φυσικά αν προσπαθεί να συνδεθεί στην 25, θα τον έχει πιάσει ήδη ο από πάνω κανόνας οπότε τα πακέτα του θα περάσουν.

 

3) iptables -P FORWARD ACCEPT

# (αυτό δε το λες αλλά ενοείται επειδή δε λες κάτι άλλο) Ο,τιδήποτε δεν έχει ταιριάξει σε κάποιον κανόνα, κάνε το ACCEPT.

 

 

Θα μπορούσες να το κάνεις κάπως έτσι:

 

1) iptables -A FORWARD -p tcp --dport 25 -s 10.10.10.10 -j ACCEPT

# Όταν ο host 10.10.10.10 προσπαθεί να συνδεθεί στην port 25 κάνε τα πακέτα του ACCEPT

 

2) iptables -A FORWARD -s 10.10.10.0/24 ! 10.10.10.10 -j ACCEPT

# Ο,τιδήποτε έρχεται από hosts του δικτύου 10.10.10.0/24, εκτός από τον host 10.10.10.10, κάνε το ACCEPT. Μπορείς να βάλεις όσους hosts θέλεις δίπλα δίπλα, επίσης για λόγους τάξης μπορείς να τους ορίσεις σε μια μεταβλητή και να δώσεις στην παράμετρο -s το όνομα της μεταβλητής.

 

3) iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Ό,τιδήποτε πακέτο ανήκει ή σχετίζεται με μια σύνδεση η οποία έχει ανοίξει ήδη (προφανώς επειδή της έχει επιτραπεί από κάποιον από τους άλλους κανόνες), κάνε το ACCEPT.

 

4) iptables -P FORWARD DROP

# Ο,τιδήποτε δεν έχει ταιριάξει σε κάποιον κανόνα, κάνε το DROP.

 

Οπότε αν ήθελές να εφαρμόσεις αυτό που είπες, το

2) iptables -A FORWARD -s 10.10.10.0/24 ! 10.10.10.10 -j ACCEPT

# Ο,τιδήποτε έρχεται από hosts του δικτύου 10.10.10.0/24, εκτός από τον host 10.10.10.10, κάνε το ACCEPT. Μπορείς να βάλεις όσους hosts θέλεις δίπλα δίπλα, επίσης για λόγους τάξης μπορείς να τους ορίσεις σε μια μεταβλητή και να δώσεις στην παράμετρο -s το όνομα της μεταβλητής.

 

θα γινόταν

 

2) iptables -A FORWARD -s 10.10.10.11 10.10.10.12 10.10.10.13 10.10.10.14 -j ACCEPT

# Ο,τιδήποτε έρχεται από τους hosts 10.10.10.11-14, κάνε το ACCEPT.

 

ή πιο όμορφα

 

ALLOWED_HOSTS="10.10.10.11 10.10.10.12 10.10.10.13 10.10.10.14"

 

iptables -A FORWARD -s $ALLOWED_HOSTS -j ACCEPT

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

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

  • Δημιουργία νέου...