1. Βασικά
2. Δημιουργήστε αρχικούς κανόνες
3. Κάντε τους κανόνες επίμονους
4. Επιτρέψτε τις εξερχόμενες συνδέσεις
5. Επιτρέψτε ή αποκλείστε ολόκληρες χώρες
Εισαγωγή
iptablesείναι ένα ισχυρό εργαλείο που χρησιμοποιείται για τη διαμόρφωση του ενσωματωμένου τείχους προστασίας του πυρήνα Linux. Έρχεται προεγκατεστημένο στις περισσότερες διανομές Ubuntu, ωστόσο εάν χρησιμοποιείτε μια προσαρμοσμένη έκδοση του Ubuntu ή εκτελείτε μέσα σε ένα κοντέινερ, πιθανότατα θα πρέπει να το εγκαταστήσετε με μη αυτόματο τρόπο.
sudo apt-get install iptables iptables-persistent
Μετά την εγκατάσταση, εάν ερωτηθείτε εάν θέλετε να αποθηκεύσετε τους τρέχοντες κανόνες σας, δεν έχει σημασία αυτή τη στιγμή γιατί πρόκειται να καταργήσετε ή να δημιουργήσετε νέους κανόνες αργότερα.
Συμβουλές
Μπορείτε να χρησιμοποιήσετε την netcatεντολή (σε διαφορετικό υπολογιστή από τον διακομιστή σας) για να ελέγξετε ποιες από τις θύρες σας είναι ανοιχτές ή κλειστές.
nc -z -w5 -v SERVER_IP PORT
nc είναι η εντολή netcat.
-z απλά στείλτε ένα πακέτο χωρίς ωφέλιμο φορτίο.
-w5 περιμένετε έως και 5 δευτερόλεπτα για απάντηση.
-v αναλυτική λειτουργία.
- Αντικαταστήστε
SERVER_IPμε τη διεύθυνση του διακομιστή σας.
- Αντικαταστήστε
PORTτη θύρα που θέλετε να δοκιμάσετε εάν είναι ανοιχτή (π.χ. 22).
Στον διακομιστή σας μπορείτε να χρησιμοποιήσετε την netstatεντολή για να δείτε ποιες θύρες ακούν αυτήν τη στιγμή για συνδέσεις.
sudo netstat -tulpn
Σημείωση: Αν και netstatείναι εύκολο να βρείτε τις θύρες με τις οποίες θέλετε να εργαστείτε, θα πρέπει να γνωρίζετε τις εφαρμογές που έχετε εγκαταστήσει αυτήν τη στιγμή στον διακομιστή σας και ποιες θύρες ακούνε, δεν χρειάζεται να επιτρέπετε κάθε θύρα που βρίσκετε στην netstatέξοδο .
Σύνταξη
sudo iptables -A INPUT -p tcp -m tcp --dport 22 --m geoip --src-cc PE -j ACCEPT
-A INPUTπροσθέστε έναν κανόνα στην INPUTαλυσίδα, μια αλυσίδα είναι μια ομάδα κανόνων, αυτοί που χρησιμοποιούμε περισσότερο σε αυτόν τον οδηγό θα είναι INPUT, OUTPUTκαι PREROUTING.
-p tcpορίσετε tcpως το πρωτόκολλο στο οποίο θα ισχύει αυτός ο κανόνας, μπορείτε επίσης να χρησιμοποιήσετε άλλα πρωτόκολλα όπως udp, icmpή all.
-m tcpχρησιμοποιήστε τη tcpμονάδα. iptablesυποστηρίζει πρόσθετες λειτουργίες μέσω μονάδων, μερικές από τις οποίες είναι ήδη προεγκατεστημένες iptablesκαι άλλες, όπως η geoipμονάδα.
--dport 22οι εντολές που ξεκινούν με --υποδεικνύουν πρόσθετες επιλογές για τη λειτουργική μονάδα που χρησιμοποιήθηκε προηγουμένως, σε αυτήν την περίπτωση θα πούμε στη tcpμονάδα να εφαρμόζεται μόνο στη θύρα 22.
-m geoipχρησιμοποιήστε τη geoipμονάδα. Θα περιορίσει τα πακέτα ανά χώρα (περισσότερες πληροφορίες στο βήμα 5).
--src-cc PEπείτε στη geoipμονάδα να περιορίσει τα εισερχόμενα πακέτα σε αυτά που προέρχονται από το Περού. Για περισσότερους κωδικούς χωρών αναζητήστε ISO 3166 country codesστο Διαδίκτυο.
-j ACCEPTτο -jόρισμα λέει iptablesτι πρέπει να κάνετε εάν ένα πακέτο ταιριάζει με τους περιορισμούς που καθορίστηκαν στα προηγούμενα ορίσματα. Σε αυτή την περίπτωση θα ACCEPTεκείνα τα πακέτα, άλλες επιλογές είναι REJECT, DROPκαι πολλά άλλα. Μπορείτε να βρείτε περισσότερες επιλογές κάνοντας αναζήτηση iptables jump targetsστο διαδίκτυο.
1. Βασικά
Καταγράψτε όλους τους κανόνες.
sudo iptables -L
Καταχωρίστε όλες τις εντολές που χρησιμοποιήθηκαν για τη δημιουργία των κανόνων που χρησιμοποιούνται αυτήν τη στιγμή, χρήσιμες για την επεξεργασία ή τη διαγραφή κανόνων.
sudo iptables -S
Για να διαγράψετε έναν συγκεκριμένο κανόνα, επιλέξτε έναν κανόνα από sudo iptables -Sκαι αντικαταστήστε -Aμε -D.
# -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
sudo iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT
Καταχωρίστε όλους τους αριθμημένους κανόνες στην INPUTαλυσίδα.
sudo iptables -L INPUT --line-numbers
Διαγράψτε έναν αριθμημένο κανόνα.
sudo iptables -D INPUT 2
Να ξεκαθαρίσω όλους τους κανόνες.
sudo iptables -F
Προειδοποίηση: μπορεί να χάσετε τη σύνδεση εάν συνδεθείτε μέσω SSH .
Ξεκαθαρίστε μόνο κανόνες στην OUTPUTαλυσίδα.
sudo iptables -F OUTPUT
2. Δημιουργήστε αρχικούς κανόνες
Να επιτρέπεται SSHστη eth0διεπαφή
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-i eth0 Εφαρμόστε κανόνα σε μια συγκεκριμένη διεπαφή, για να επιτρέψετε την αφαίρεση αυτής της εντολής από οποιαδήποτε διεπαφή.
Για να περιορίσετε τα εισερχόμενα πακέτα σε μια συγκεκριμένη IP (δηλ 10.0.3.1/32. ).
sudo iptables -A INPUT -i eth0 -s 10.0.3.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
-s 10.0.3.1/32 καθορίζει ένα IP/υποδίκτυο από το οποίο επιτρέπεται η σύνδεση.
Ορίστε προεπιλεγμένους κανόνες αλυσίδας.
Προειδοποίηση: προτού συνεχίσετε, βεβαιωθείτε ότι έχετε εφαρμόσει τους σωστούς κανόνες SSH εάν εργάζεστε σε απομακρυσμένο διακομιστή .
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
-P INPUT DROP αρνείται όλα τα εισερχόμενα πακέτα (δηλαδή κανείς δεν θα μπορεί να συνδεθεί με τους διακομιστές που τρέχουν όπως Apache, SQL κ.λπ.).
-P FORWARD DROP αρνείται όλα τα προωθημένα πακέτα (δηλαδή όταν χρησιμοποιείτε το σύστημά σας ως δρομολογητή).
-P OUTPUT ACCEPTεπιτρέπει όλα τα εξερχόμενα πακέτα (δηλαδή όταν εκτελείτε ένα HTTPαίτημα).
Να επιτρέπεται όλη η κίνηση στη διεπαφή loopback ( συνιστάται ).
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
3. Κάντε τους κανόνες επίμονους
Αποθηκεύστε τους τρέχοντες iptablesκανόνες.
sudo netfilter-persistent save
sudo netfilter-persistent reload
Εάν εκτελείτε μέσα σε ένα κοντέινερ, η netfilter-persistentεντολή πιθανότατα δεν θα λειτουργήσει, επομένως πρέπει να διαμορφώσετε ξανά το iptables-persistentπακέτο.
sudo dpkg-reconfigure iptables-persistent
4. Επιτρέψτε τις εξερχόμενες συνδέσεις
Να επιτρέπονται τα ερωτήματα DNS.
sudo iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
Χρησιμοποιήστε τη stateμονάδα για να επιτρέψετε RELATEDκαι ESTABLISHEDεξερχόμενα πακέτα.
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Επιτρέψτε τις επιθυμητές θύρες. σε αυτήν την περίπτωση, HTTPλιμάνια.
sudo iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
Περισσότερες θύρες μπορεί να θέλετε να χρησιμοποιήσετε.
FTP: tcp στη θύρα 21
HTTPS: tcp στη θύρα 443
DHCP: udp στη θύρα 67
NTP: udp στη θύρα 123
Σημείωση: Εάν θέλετε να επιτρέψετε apt-get, ίσως χρειαστεί να επιτρέψετε FTPκαιHTTPS .
Να επιτρέπεται η επιστρεφόμενη κίνηση μόνο για RELATEDκαι ήδη ESTABLISHEDσυνδέσεις ( συνιστάται γιατί μερικές φορές απαιτείται αμφίδρομη επικοινωνία).
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Άλλοι χρήσιμοι κανόνες
Επιτρέψτε αιτήματα ping από το εξωτερικό.
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
Προώθηση της κυκλοφορίας στη eth0θύρα 2200σε 10.0.3.21:22(χρήσιμο εάν θέλετε να εκθέσετε έναν διακομιστή SSH που εκτελείται μέσα σε ένα κοντέινερ).
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2200 -j DNAT --to-destination 10.0.3.21:22
Εάν συνδεθείτε με επιτυχία στον διακομιστή σας χρησιμοποιώντας SSH, θα δημιουργηθεί μια μόνιμη σύνδεση (δηλαδή δεν υπάρχουν νέες συνδέσεις ακόμα κι αν είστε συνδεδεμένοι για περισσότερο από 1 ώρα). Εάν αποτύχετε και προσπαθήσετε να συνδεθείτε ξανά, θα δημιουργηθεί μια νέα σύνδεση. Αυτό θα μπλοκάρει τις συνεχείς προσπάθειες σύνδεσης SSH περιορίζοντας τις νέες συνδέσεις ανά ώρα.
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 3600 --hitcount 4 -j DROP
Ανακατευθύνετε όλα τα αιτήματα από θύρα 443σε θύρα 4430(χρήσιμο εάν θέλετε να συνδεθείτε σε θύρα 443χωρίς root).
sudo iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -j REDIRECT --to-port 4430
sudo iptables -A INPUT -p tcp -m tcp --dport 4430 -m geoip --src-cc PE -j ACCEPT
ens3 τη διεπαφή δικτύου.
-m geoip μονάδα μπλοκ χώρας (δείτε βήμα 5).
Προειδοποίηση: Μην χρησιμοποιείτε lo, το λειτουργικό σύστημα θα απορρίψει όλα τα πακέτα που ανακατευθύνονται στη διεπαφή επαναφοράς .
5. Επιτρέψτε ή αποκλείστε ολόκληρες χώρες
5.1 Εγκατάσταση xtables-addons
Μπορείτε να εγκαταστήσετε τη xtables-addonsμονάδα χρησιμοποιώντας διάφορες μεθόδους, μη διστάσετε να χρησιμοποιήσετε τη μέθοδο εγκατάστασης που λειτουργεί καλύτερα για εσάς.
Εγκαταστήστε χρησιμοποιώντας apt-get.
sudo apt-get install xtables-addons-common
Εγκαταστήστε χρησιμοποιώντας module-assistant.
sudo apt-get install module-assistant xtables-addons-source
sudo module-assistant --verbose --text-mode auto-install xtables-addons
Εγκατάσταση από την πηγή.
sudo apt-get install git bc libncurses5-dev libtext-csv-xs-perl autoconf automake libtool xutils-dev iptables-dev
git clone git://git.code.sf.net/p/xtables-addons/xtables-addons
cd xtables-addons
./autogen.sh
./configure
make
sudo make install
Δημιουργήστε μια βάση δεδομένων "χώρες".
sudo apt-get install libtext-csv-xs-perl unzip
sudo mkdir /usr/share/xt_geoip
sudo /usr/lib/xtables-addons/xt_geoip_dl
sudo /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
sudo rm GeoIPCountryCSV.zip GeoIPCountryWhois.csv GeoIPv6.csv
Επανεκκινήστε το σύστημά σας.
sudo reboot
Αφού xtables-addonsεγκατασταθεί επιτυχώς, μετά την πρώτη επανεκκίνηση, εκτελέστε depmodδιαφορετικά ο αποκλεισμός χώρας δεν θα λειτουργήσει σωστά (αυτό απαιτείται μόνο για την πρώτη φορά).
sudo depmod
Δημιουργήστε ένα σενάριο στο /etc/cron.monthly/geoip-updaterγια να ενημερώνετε τη geoipβάση δεδομένων κάθε μήνα.
#!/usr/bin/env bash
# this script is intended to run with sudo privileges
echo 'Removing old database---------------------------------------------------'
rm -rf /usr/share/xt_geoip/*
mkdir -p /usr/share/xt_geoip
echo 'Downloading country databases-------------------------------------------'
mkdir /tmp/geoip-updater
cd /tmp/geoip-updater
/usr/lib/xtables-addons/xt_geoip_dl
echo 'Building geoip database-------------------------------------------------'
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
echo 'Removing temporary files------------------------------------------------'
cd /tmp
rm -rf /tmp/geoip-updater
Κάντε /etc/cron.monthly/geoip-updaterεκτελέσιμο.
sudo chmod +x /etc/cron.monthly/geoip-updater
5.2 Παραδείγματα κανόνων
_Σημείωση: Εάν λαμβάνετε ένα iptables: No chain/target/match by that nameσφάλμα κατά την προσπάθεια εφαρμογής ενός geoipκανόνα, είναι πιθανό να xtables-addonsμην έχει εγκατασταθεί σωστά. Δοκιμάστε άλλη μέθοδο εγκατάστασης.
Αποκλεισμός όλων των εισερχόμενων πακέτων από Κίνα, Χονγκ Κονγκ, Ρωσία και Κορέα.
sudo iptables -A INPUT -m geoip --src-cc CN,HK,RU,KR -j DROP
Επιτρέψτε τα εισερχόμενα πακέτα στη θύρα 80από παντού εκτός από τις παραπάνω χώρες.
sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Να επιτρέπονται τα εισερχόμενα πακέτα στη ens3διεπαφή στη θύρα 22μόνο από το Περού (μη διστάσετε να επιλέξετε τον κωδικό χώρας από την οποία θέλετε να δεχτείτε πακέτα, για παράδειγμα, USγια τις Ηνωμένες Πολιτείες).
sudo iptables -A INPUT -i ens3 -p tcp -m tcp --dport 22 -m geoip --src-cc PE -j ACCEPT
Επιτρέπονται τα εισερχόμενα πακέτα στη θύρα 443μόνο από το Περού.
sudo iptables -A INPUT -p tcp -m tcp --dport 443 -m geoip --src-cc PE -j ACCEPT