#!/bin/bash
#
# Init file for parefeu
#
# chkconfig: 2345 90 10
# description: Firewall et NAT (Network Address Translation)
#
# processname: parefeu
# pidfile: /var/run/parefeu.pid
#
### BEGIN INIT INFO
# Provides: parefeu
# Required-Start: network iptable
# Required-Stop: network 
# Default-Start: 3 4 5
# Short-Description: Firewall + NAT
# Description: Protection d'un réseau local raccordé à Internet
### END INIT INFO

LOGFILE="/var/log/parefeu.log"

# FireWall fait par Régis Couraud le 30_09_2003
# Modifié par Pierre Jarillon. Utilisable en tant que service par Mandriva.

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network
echo " ">$LOGFILE
date>>$LOGFILE
echo "appel">>$LOGFILE

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

#############################################
##############    VARIABLES   ###############
#############################################
#INT_EXT="ppp0"
INT_EXT="eth2"
INT_LAN="eth1"
INT_LO="lo"
IP_LAN="192.168.33.254/24"
# mode de rejet : DROP = Rejeter simple, LOG_DROP = mettre dans /var/log/syslog
REJET=DROP
#REJET=LOG_DROP

echo "init $1">>$LOGFILE

case "$1" in
#===========================Supprimer le Firewall===================================
  stop) 
#Je vide toutes les ancienne regles

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT


# On remet les polices par défaut pour la table NAT

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

# Je flush les règles existantes

iptables -F
iptables -t nat -F

# J'efface toutes chaînes qui ne sont pas à defaut dans la table filter et nat

iptables -X
iptables -t nat -X

# Et j'en remet une couche avec un autre script de flush ;-)

# Activation du forwarding

echo 1 > /proc/sys/net/ipv4/ip_forward

# Ces régles sont la pour pouvoir loguer si je le veux

iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix '[IPTABLES DROP] : '
iptables -A LOG_DROP -j DROP

# Ces régles sont la pour pouvoir loguer si je le veux

iptables -N LOG_ACCEPT
iptables -A LOG_ACCEPT -j LOG --log-prefix '[IPTABLES ACCEPT] : '
iptables -A LOG_ACCEPT -j ACCEPT

echo "Le parefeu est inactif"
rm -f /var/lock/subsys/parefeu

echo "fin stop">>$LOGFILE
;;
#=========================Activation des protections================================
start)
# On remet tout à zéro
$0 stop

echo "debut start">>$LOGFILE

# Je veux pas de spoofing

