#!/bin/sh
#set -x
test "$IFACE" = "dsl-provider" || exit 0
echo "Lancement du firewall par $IFACE"

#------------------------------
# Variables
#------------------------------
BAD_IFACE=ppp0
DMZ_IFACE=eth1
DMZ_IFACE2=eth2
DMZ_ADDR=192.168.2.0/255.255.255.0
DMZ_ADDR2=192.168.3.0/255.255.255.0
ORDI_FRED=192.168.2.4

#------------------------------
# Purge et declaration
#------------------------------
# Effacement de toutes les regles
iptables -F
iptables -t nat -F
iptables --delete-chain
iptables --table nat --delete-chain

iptables -N debug-and-drop
iptables -A debug-and-drop -j LOG --log-prefix "debug : "
iptables -A debug-and-drop -j DROP

#------------------------------
# icmp-acc
#------------------------------
iptables -N icmp-acc

# on accepte certains type de ping
iptables -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type echo-request -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type echo-reply -j ACCEPT

# On ignore tout le reste
iptables -A icmp-acc -j LOG --log-prefix "Icmp: "
iptables -A icmp-acc -j DROP

#------------------------------
# TCP
#------------------------------
iptables -N tcp-acc

# Chaine pour logguer les paquets avant de les bloquer
iptables -N log-and-drop-tcp
iptables -A log-and-drop-tcp -j LOG --log-prefix "Tcp: "
iptables -A log-and-drop-tcp -j DROP

# On elimine les paquets ayant tous les flags TCP actives ansi que ceux
# avec aucun flag active (souvent utilise par les scans de Nmap)
iptables -A tcp-acc -p tcp --tcp-flags ALL ALL  -j log-and-drop-tcp
iptables -A tcp-acc -p tcp --tcp-flags ALL NONE -j log-and-drop-tcp

# On accepte les paquets appartenants a une connexion deja etablie
iptables -A tcp-acc -m state --state INVALID -j log-and-drop-tcp
iptables -A tcp-acc -m state --state RELATED,ESTABLISHED -j ACCEPT 

# Rq: pour acceder au sites ftp, il faut ajouter les 2 modules suivants.
# Ensuite, les connexions distantes ftp sont geres (RELATED ci dessus)
# - ip_nat_ftp              2752  0 
# - ip_conntrack_ftp       71568  1 ip_nat_ftp

# Rq: retour a l'appelant

#------------------------------
# PREROUTING
# (port forwarding)
#------------------------------
# emule pour avoir un hight id
#iptables -t nat -A PREROUTING -p tcp --dport 4662 -j DNAT --to $ORDI_FRED
#iptables -t nat -A PREROUTING -p udp --dport 4672 -j DNAT --to $ORDI_FRED

# bittorent
iptables -t nat -A PREROUTING -p udp --dport 30163 -j DNAT --to $ORDI_FRED
iptables -t nat -A PREROUTING -p tcp --dport 6881:6889 -j DNAT --to $ORDI_FRED

# mdtx 
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to $ORDI_FRED:22
iptables -t nat -A PREROUTING -p tcp --dport 4443 -j DNAT --to $ORDI_FRED:443
iptables -t nat -A PREROUTING -p tcp --dport 6562 -j DNAT --to $ORDI_FRED:6562

#------------------------------
# INPUT
#------------------------------
iptables -N bad-in
iptables -N dmz-in

# On transmet les pings
iptables -A INPUT -p icmp -j icmp-acc

# On teste les flags tcp
iptables -A INPUT -p tcp -j tcp-acc

# Selon le sens d'arrivee des paquets on transmet a la chaine correspondante
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i $BAD_IFACE -j  bad-in
iptables -A INPUT -i $DMZ_IFACE -j  dmz-in
iptables -A INPUT -i $DMZ_IFACE2 -j dmz-in

# On ignore tout le reste
iptables -A INPUT -j LOG --log-prefix "in: "
iptables -A INPUT -j DROP

#------------------------------
# INPUT: Exterieur vers serveur
# C'est là que l'on voit beaucoup de scans.
#------------------------------
# On accepte les services suivants :
iptables -A bad-in -p udp --dport domain -j ACCEPT
iptables -A bad-in -p udp --sport domain -j ACCEPT
iptables -A bad-in -p udp --sport ntp -j ACCEPT
iptables -A bad-in -p tcp --dport ssh -j ACCEPT
iptables -A bad-in -p tcp --dport www -j ACCEPT
iptables -A bad-in -p tcp --dport https -j ACCEPT
#iptables -A bad-in -p tcp --dport smtp -j ACCEPT
#iptables -A bad-in -p tcp --dport pop3s -j ACCEPT
iptables -A bad-in -p tcp --dport 6561 -j ACCEPT

