#!/bin/bash if [ -z $1 ]; then # Δεν έχουμε command line argument, οπότε δεν αφήνουμε κανέναν να συνδεθεί με SSH σε μας. echo Disallowing SSH access... NOSSH=1 else # Έχουμε IP address στη γραμμή εντολών, που θέλουμε να συνδέεται σε μας με SSH. echo Allowing SSH access for $1... fi ############################## #### ΓΕΝΙΚΕΣ ΠΡΟΦΥΛΑΞΕΙΣ ##### ############################## ## Μην απαντάς σε ping. /bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all ## Μην απαντάς σε broadcasts. /bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ## Μη δέχεσαι source routed πακέτα. /bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route ## Μη κάνεις ICMP redirect. /bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects ## Προστασία έναντι περίεργων λαθών. /bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ## Ενεργοποίησε το reverse path filtering. for interface in /proc/sys/net/ipv4/conf/*/rp_filter; do /bin/echo "1" > ${interface} done ## Σημείωσε στα system logs (/var/log/messages by default) τα πακέτα που φαίνεται να έχουν ψεύτικες διεθύνσεις ή γενικώς να είναι ύποπτα. /bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians ## Μην λειτουργείς σαν router (μην προωθείς πακέτα σε άλλες διευθύνσεις). /bin/echo "0" > /proc/sys/net/ipv4/ip_forward ################## #### FIREWALL #### ################## ## Φόρτωσε τα connection-tracking modules. /sbin/modprobe ipt_state /sbin/modprobe ip_conntrack /sbin/modprobe ip_conntrack_ftp #ports=2121 #/sbin/modprobe ipt_owner ## Καθάρισε τυχόν ενεργά rules /sbin/iptables -F ## Διέγραψε τυχόν custom tables /sbin/iptables -X ## Μηδένισε όλους τους μετρητές πακέτων /sbin/iptables -Z ## By default κάνουμε DROP (αγνοούμε) όλα τα πακέτα (ώστε να περνάνε μόνο αυτά που έχουν λόγο να περνάνε) /sbin/iptables -P INPUT DROP /sbin/iptables -P OUTPUT DROP ##################### #### ΕΙΣΕΡΧΟΜΕΝΑ #### ##################### ## Δεχόμαστε όλες τις τοπικές συνδέσεις /sbin/iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT ## Δεχόμαστε πακέτα από όλες τις ήδη υπάρχουσες συνδέσεις (λόγω των υπολοίπων rules, αναγκαστικά τις έχουμε ξεκινήσει εμείς οπότε υποθέτουμε ότι είναι ασφαλείς) /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT if [ $NOSSH ]; then # Καθόμαστε. echo else ## Επέτρεψε συνδέσεις SSH από τη διεύθυνση που παρέχουμε στη γραμμή εντολών /sbin/iptables -A INPUT -p tcp -s $1 --sport 1024: --dport 22 -j ACCEPT fi ###################### ##### ΕΞΕΡΧΟΜΕΝΑ ##### ###################### ## Δεχόμαστε τοπικές συνδέσεις /sbin/iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT ## SSH /sbin/iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT ## HTTP /sbin/iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT ## HTTPS /sbin/iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT ## POP3 /sbin/iptables -A OUTPUT -p tcp --dport 110 -j ACCEPT ## SMTP /sbin/iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT ## DNS /sbin/iptables -A OUTPUT -p udp --dport 53 -j ACCEPT ## FTP (command) /sbin/iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT ## FTP (data::Active) /sbin/iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT ## FTP (data::Passive) /sbin/iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT if [ $NOSSH ]; then echo else ## Επιτρέπουμε στον SSH server μας να απαντήσει. /sbin/iptables -A OUTPUT -p tcp --sport 22 --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT fi ## ICMP /sbin/iptables -A OUTPUT -p icmp -j ACCEPT ## dict.org:2628 /sbin/iptables -A OUTPUT -p tcp -d 66.111.36.30 --dport 2628 -j ACCEPT ## Importing OpenPGP keys από pgp.mit.edu:11371 /sbin/iptables -A OUTPUT -p tcp -d 18.7.14.139 --dport 11371 -j ACCEPT ## JETDIRECT printing /sbin/iptables -A OUTPUT -p tcp --dport 9100 -j ACCEPT ## Whois queries /sbin/iptables -A OUTPUT -p tcp --dport 43 -j ACCEPT ## NTP updates /sbin/iptables -A OUTPUT -p tcp -d 128.2.4.21/16 --dport 123 -j ACCEPT /sbin/iptables -A OUTPUT -p udp --sport 123 -d 128.2.4.21/16 --dport 123 -j ACCEPT ################# #### LOGGING #### ################# ## Αυτά τα μηνύματα καταχωρούνται στο /var/log/messages # Με ένα tail -f /var/log/messages σαν root τα παρακολουθούμε ## Log εισερχόμενα TCP πακέτα που απορρίφθηκαν. /sbin/iptables -A INPUT -p tcp -j LOG --log-prefix "iptables:IN-TCP DROPPED:" ## Log εξερχόμενα TCP πακέτα που απορρίφθηκαν. /sbin/iptables -A OUTPUT -p tcp -j LOG --log-prefix "iptables:OUT-TCP DROPPED:" ## Log οτιδήποτε άλλο που δεν πέρασε #/sbin/iptables -A INPUT -j LOG --log-prefix "iptables:INCOMING DROPPED:" /sbin/iptables -A OUTPUT -j LOG --log-prefix "iptables:OUTGOING DROPPED:" ## Τέλος του iptables script