if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]
then
  for filtre in /proc/sys/net/ipv4/conf/*/rp_filter
  do
    echo 1 > $filtre
  done
fi


# Je veux pas icmp

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 


# Protection contre l'echo en broadcast

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts


# Protection contre les mauvais messages d'erreur

echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses


# Protection contre l'acceptation des messages ICMP redirigés

for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done


# Protection contre le syn-flood

iptables -A FORWARD -p TCP --syn -m limit --limit 1/s -j ACCEPT


# Protection contre le test de port furtif

iptables -A FORWARD -p TCP --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT


# Protection contre le ping de la mort

iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT


#############################################
#############################################

# Je charge les modules dont j'ai besoin

modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp

# Je refuse tout par défault

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP


##############################################################
##############    MACHINE LOCAL   ############################
##############################################################

# Pour éviter les problèmes, on va tout accepter sur
# la machine en local (interface lo).

iptables -A INPUT  -i $INT_LO -p ALL -j ACCEPT
iptables -A OUTPUT -o $INT_LO -p ALL -j ACCEPT

# J'autorise tous en sortie
# iptables -A INPUT  -i $INT_EXT -p ALL -j ACCEPT
# iptables -A OUTPUT -o $INT_EXT -p ALL -j ACCEPT

iptables -A INPUT -i $INT_EXT --protocol ALL -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o $INT_EXT --protocol ALL -m state --state NEW,ESTABLISHED -j ACCEPT


##############################################################
#################           LAN        #######################
##############################################################
# On veut que le LAN connecté à l'interface
# $INT_LAN ait un accès complet à internet.

iptables -A FORWARD -i $INT_LAN -o $INT_EXT -j ACCEPT
iptables -A FORWARD -o $INT_LAN -i $INT_EXT -j ACCEPT

iptables -A INPUT -i $INT_LAN -p ALL -j ACCEPT
iptables -A OUTPUT -o $INT_LAN -p ALL -j ACCEPT

##############################################################
##############    ENTREE VENANT DU WEB    ####################
##############################################################

# SSH AUTORISER
iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p tcp --sport 22 -j ACCEPT

# HTTP AUTORISER
iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT

# HTTPS AUTORISER
iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p tcp --sport 443 -j ACCEPT

# Cameras de surveillance
#iptables -t nat -A PREROUTING -d $IP_EXT -p tcp --dport 2001 -j DNAT --to $CAMERA1:80
#iptables -A FORWARD -o eth1 -p tcp -d $CAMERA1 -j ACCEPT
iptables -t nat -A PREROUTING -d 82.232.64.171 -p tcp --dport 2002 -j DNAT --to 192.168.33.175:80
iptables -A FORWARD -o eth1 -p tcp -d 192.168.33.175 -j ACCEPT

iptables -t nat -A PREROUTING -d 82.232.64.171 -p tcp --dport 2003 -j DNAT --to 192.168.33.53:80
iptables -A FORWARD -o eth1 -p tcp -d 192.168.33.53 -j ACCEPT


## J'autorise le ftp

##iptables -A INPUT -p tcp -i $INT_EXT -m state --state NEW,ESTABLISHED --dport 21 -j ACCEPT
#iptables -A OUTPUT -p tcp -o $INT_LAN -m state --state NEW,ESTABLISHED --sport 21 -j ACCEPT

##iptables -A INPUT -p tcp -i $INT_EXT -m state --state NEW,ESTABLISHED --dport 20 -j ACCEPT
#iptables -A OUTPUT -p tcp -o $INT_LAN -m state --state NEW,ESTABLISHED --sport 20 -j ACCEPT

##iptables -A INPUT -p tcp -i $INT_EXT -m state --state ESTABLISHED,RELATED --dport 10000:65535 -j ACCEPT
##iptables -A OUTPUT -p tcp -o $INT_EXT -m state --state ESTABLISHED,RELATED --sport 10000:65535 -j ACCEPT

# Bittorrent
iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p tcp --dport 6881:6889 -j ACCEPT
iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p tcp --sport 6881:6889 -j ACCEPT

# Télévision
#iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p tcp --dport 554 -j ACCEPT
#iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p tcp --sport 554 -j ACCEPT
#iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p udp --dport 554 -j ACCEPT
#iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p udp --sport 554 -j ACCEPT

# Ekiga
#iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p udp --dport 5060 -j ACCEPT
#iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p udp --sport 5060 -j ACCEPT

##############################################################

# Il faut permettre à l'ensemble du LAN de dialoguer
# sur internet avec la même adresse IP

iptables -t nat -A POSTROUTING -s $IP_LAN -j MASQUERADE

# Toutes les régles n'ayant pas passé les régles du firewall sont loguées

iptables -A FORWARD -j $REJET
iptables -A INPUT -j $REJET
iptables -A OUTPUT -j $REJET 

# Pour mon alter ego ;-))
echo "Le parefeu et le NAT sont actifs"
touch /var/lock/subsys/parefeu
echo "fin start">>$LOGFILE
;;
#===================================================================================
restart)
	$0 start
;;
#===================================================================================
status)
	if [ `iptables -t nat -L | grep MASQUERADE | wc -l` -eq 1 ]
	then
		echo "Le parefeu et le NAT sont actifs"

	else
		echo "Parefeu et NAT inactifs"
		[ -f /var/lock/subsys/parefeu ] && rm -f /var/lock/subsys/parefeu
		exit 1
	fi
;;
#===================================================================================
  *)
        gprintf "Usage: %s\n" "$(basename $0) {start|stop|status}\
  	Verification : Utiliser nmap et iptables -L"
        exit 1
esac

echo "sortie normale">>$LOGFILE
exit 0
