#!/bin/sh

### --- Explications
#
# Par défaut cette configuration s'applique à toutes les interfaces réseau.
# Si vous souhaitez restreindre cela à une interface donnée, dé-commentez la ligne #IFACE="eth0"
# (dans la section variables)
#
# Par défaut, le script autorise tout en sortie. Pour changer ce comportement veuillez indiquer quels sont les ports
# autorisés en sortie dans les 2 variables suivantes (Tout sera bloqué sauf les ports inscrits)
# $REMOTE_TCP_SERVICES
# et/ou $REMOTE_UDP_SERVICES
#
# - Pour configurer une machine qui fasse office de routeur, changez la valeur de la
# variable ISROUTERNAT à true, ET configurez les interfaces ethx et ethy selon votre configuration.
# => ethx correspond à l'interface du LAN (reliée à votre Intranet)
# => ethy correspond à l'interface WAN (reliée à Internet ou à la truc-box)
#

### --- VARIABLES
#
. /lib/lsb/init-functions
IPTABLES=/sbin/iptables
#
# Services que le système offrira au réseau, à séparer avec des espaces
# Par défaut RIEN n'est autorisé à part le Ping.
TCP_SERVICES=""
UDP_SERVICES=""
# Services que le système utilisera du réseau
# (défaut : autorise TOUT en sortie si aucun port n'est précisé)
REMOTE_TCP_SERVICES=""
REMOTE_UDP_SERVICES=""
# Pour une machine faisant office de routeur avec NAT, changez la valeur de la variable ISROUTERNAT à "true".
ISROUTERNAT=false
# ethx correspond à l'interface du LAN
# ethy correspond à l'interface reliée à la truc-box (à compléter seulement si vous activez la fonction routeur)
ethx="eth1"
ethy="eth0"
# Ajustez le nom de l'interface pour restreindre le trafic entrant à cette interface particulière.
# Par exemple : IFACE="eth0"
IFACE="eth1"

#######

if [ -n "${IFACE}" ] ; then
 IFACE="-i ${IFACE}"
fi

 $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 "\nPare-feu - Remise à zéro"

 echo "Parefeu - Suppression des règles"

# Interdictions : on commence par appliquer la politique DROP pour les trois chaînes
 $IPTABLES -t filter -P INPUT DROP
 $IPTABLES -t filter -P FORWARD DROP
 $IPTABLES -t filter -P OUTPUT DROP
 echo "Pare-feu - interdictions générales établies"

# Loopback
 $IPTABLES -t filter -A INPUT -i lo -j ACCEPT  # on accepte tout le trafic entrant de l'interface de loopback (lo)

# Modprob : on charge les modules modprobe pour statefull
 modprobe ip_conntrack
 modprobe ip_conntrack_ftp

# Trafic d'entrée :
#$IPTABLES -t filter -A INPUT ${IFACE} -m state --state ESTABLISHED,RELATED -j ACCEPT  # on accepte en entrée sur la chaîne INPUT (table filter, interface d'entrée) toutes les connexions établies (SYN)
 $IPTABLES -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT  # de même pour le chaîne FORWARD (toutes interfaces), notre machine faisant office de routeur

# Pings (ICMP)
 $IPTABLES -A INPUT ${IFACE} -p icmp -j ACCEPT  # on accepte en entrée sur la chaîne INPUT (interface d'entrée) tous les paquets ICMP
 $IPTABLES -A FORWARD -p icmp -j ACCEPT  # de même sur la chaîne FORWARD (toutes interfaces)

# Sortie autorisée
 $IPTABLES -t filter -A OUTPUT -j ACCEPT  # on accepte tout en sortie, sur la chaîne OUTPUT (table filter)

# Services à autoriser en entrée / routage
 for PORT in $TCP_SERVICES; do  # pour chaque port TCP spécifié en début de script :
#  $IPTABLES -A INPUT ${IFACE} -p tcp --dport ${PORT} -j ACCEPT  # on autorise le trafic entrant sur la chaîne INPUT (interface d'entrée)
  $IPTABLES -A FORWARD -p tcp --dport ${PORT} -j ACCEPT  # de même sur la chaîne FORWARD (toutes interfaces)
 done
 for PORT in $UDP_SERVICES; do  # de même pour chaque port UDP spécifié en début de script
#  $IPTABLES -A INPUT ${IFACE} -p udp --dport ${PORT} -j ACCEPT
  $IPTABLES -A FORWARD -p udp -j ACCEPT
 done
 echo "Pare-feu - Mise en place des règles"

# NAT
 if $ISROUTERNAT ; then
  $IPTABLES -A INPUT -i $ethx -j ACCEPT
  $IPTABLES -A FORWARD -i $ethy -o $ethx -m state --state RELATED,ESTABLISHED -j ACCEPT
  $IPTABLES -A FORWARD -i $ethx -o $ethy -j ACCEPT
  $IPTABLES -t nat -A POSTROUTING -o $ethy -j MASQUERADE
  echo "Pare-feu - Routeur avec NAT : [OK]"
 fi



# Affiche les règles IPTABLES 
 $IPTABLES -L --line-numbers

exit 0
