#!/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												   
