Overblog Tous les blogs Top blogs Technologie & Science Tous les blogs Technologie & Science
Editer l'article Suivre ce blog Administration + Créer mon blog
MENU

Réseau, système et sécurité informatique

Publicité

Architecture double firewall - Script IPtables du PAREFEU NAT


#!/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
Publicité
Retour à l'accueil
Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article