159 γραμμές
4,7 KiB
Bash
159 γραμμές
4,7 KiB
Bash
#!/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
|