#!/bin/sh
# script /etc/firewall.sh
# Firewall NAT du TP réseau hétérogène
# Réseau Internet / DMZ / routeur
# Dominique Chambelant
# dchambelant@free.fr
# Definition des élèments du reseau
# Interface connectée au reseau interne
INTINF=eth0
# Interface connectée au reseau DMZ
DMZINF=eth1
# Interface connectée au reseau Internet
EXTINF=eth2
# Adresse IP du routeur connecté au reseau interne
ROUTEUR=192.168.20.1
# Adresse IP du routeur connecté au réseau externe
GATEWAY=192.168.0.3
# Adresse IP du reseau LAN
ip_LAN=192.168.30.0
netmask_LAN=255.255.255.0
# Adresse IP du reseau DMZ
ip_DMZ=192.168.10.0
netmask_DMZ=255.255.255.0
ip_WEBSVR=192.168.10.2
ip_SMTP=192.168.10.2
ip_PROXY=192.168.20.1
ip_DNS1=192.168.0.3
ip_DNS2=192.168.0.3
# Adresse IP publique des serveurs
# Ces adresses sont affectés à l'interface WAN du firewall
ipw_WEBSERV=192.168.0.250
# Interface Internet et boucle locale
# WAN=`/usr/local/sbin/eaglectrl -i` # Utilisé avec un modem Sagem 800
LOOP=127.0.0.1
-------------- Ne rien modifier au-dela de cette ligne ---------------------
------------------------------------------------------------------------
start() {
echo "Démarrage du firewall..."
# Définition de la table de routage
route add -net $ip_LAN netmask $netmask_LAN gw $ROUTEUR dev $INTINF
route add -net $ip_DMZ netmask $netmask_DMZ dev $DMZINF
route add default gw $GATEWAY
# Control du traffic avec l'algorythme Token Bucket Filter
tc qdisc add dev $INTINF root tbf rate 100mbit latency 0.1ms burst 1540
tc qdisc add dev $DMZINF root tbf rate 100mbit latency 0.1ms burst 1540
tc qdisc add dev $DMZINF root tbf rate 100mbit latency 0.1ms burst 1540
# Activation du forwarding dans le noyau
# Obligatoire pour que le noyau transmette les paquets
echo 1 > /proc/sys/net/ipv4/ip_forward
# Activation de l'IP dynamique
# Obligatoire dans le cas d'IP attribué dynamiquement
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
# Activation de l'anti-spoofing
# Alors la, on va travailler avec le routage
# pour empêcher les attaques de type spoofing
# l'activation de la vérification de l'adresse source
# à chaque lancement est une bonne solution.
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 terminée"
else
echo "Probléme 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
# Démarrage d'un shell root pour maintenance
/sbin/sulogin $CONSOLE
fi
# pas de icmp
# le firewall doit rester discret
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# On va utiliser iptables. Si on l'a compilé en module
# dans le kernel, il faut charger le module ip_tables.
modprobe ip_tables
# on va charger les modules supplémentaires pour
# gérer 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 possibilité de loguer ce qui se passe.
# On logue et on refuse le paquet,
# on rajoute un préfixe pour pouvoir
# s'y retrouver dans les logs
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix '[Parefeu IPTABLES DROP] : '
iptables -A LOG_DROP -j DROP
# ici, on logue et on accepte le paquet,
# on rajoute un préfixe pour pouvoir
# s'y retrouver dans les logs
iptables -N LOG_ACCEPT
iptables -A LOG_ACCEPT -j LOG --log-prefix '[Parefeu IPTABLES ACCEPT] : '
iptables -A LOG_ACCEPT -j ACCEPT
# On veut faire un firewall efficace,
# donc la politique a appliquer est de tout refuser par défaut
# et rajouter une a une les règles que l'on autorise.
# l'option -P permet de définir la cible par défaut
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Pour éviter les problèmes, on va tout accepter sur
# la machine en local (interface lo).
# Je déconseille 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 préparation est
# terminée, passons aux choses sérieuses
# Transfer des connexions http entrantes vers le serveur Web public
iptables -t nat -A PREROUTING -d $ipw_WEBSVR -p tcp --dport 80 -j DNAT --to-destination $ip_WEBSVR:80
# Configuration des filtres
# ---
# Autorise la connection au serveur DNS1 et DNS2
# serveur DNS1 LAN / DNS1
iptables -A INPUT -i $INTINF -d $ip_DNS1 -p udp --dport 53 -j LOG_ACCEPT
iptables -A INPUT -i $EXTINF -s $ip_DNS1 -p udp --dport 53 -j LOG_ACCEPT
iptables -A FORWARD -i $INTINF -d $EXTINF -d $ip_DNS1 -p udp --sport 53 -j ACCEPT
iptables -A FORWARD -i $EXTINF -s $ip_DNS1 -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -i $INTINF -s $ip_DNS1 -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -i $EXTINF -d $ip_DNS1 -p udp --sport 53 -j ACCEPT
echo "DNS1 [OK]"
# serveur DNS2
iptables -A INPUT -i $INTINF -d $ip_DNS2 -m state --state NEW,ESTABLISHED -p tcp --dport 53 -j LOG_ACCEPT
iptables -A INPUT -i $EXTINF -s $ip_DNS2 -m state --state ESTABLISHED -p tcp --dport 53 -j LOG_ACCEPT
iptables -A FORWARD -i $INTINF -d $EXTINF -d $ip_DNS2 -m state --state NEW,ESTABLISHED -p tcp --sport 53 -j ACCEPT
iptables -A FORWARD -i $EXTINF -s $ip_DNS2 -m state --state ESTABLISHED -p tcp --sport 53 -j ACCEPT
iptables -A OUTPUT -i $INTINF -s $ip_DNS2 -m state --state ESTABLISHED -p tcp --sport 53 -j ACCEPT
iptables -A OUTPUT -i $EXTINF -d $ip_DNS2 -m state --state NEW,ESTABLISHED -p tcp --sport 53 -j ACCEPT
echo "DNS2 [OK]"
# ---
# Autorise le proxy a se connecter sur le Web (http)
iptables -A INPUT -i $INTINF -s $ip_PROXY -m state --state NEW,ESTABLISHED -p tcp --dport 80 -j LOG_ACCEPT
iptables -A INPUT -i $EXTINF -d $ip_PROXY -m state --state ESTABLISHED -p tcp --dport 80 -j LOG_ACCEPT
iptables -A FORWARD -i $INTINF -d $EXTINF -s $ip_PROXY -m state --state NEW,ESTABLISHED -p tcp --sport 80 -j ACCEPT
iptables -A FORWARD -i $EXTINF -d $ip_PROXY -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -i $INTINF -d $ip_PROXY -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -i $EXTINF -s $ip_PROXY -m state --state NEW,ESTABLISHED -p tcp --sport 80 -j ACCEPT
echo "http PROXY/Internet [OK]"
# ---
# Autorise le proxy a ce connecter sur la DMZ (http)
iptables -A INPUT -i $INTINF -s $ip_PROXY -m state --state NEW,ESTABLISHED -p tcp --dport 80 -j LOG_ACCEPT
iptables -A INPUT -i $DMZINF -d $ip_PROXY -m state --state ESTABLISHED -p tcp --dport 80 -j LOG_ACCEPT
iptables -A FORWARD -i $INTINF -d $DMZINF -s $ip_PROXY -m state --state NEW,ESTABLISHED -p tcp --sport 80 -j ACCEPT
iptables -A FORWARD -i $DMZINF -d $ip_PROXY -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -i $INTINF -d $ip_PROXY -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -i $DMZINF -s $ip_PROXY -m state --state NEW,ESTABLISHED -p tcp --sport 80 -j ACCEPT
echo "http PROXY/DMZ [OK]"
# ---
# Autorise le proxy a se connecter sur les serveurs FTP
# Connexion de Controle
iptables -A INPUT -i $INTINF -s $ip_PROXY -m state --state NEW,ESTABLISHED -p tcp --dport 21 -j LOG_ACCEPT
iptables -A INPUT -i $EXTINF -d $ip_PROXY -m state --state ESTABLISHED -p tcp --dport 21 -j LOG_ACCEPT
iptables -A FORWARD -i $INTINF -d $EXTINF -s $ip_PROXY -m state --state NEW,ESTABLISHED -p tcp --sport 21 -j ACCEPT
iptables -A FORWARD -i $EXTINF -d $ip_PROXY -m state --state ESTABLISHED -p tcp --sport 21 -j ACCEPT
iptables -A OUTPUT -i $INTINF -d $ip_PROXY -m state --state ESTABLISHED -p tcp --sport 21 -j ACCEPT
iptables -A OUTPUT -i $EXTINF -s $ip_PROXY -m state --state NEW,ESTABLISHED -p tcp --sport 21 -j ACCEPT
echo "FTP (21) [OK]"
# Connexion de Données
iptables -A INPUT -i $INTINF -s $ip_PROXY -m state --state NEW,ESTABLISHED -p tcp --dport 20 -j LOG_ACCEPT
iptables -A INPUT -i $EXTINF -d $ip_PROXY -m state --state ESTABLISHED -p tcp --dport 20 -j LOG_ACCEPT
iptables -A FORWARD -i $INTINF -d $EXTINF -s $ip_PROXY -m state --state NEW,ESTABLISHED -p tcp --sport 20 -j ACCEPT
iptables -A FORWARD -i $EXTINF -d $ip_PROXY -m state --state ESTABLISHED -p tcp --sport 20 -j ACCEPT
iptables -A OUTPUT -i $INTINF -d $ip_PROXY -m state --state ESTABLISHED -p tcp --sport 20 -j ACCEPT
iptables -A OUTPUT -i $EXTINF -s $ip_PROXY -m state --state NEW,ESTABLISHED -p tcp --sport 20 -j ACCEPT
echo "FTP (20) [OK]"
# ---
# Autorise le SSH sur l'interface interne, la DMZ,
# le transfert LAN - DMZ et enregistre
# l'établissement de connexion
iptables -A INPUT -i $INTINF -m state --state NEW,ESTABLISHED -p tcp --dport 22 -j LOG_ACCEPT
iptables -A INPUT -i $DMZINF -m state --state ESTABLISHED -p tcp --dport 22 -j LOG_ACCEPT
iptables -A FORWARD -i $INTINF -d $DMZINF -m state --state NEW,ESTABLISHED -p tcp --sport 22 -j ACCEPT
iptables -A FORWARD -d $INTINF -i $DMZINF -m state --state ESTABLISHED -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -i $INTINF -m state --state ESTABLISHED -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -i $DMZINF -m state --state NEW,ESTABLISHED -p tcp --sport 22 -j ACCEPT
echo "SSH [ OK ]"
# ---
# Autorise le SMTP entre le LAN et la DMZ
iptables -A INPUT -i $INTINF -m state --state NEW,ESTABLISHED -p tcp --dport 25 -j LOG_ACCEPT
iptables -A INPUT -i $DMZINF -d $ip_SMTP -m state --state ESTABLISHED -p tcp --dport 25 -j LOG_ACCEPT
iptables -A FORWARD -i $INTINF -d $DMZINF -m state --state NEW,ESTABLISHED -p tcp --sport 25 -j ACCEPT
iptables -A FORWARD -d $INTINF -i $DMZINF -s $ip_SMTP -m state --state ESTABLISHED -p tcp --sport 25 -j ACCEPT
iptables -A OUTPUT -i $INTINF -m state --state ESTABLISHED -p tcp --sport 25 -j ACCEPT
iptables -A OUTPUT -i $DMZINF -s $ip_SMTP -m state --state NEW,ESTABLISHED -p tcp --sport 25 -j ACCEPT
echo "SMTP Lan/DMZ [OK]"
# ---
# Autorise le SMTP entre la DMZ et l'Internet
iptables -A INPUT -i $DMZINF -m state --state NEW,ESTABLISHED -p tcp --dport 25 -j LOG_ACCEPT
iptables -A INPUT -i $EXTINF -d $ip_SMTP -m state --state NEW,ESTABLISHED -p tcp --dport 25 -j LOG_ACCEPT
iptables -A FORWARD -i $DMZINF -d $EXTINF -m state --state NEW,ESTABLISHED -p tcp --sport 25 -j ACCEPT
iptables -A FORWARD -d $EXTINF -i $DMZINF -s $ip_SMTP -m state --state NEW,ESTABLISHED -p tcp --sport 25 -j ACCEPT
iptables -A OUTPUT -i $EXTINF -m state --state NEW,ESTABLISHED -p tcp --sport 25 -j ACCEPT
iptables -A OUTPUT -i $DMZINF -s $ip_SMTP -m state --state NEW,ESTABLISHED -p tcp --sport 25 -j ACCEPT
echo "SMTP DMZ/INTERNET [OK]"
# ---
# Autorise le POP3 en le LAN et la DMZ
iptables -A INPUT -i $INTINF -m state --state NEW,ESTABLISHED -p tcp --dport 110 -j LOG_ACCEPT
iptables -A INPUT -i $DMZINF -d $ip_SMTP -m state --state ESTABLISHED -p tcp --dport 110 -j LOG_ACCEPT
iptables -A FORWARD -i $INTINF -d $DMZINF -m state --state NEW,ESTABLISHED -p tcp --sport 110 -j ACCEPT
iptables -A FORWARD -d $INTINF -i $DMZINF -s $ip_SMTP -m state --state ESTABLISHED -p tcp --sport 110 -j ACCEPT
iptables -A OUTPUT -i $INTINF -m state --state ESTABLISHED -p tcp --sport 110 -j ACCEPT
iptables -A OUTPUT -i $DMZINF -s $ip_SMTP -m state --state NEW,ESTABLISHED -p tcp --sport 110 -j ACCEPT
echo "POP3 Lan/DMZ [OK]"
# ---
# Autorise les connexions entrantes vers la DMZ (http)
iptables -A INPUT -i $DMZINF -m state --state ESTABLISHED -p tcp --dport 80 -j LOG_ACCEPT
iptables -A INPUT -i $EXTINF -d $ip_WEBSVR -m state --state NEW,ESTABLISHED -p tcp --dport 80 -j LOG_ACCEPT
iptables -A FORWARD -i $DMZINF -d $EXTINF -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT
iptables -A FORWARD -d $EXTINF -i $DMZINF -s $ip_WEBSVR -m state --state NEW,ESTABLISHED -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -i $EXTINF -s $ip_WEBSVR -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -i $DMZINF -d $ip_WEBSVR -m state --state NEW,ESTABLISHED -p tcp --sport 80 -j ACCEPT
echo "http DMZ/INTERNET [OK]"
#
echo "Tunnels VPN [ OK ]"
#$IPT -A INPUT -i $WAN -p udp --dport 5000 -j ACCEPT
#
#
#
echo "Mauvais paquets [ Rejet ]"
iptables -A INPUT -i $EXTINF -s $LOOP -j DROP
iptables -A FORWARD -i $EXTINF -s $LOOP -j DROP
iptables -A INPUT -i $EXTINF -d $LOOP -j DROP
iptables -A FORWARD -i $EXTINF -d $LOOP -j DROP
iptables -A INPUT -i $INTINF -s $LOOP -j DROP
iptables -A INPUT -i $INTINF -d $LOOP -j DROP
iptables -A INPUT -i $EXTINF -j DROP
iptables -A FORWARD -i $INTINF -d $LOOP -j DROP
#
#
iptables -A FORWARD -i $EXTINF -s 192.168.0.0/16 -j DROP
iptables -A FORWARD -i $EXTINF -s 172.16.0.0/12 -j DROP
iptables -A FORWARD -i $EXTINF -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i $EXTINF -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i $EXTINF -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i $EXTINF -s 10.0.0.0/8 -j DROP
#
# Maintenant il ne reste plus grand chose à faire !
# Il faut permettre à l'ensemble du LAN de dialoguer sur internet
# avec la même adresse IP sinon, bien évidemment ça ne marchera pas
# Une petite règle de NAT avec un -j MASQUERADE suffira
# (masquerade = dialoguer avec l'adresse IP publique sur firewall)
iptables -t nat -A POSTROUTING -s $ip_LAN -j MASQUERADE
# Il faut également que le serveur web de la DMZ soit masqueradé
# sinon, le serveur dialoguera sur internet avec son IP privée
iptables -t nat -A POSTROUTING -s $ip_DMZ -j MASQUERADE
# Toutes les règles qui n'ont pas passé les
# règles du firewall seront refusées et loguées...
iptables -A FORWARD -j LOG_DROP
iptables -A INPUT -j LOG_DROP
iptables -A OUTPUT -j LOG_DROP
# Fin de la configuration du parefeu
echo " [Termine]"
echo " Le parefeu est prêt"
}
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 désactivé!"
}
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