#!/bin/bash
# 2003-06-09 Arnaud Fontaine <arnaud@andesi.org>

## Pare-Feu sur un poste faisant office de passerelle
## et ne proposant aucun service à l'extérieur

# Affiche les commandes du script lors de son lancement
# pour le déboguage
# set -x

# Réglages du chemin et des interfaces nécessaires à iptables
IPT="/sbin/iptables"
ext="eth1"
local0="eth0"
lo="lo"
sgt="192.168.0.2"

# Adresses IP des DNS du FAI Free et CI
dns_ip="80.236.0.73 81.220.255.4 80.236.0.68"

function clean_table ()
{
	# On vide toutes les règles préexistantes
	$IPT -F
	$IPT -X	
	$IPT -t nat -F
	$IPT -t nat -X
	$IPT -t mangle -F
	$IPT -t mangle -X
	# On remet les polices par défaut
	$IPT -P INPUT ACCEPT
	$IPT -P OUTPUT ACCEPT
	$IPT -P FORWARD ACCEPT	
}

function start_fw ()
{
	
        ## Pour loguer tout ce qui a été rejeté
        $IPT -N LOG_DROP
        $IPT -A LOG_DROP -m limit --limit 1/minute --limit-burst 5 -j LOG --log-level 1 --log-prefix '[IPTABLES DROP] : '
        $IPT -A LOG_DROP -j DROP

	## On autorise tout ce qui sort et venant d'une connexion déjà existante
	$IPT -A INPUT -i $ext -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
	$IPT -A OUTPUT -o $ext -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT	
	## Par défaut on droppe tous les paquets
	$IPT -P INPUT DROP
	$IPT -P OUTPUT DROP
	$IPT -P FORWARD ACCEPT
	
	##On autorise tout ce qui est dans le réseau local
	$IPT -A INPUT -i $local0 -j ACCEPT
	$IPT -A OUTPUT -o $local0 -j ACCEPT

	## Les adresses provenant de classes d'adresses réservées
	$IPT -A FORWARD -p tcp --tcp-flags ALL ALL -j DROP
	$IPT -A FORWARD -p tcp --tcp-flags ALL NONE -j DROP
	
	## On autorise le traffic en localhost
	$IPT -A INPUT -i $lo -j ACCEPT
	$IPT -A OUTPUT -o $lo -j ACCEPT

	## On droppe les paquets ICMP timestamp (replies|requests)
	$IPT -I INPUT -p icmp --icmp-type 13 -j DROP
	$IPT -I OUTPUT -p icmp --icmp-type 14 -j DROP
	
	## On autorise le forward via le réseau local
	$IPT -A FORWARD -i $local0 -o $ext -j ACCEPT
	$IPT -A FORWARD -o $local0 -i $ext -j ACCEPT

	## On autorise les requêtes provenant des DNS du FAI
	## Obligatoire pour le resolving
	for i in $dns_ip; do
		$IPT -A INPUT  -i $ext  -p udp --sport 53 -s $i -j ACCEPT 
		$IPT -A OUTPUT -o $ext  -p udp --dport 53 -d $i -j ACCEPT  
	done

	## On autorise différents services référencés dans /etc/services
	$IPT -A OUTPUT -o $ext -p tcp -m multiport --dports ntp,ircd,https,www,pop3,smtp,ssh,gpg,nntp,aim,jabber,finger,ftp,ftp-data -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
	$IPT -A INPUT -i $ext -p tcp -m multiport --sports ntp,ircd,www,pop3,https,ftp,ftp-data,smtp,ssh,gpg,nntp,aim,jabber,finger -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

	# Pour NTP
	$IPT -A OUTPUT -o $ext -p udp --dport ntp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
	$IPT -A INPUT -i $ext -p udp --sport ntp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

	## On autorise le ftp passif et active
	$IPT -A INPUT -i $ext -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
	$IPT -A OUTPUT -o $ext -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

	## Gestion de la BP
	# Et ssh aussi !
	$IPT -A PREROUTING -t mangle -p tcp --sport ssh -j TOS --set-tos Minimize-Delay

	# On active certains pings
	$IPT -A OUTPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
        $IPT -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -m limit --limit 5/min -j ACCEPT
        $IPT -A INPUT -p icmp -m state --state NEW -m limit --limit 5/min -j ACCEPT

	## On active la passerelle ssi les autres règles sont bien passées
	$IPT -t nat -A POSTROUTING -o $ext -j MASQUERADE

	## Pour Bittorrent :)
	$IPT -t nat -I PREROUTING -p tcp --dport 6885:6889 -j DNAT --to-destination $sgt

	## Pour amule
	$IPT -t nat -I PREROUTING -p tcp --dport 4660:4680 -j DNAT --to-destination $sgt
	$IPT -t nat -I PREROUTING -p udp --dport 4660:4680 -j DNAT --to-destination $sgt

	$IPT -A FORWARD -j LOG_DROP
        $IPT -A INPUT -j LOG_DROP
        $IPT -A OUTPUT -j LOG_DROP
}	

function kernel_start ()
{	
	# Quelques options pour le noyau
	echo 1 > /proc/sys/net/ipv4/ip_forward	
	echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
	echo 1 > /proc/sys/net/ipv4/tcp_syncookies
	echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
	echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
	echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
	for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
		echo 1 > $f
	done    
	for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
		echo 0 > $f
	done    
	for f in /proc/sys/net/ipv4/conf/*/send_redirects; do
		echo 0 > $f
	done    
	for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
		echo 0 > $f
	done
	for f in /proc/sys/net/ipv4/conf/*/log_martians; do
		echo 1 > $f
	done			
}

function kernel_stop ()
{	
	# Quelques options pour le noyau
	echo 0 > /proc/sys/net/ipv4/ip_forward	
	echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
	echo 0 > /proc/sys/net/ipv4/tcp_syncookies
	echo 0 > /proc/sys/net/ipv4/conf/all/log_martians
	echo 0 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses                                     
	echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
	for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
		echo 0 > $f
	done    
	for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
		echo 1 > $f
	done    
	for f in /proc/sys/net/ipv4/conf/*/send_redirects; do
		echo 1 > $f
	done    
	for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
		echo 1 > $f
	done
	for f in /proc/sys/net/ipv4/conf/*/log_martians; do
		echo 0 > $f
	done			
}

case $1 in
	start)				
		echo -n "Starting Firewall rules"
		clean_table &&
		start_fw &&
		kernel_start
		echo "."	
	;;
	
	stop)
		echo -n "Cleaning Firewall table"
		clean_table &&
		kernel_stop
		echo "."
	;;
	
	restart)
		echo -n "Restarting Firewall rules"
		clean_table &&
		start_fw &&
		kernel_start
		echo "."
	;;
	
	*)
	echo "Usage: /etc/init.d/iptables.sh {start|stop|restart}"
    exit 1
	;;
esac

