#!/bin/sh

IPTABLES=/sbin/iptables

# On remet à zéro le pare-feu en supprimant toutes les règles. On peut également exécuter $IPTABLES -X. Cette façon de faire permet de rendre compte de toutes les chaînes et tables.
 $IPTABLES -t filter -F
 $IPTABLES -t nat -F
 $IPTABLES -t mangle -F
 $IPTABLES -t raw -F
 $IPTABLES -t filter -P INPUT ACCEPT
 $IPTABLES -t filter -P OUTPUT ACCEPT
 $IPTABLES -t filter -P FORWARD ACCEPT
 $IPTABLES -t nat -P PREROUTING ACCEPT
 $IPTABLES -t nat -P POSTROUTING ACCEPT
 $IPTABLES -t nat -P OUTPUT ACCEPT
 $IPTABLES -t nat -P INPUT ACCEPT
 $IPTABLES -t mangle -P PREROUTING ACCEPT
 $IPTABLES -t mangle -P OUTPUT ACCEPT
 $IPTABLES -t mangle -P POSTROUTING ACCEPT
 $IPTABLES -t mangle -P FORWARD ACCEPT
 $IPTABLES -t mangle -P INPUT ACCEPT
 $IPTABLES -t raw -P OUTPUT ACCEPT
 $IPTABLES -t raw -P PREROUTING ACCEPT
 echo "Pare-feu - Remise à zéro" ; sleep 1
 echo "Pare-feu - Suppression des règles" ; sleep 1

# Interdictions : on commence par appliquer la politique DROP pour les trois chaînes
 $IPTABLES -t filter -P INPUT DROP
 $IPTABLES -t filter -A INPUT -j LOG --log-level info
 $IPTABLES -t filter -P FORWARD DROP
 $IPTABLES -t filter -A FORWARD -j LOG --log-level info
 $IPTABLES -t filter -P OUTPUT DROP
 $IPTABLES -t filter -A OUTPUT -j LOG --log-level info 
 echo "Pare-feu - Interdictions générales établies" ; sleep 1
 echo "Pare-feu - Activation de la journalisation (log)" ; sleep 1

# Loopback
 $IPTABLES -t filter -A INPUT -i lo -j ACCEPT  # on accepte tout le trafic entrant de l'interface de loopback (lo)
 echo "Pare-feu - Autorisation loopback établie" ; sleep 1

# Modprob : on charge les modules modprobe pour statefull
 modprobe ip_conntrack
 modprobe ip_conntrack_ftp
 echo "Pare-feu - Chargement des modules modprobe" ; sleep 1

# Trafic d'entrée :
 $IPTABLES -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT  # on accepte sur la chaîne FORWARD (toutes interfaces) toutes les connexions établies (SYN), notre machine faisant office de routeur
 $IPTABLES -t filter -A FORWARD -p tcp --tcp-flags ALL SYN,ACK,FIN,RST -m limit --limit 5/second -j ACCEPT
 echo "Pare-feu - Autorisation des connexions établies en entrée (statefull)" ; sleep 1
 echo "Pare-feu - Limitation de la fréquence des flags TCP (SYN flood)" ; sleep 1

# Pings (ICMP)
 $IPTABLES -A INPUT -p icmp -m limit --limit 5/second -j ACCEPT  # on accepte en entrée sur la chaîne INPUT (interface d'entrée) tous les paquets ICMP en y appliquant une fréquence de réception max
 $IPTABLES -A FORWARD -p icmp -j ACCEPT  # on accepte aussi les pings sur la chaîne FORWARD (toutes interfaces)
 echo "Pare-feu - Autorisation des pings (ICMP) établie" ; sleep 1
 echo "Pare-feu - Limitation de la fréquence de réception des pings" ; sleep 1

# Sortie autorisée
 $IPTABLES -t filter -A OUTPUT -j ACCEPT  # on accepte tout en sortie, sur la chaîne OUTPUT (table filter)
 echo "Pare-feu - Autorisations générales en sortie établies" ; sleep 1

# Services à autoriser en entrée
  
  # Autoriser HTTP/HTTPS/SMTP/DNS pour la DMZ
  $IPTABLES -A FORWARD -p tcp -d 192.168.10.0/24 --dport 80 -j ACCEPT
  $IPTABLES -A FORWARD -p tcp -d 192.168.10.0/24 --dport 443 -j ACCEPT
  $IPTABLES -A FORWARD -p tcp -d 192.168.10.0/24 --dport 25 -j ACCEPT
  $IPTABLES -A FORWARD -p tcp -d 192.168.10.0/24 --dport 53 -j ACCEPT
  $IPTABLES -A FORWARD -p udp -d 192.168.10.0/24 --dport 53 -j ACCEPT
  echo "Pare-feu - Autorisations particulières vers la DMZ établies" ; sleep 1

  #On autorise SSH au niveau du routeur pour une machine de l'Intranet
  $IPTABLES -A INPUT -p tcp -s 192.168.11.2 --dport 22 -j ACCEPT
  echo "Pare-feu - Autorisations particulières en entrée depuis l'Intranet établies" ; sleep 1

 echo "Pare-feu - Mise en place des règles terminée [OK]" ; sleep 2


# Affiche les règles IPTABLES
 echo "\n********** Affichage des règles iptables **********"
 $IPTABLES -L --line-numbers

exit 0