# On ignore tout le reste (sans le logguer car il y en a trop)
#iptables -A bad-in -j LOG --log-prefix 'bad-in: '
iptables -A bad-in -j DROP

#------------------------------
# INPUT: Intérieur vers serveur
#------------------------------
# Chaine pour logguer les paquets
iptables -N log-dmz-in
iptables -A log-dmz-in -j LOG --log-prefix "dmz-in: (ok)"

# on accepte tout
#iptables -A dmz-in -j log-dmz-in
iptables -A dmz-in -j ACCEPT

#------------------------------
# FORWARD
#------------------------------
iptables -N bad-dmz
iptables -N dmz-bad
iptables -N dmz-dmz

# On transmet les pings
iptables -A FORWARD -p icmp -j icmp-acc

# On teste les flags tcp
iptables -A FORWARD -p tcp -j tcp-acc

# Selon le sens de transit des paquets on transmet a la chaine correspondante
iptables -A FORWARD -i $DMZ_IFACE  -o $BAD_IFACE -j dmz-bad
iptables -A FORWARD -i $DMZ_IFACE2 -o $BAD_IFACE -j dmz-bad
iptables -A FORWARD -i $DMZ_IFACE  -j dmz-dmz
iptables -A FORWARD -i $DMZ_IFACE2 -j dmz-dmz
iptables -A FORWARD -o $DMZ_IFACE  -j bad-dmz
iptables -A FORWARD -o $DMZ_IFACE2 -j bad-dmz

# On ignore tout le reste
iptables -A FORWARD -j LOG --log-prefix "fwd: "
iptables -A FORWARD -j DROP

#------------------------------
# FORWARD: Extérieur vers intérieur 
#------------------------------
# Chaine pour logguer les paquets avant de les bloquer
iptables -N log-and-drop-bad-dmz
iptables -A log-and-drop-bad-dmz -j LOG --log-prefix "bad-dmz: "
iptables -A log-and-drop-bad-dmz -j DROP

# On bloque les paquets provenant des classes d'adresses reservees 
# ainsi que le multicast
iptables -A bad-dmz -s 224.0.0.0/4    -j log-and-drop-bad-dmz
iptables -A bad-dmz -s 192.168.0.0/16 -j log-and-drop-bad-dmz
iptables -A bad-dmz -s 10.0.0.0/8     -j log-and-drop-bad-dmz

# DNS ...
iptables -A bad-dmz -p udp --sport domain -j ACCEPT
iptables -A bad-dmz -p tcp --sport domain -j ACCEPT
iptables -A bad-dmz -p udp --sport ntp -j ACCEPT

# cf PREROUTING !!
iptables -A bad-dmz -p tcp --dport ssh -j ACCEPT
iptables -A bad-dmz -p tcp --dport 6562 -j ACCEPT
#iptables -A bad-dmz -p tcp --dport 4662 -j ACCEPT
#iptables -A bad-dmz -p udp --dport 4672 -j ACCEPT
iptables -A bad-dmz -p udp --dport 30163 -j ACCEPT
iptables -A bad-dmz -p tcp --dport 6881:6889 -j ACCEPT

# On ignore tout le reste
iptables -A bad-dmz -j log-and-drop-bad-dmz

#------------------------------
# FORWARD: Intérieur vers extérieur
#------------------------------
# on accepte tout
iptables -A dmz-bad -j ACCEPT

#------------------------------
# FORWARD: Intérieur vers Intérieur 
#------------------------------
# Chaine pour logguer les paquets 
iptables -N log-dmz-dmz
iptables -A log-dmz-dmz -j LOG --log-prefix "dmz-dmz: (ok)"

# on accepte tout
#iptables -A dmz-dmz -j log-dmz-dmz
iptables -A dmz-dmz -j ACCEPT

#------------------------------
# OUTPUT:
#------------------------------
# On laisse tout sortir du serveur
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -j ACCEPT

#------------------------------
# POSTROUTING:
#------------------------------
# Partage de la connection
iptables -t nat -A POSTROUTING -o $BAD_IFACE -j MASQUERADE

#------------------------------
# Kernel
#------------------------------
# Attention, on active la passerelle qu'une fois toutes les regles
# de filtrage sont operationelles.
echo 1 > /proc/sys/net/ipv4/ip_forward
