#!/bin/sh
# script /etc/firewall.sh
# Firewall 1 du TP reseau heterogene
# Reseau Internet / DMZ / routeur
# Dominique Chambelant
# dchambelant@free.fr
# Definition des elements du reseau
# Interface connectee au reseau ALPHA
ALPHAINF=eth1
# Interface connectee au reseau BETA
BETAINF=eth2
# Interface connectee au reseau ADM
ADMINF=eth3
# Interface connectee au reseau Intermediaire
INTINF=eth0
# Adresse IP du routeur connectee au reseau internet
PAREFEU=192.168.20.250
# Adresse IP du reseau LAN
ip_LAN=192.168.20.0
netmask_LAN=255.255.255.0
# Adresse IP du reseau ALPHA
ip_ALPHA=192.168.40.0
netmask_ALPHA=255.255.255.0
# Adresse IP du reseau BETA
ip_BETA=192.168.50.0
netmask_BETA=255.255.255.0
# Adresse IP du reseau ADM
ip_ADM=192.168.30.0
netmask_ADM=255.255.255.0
# Adresse IP du reseau DMZ
ip_BETA=192.168.10.0
netmask_DMZ=255.255.255.0
WEBSVR=192.168.10.2
FTPSVR1=192.168.10.2
FTPSVR2=192.168.10.3
# Adresse IP publique des serveurs
# Ces adresses sont affectes à l'interface WAN du firewall
ipw_WEBSERV=192.168.0.250
# boucle locale
LOOP=127.0.0.1
# -------------- Ne rien modifier au-dela de cette ligne ---------------------
# ------------------------------------------------------------------------
start() {
echo "Demarrage du firewall..."
# IP forwarding et Routage
# Activation du transfert de paquet dans le noyau
echo 1 > /proc/sys/net/ipv4/ip_forward
# Routes statiques
route add -net 192.168.10.0 netmask 255.255.255.0 gw 192.168.20.250
route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.20.250
route add default gw 192.168.20.250
# Activation de l'anti-spoofing
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]
then
echo -n "Activation de la protection contre l'IP spoofing..."
for filtre in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo 1 > $filtre
done
echo "Activation terminee"
else
echo "Probleme lors de l'activation de la protection IP spoofing, faites attention."
echo "CONTROL-D pour quitter le shell et continuer le lancement du systÚme"
echo
# Demarrage d'un shell root
/sbin/sulogin $CONSOLE
fi
# On va utiliser iptables. Si on l'a compile en module
# dans le kernel, il faut charger le module ip_tables
modprobe ip_tables
# on va charger les modules supplementaires pour
# gerer la translation d'adresse, l'IRC et le FTP
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe iptable_filter
modprobe iptable_nat
# On va vider toutes les rÚgles, avant d'appliquer les nouvelles rÚgles de firewall
iptables -F
iptables -X
# On va rajouter 2 nouvelles chaînes.
# Ceci permettra d'ajouter des nouvelles cibles qui
# auront la possibilite de loguer ce qui se passe.
# On logue et on refuse le paquet,
# on rajoute un prefixe pour pouvoir
# s'y retrouver dans les logs
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix '[Routeur IPTABLES DROP] : '
iptables -A LOG_DROP -j DROP
# ici, on logue et on accepte le paquet,
# on rajoute un prefixe pour pouvoir
# s'y retrouver dans les logs
iptables -N LOG_ACCEPT
iptables -A LOG_ACCEPT -j LOG --log-prefix '[Routeur IPTABLES ACCEPT] : '
iptables -A LOG_ACCEPT -j ACCEPT
# On veut faire un firewall efficace,
# donc la politique a appliquer est de tout refuser par defaut
# et rajouter une a une les rÚgles que l'on autorise.
# l'option -P permet de definir la cible par defaut
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
# Pour eviter les problÚmes, on va tout accepter sur
# la machine en local (interface lo).
# Je deconseille de retirer cette rÚgle car
# ça pose pas mal de problÚmes et ça peut
# faire perdre la main sur la machine
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Bon, la partie initialisation et preparation est
# terminee, passons aux choses serieuses
# Configuration des filtres
echo "Activation des filtres"
# ---
# Redirige le reseau ALPHA vers le proxy
echo "1"
iptables -t nat -A PREROUTING -i $ALPHAINF -p tcp --dport 80 -j DNAT --to-destination $ip_PROXY:3128
echo "http ALPHA/PROXY [OK]"
# ---
# Redirige le reseau BETA vers le proxy
iptables -t nat -A PREROUTING -i $BETAINF -p tcp --dport 80 -j DNAT --to-destination $ip_PROXY:3128
echo "http BETA/PROXY [OK]"
# ---
# redirige le reseau ADM vers le proxy
iptables -t nat -A PREROUTING -i $ADMINF -p tcp --dport 80 -j DNAT --to-destination $ip_PROXY:3128
echo "http ADM/PROXY [OK]"
# ---
# Autorise le SSH
# Transfert entre ALPHA et BETA
iptables -A FORWARD -i $ALPHAINF -o $BETAINF -m state --state ESTABLISHED -p tcp --sport 22 -j ACCEPT
iptables -A FORWARD -o $ALPHAINF -i $BETAINF -m state --state NEW,ESTABLISHED -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -i $ALPHAINF -o $BETAINF -m state --state NEW,ESTABLISHED -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -o $ALPHAINF -i $BETAINF -m state --state ESTABLISHED -p tcp --sport 22 -j ACCEPT
# Transfert entre ALPHA et ADM
iptables -A FORWARD -i $ALPHAINF -o $ADMINF -m state --state NEW,ESTABLISHED -p tcp --sport 22 -j ACCEPT
iptables -A FORWARD -o $ALPHAINF -i $ADMINF -m state --state NEW,ESTABLISHED -p tcp --dport 22 -j ACCEPT
# Transfert entre BETA et ADM
iptables -A FORWARD -i $BETAINF -o $ADMINF -m state --state ESTABLISHED -p tcp --sport 22 -j ACCEPT
iptables -A FORWARD -o $BETAINF -i $ADMINF -m state --state NEW,ESTABLISHED -p tcp --dport 22 -j ACCEPT
# Transfert entre ADM et INT
iptables -A FORWARD -i $ADMINF -o $INTINF -m state --state NEW,ESTABLISHED -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -o $ADMINF -i $INTINF -m state --state ESTABLISHED -p tcp --sport 22 -j ACCEPT
echo "SSH [ OK ]"
# ---
# Autorise le SSH
# Transfert entre ALPHA et BETA
iptables -A FORWARD -i $ALPHAINF -o $BETAINF -m state --state ESTABLISHED -p tcp --sport 3389 -j ACCEPT
iptables -A FORWARD -o $ALPHAINF -i $BETAINF -m state --state NEW,ESTABLISHED -p tcp --dport 3389 -j ACCEPT
iptables -A FORWARD -i $ALPHAINF -o $BETAINF -m state --state NEW,ESTABLISHED -p tcp --dport 3389 -j ACCEPT
iptables -A FORWARD -o $ALPHAINF -i $BETAINF -m state --state ESTABLISHED -p tcp --sport 3389 -j ACCEPT
# Transfert entre ALPHA et ADM
iptables -A FORWARD -i $ALPHAINF -o $ADMINF -m state --state NEW,ESTABLISHED -p tcp --sport 3389 -j ACCEPT
iptables -A FORWARD -o $ALPHAINF -i $ADMINF -m state --state NEW,ESTABLISHED -p tcp --dport 3389 -j ACCEPT
# Transfert entre BETA et ADM
iptables -A FORWARD -i $BETAINF -o $ADMINF -m state --state ESTABLISHED -p tcp --sport 3389 -j ACCEPT
iptables -A FORWARD -o $BETAINF -i $ADMINF -m state --state NEW,ESTABLISHED -p tcp --dport 3389 -j ACCEPT
# Transfert entre ADM et INT
iptables -A FORWARD -i $ADMINF -o $INTINF -m state --state NEW,ESTABLISHED -p tcp --dport 3389 -j ACCEPT
iptables -A FORWARD -o $ADMINF -i $INTINF -m state --state ESTABLISHED -p tcp --sport 3389 -j ACCEPT
echo "Rdesktop [ OK ]"
# ---
# Autorise le DNS entre ALPHA et la internet (dns)
iptables -A FORWARD -i $ALPHAINF -o $INTINF -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -o $ALPHAINF -i $INTINF -p udp --sport 53 -j ACCEPT
echo "DNS ALPHA/DMZ [OK]"
# ---
# Autorise le DNS entre BETA et la internet (dns)
iptables -A FORWARD -i $BETAINF -o $INTINF -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -o $BETAINF -i $INTINF -p udp --sport 53 -j ACCEPT
echo "DNS BETA/DMZ [OK]"
# ---
# Autorise le DNS entre le ADM et la DMZ (smtp)
iptables -A FORWARD -i $ADMINF -o $INTINF -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -o $ADMINF -i $INTINF -p udp --sport 53 -j ACCEPT
echo "DNS ADM/DMZ [OK]"
# ---
# Autorise le SMTP entre ALPHA et la DMZ (smtp)
iptables -A FORWARD -i $ALPHAINF -o $INTINF -m state --state NEW,ESTABLISHED -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -o $ALPHAINF -i $INTINF -m state --state ESTABLISHED -p tcp --sport 25 -j ACCEPT
echo "SMTP ALPHA/DMZ [OK]"
# ---
# Autorise le SMTP entre BETA et la DMZ (smtp)
iptables -A FORWARD -i $BETAINF -o $INTINF -m state --state NEW,ESTABLISHED -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -o $BETAINF -i $INTINF -m state --state ESTABLISHED -p tcp --sport 25 -j ACCEPT
echo "SMTP BETA/DMZ [OK]"
# ---
# Autorise le SMTP entre le ADM et la DMZ (smtp)
iptables -A FORWARD -i $ADMINF -o $INTINF -m state --state NEW,ESTABLISHED -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -o $ADMINF -i $INTINF -m state --state ESTABLISHED -p tcp --sport 25 -j ACCEPT
echo "SMTP ADM/DMZ [OK]"
# ---
# Autorise le POP3 entre ALPHA et la DMZ (pop3)
iptables -A FORWARD -i $ALPHAINF -o $INTINF -m state --state NEW,ESTABLISHED -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -o $ALPHAINF -i $INTINF -m state --state ESTABLISHED -p tcp --sport 110 -j ACCEPT
echo "POP3 ALPHA/DMZ [OK]"
# ---
# Autorise le POP3 entre BETA et la DMZ (pop3)
iptables -A FORWARD -i $BETAINF -o $INTINF -m state --state NEW,ESTABLISHED -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -o $BETAINF -i $INTINF -m state --state ESTABLISHED -p tcp --sport 110 -j ACCEPT
echo "POP3 BETA/DMZ [OK]"
# ---
# Autorise le POP3 entre ADM et la DMZ (pop3)
iptables -A FORWARD -i $ADMINF -o $INTINF -m state --state NEW,ESTABLISHED -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -o $ADMINF -i $INTINF -m state --state ESTABLISHED -p tcp --sport 110 -j ACCEPT
echo "POP3 ADM/DMZ [OK]"
# ---
# Autorise le LOTUS entre ADM et la DMZ (lotusnotes)
iptables -A FORWARD -i $ADMINF -o $INTINF -m state --state NEW,ESTABLISHED -p tcp --dport 1352 -j ACCEPT
iptables -A FORWARD -o $ADMINF -i $INTINF -m state --state ESTABLISHED -p tcp --sport 1352 -j ACCEPT
echo "LOTUS ADM/DMZ [OK]"
# ---
#
echo "Mauvais paquets [ Rejet ]"
iptables -A INPUT -i $ADMINF -s $LOOP -j DROP
iptables -A FORWARD -i $ADMINF -s $LOOP -j DROP
iptables -A INPUT -i $ADMINF -d $LOOP -j DROP
iptables -A FORWARD -i $ADMINF -d $LOOP -j DROP
iptables -A INPUT -i $ALPHAINF -s $LOOP -j DROP
iptables -A INPUT -i $ALPHAINF -d $LOOP -j DROP
iptables -A INPUT -i $ADMINF -j DROP
iptables -A FORWARD -i $ALPHAINF -d $LOOP -j DROP
#
#
iptables -A FORWARD -i $ADMINF -s 192.168.0.0/16 -j DROP
iptables -A FORWARD -i $ADMINF -s 172.16.0.0/12 -j DROP
iptables -A FORWARD -i $ADMINF -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i $ADMINF -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i $ADMINF -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i $ADMINF -s 10.0.0.0/8 -j DROP
#
# Toutes les rÚgles qui n'ont pas passe les
# rÚgles du firewall seront refusees et loguees...
iptables -A FORWARD -j LOG_DROP
# Fin de la configuration du parefeu
echo " [Termine]"
echo " Le parefeu est pret"
}
stop() {
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t nat -X
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
echo "Firewall desactive!"
}
restart() {
stop
sleep 2
start
}
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
restart
;;
'status')
iptables -L -n -v
iptables -t -n -v nat -L
;;
*)
echo "Usage: /etc/init.d/firewall {start|stop|restart|status}"
esac