#!/bin/sh
# 
# /etc/rc.d/rc.firewall

IPT=$(which iptables)
MOD=$(which modprobe)

# Internet
IFACE_INET=eth0

# Réseau local
IFACE_LAN=eth1
IFACE_LAN_IP=192.168.2.0/24

function start {

  # Bloquer les connexions entrantes
  $IPT -P INPUT DROP

	# Accepter les connexions routées
	$IPT -P FORWARD ACCEPT

	# Accepter les connexions sortantes
	$IPT -P OUTPUT ACCEPT

	# Pas de filtrage sur la boucle locale.
  $IPT -A INPUT -i lo -j ACCEPT

  # Accepter les messages ICMP nécessaires pour le 'ping'
  $IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
  $IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
  $IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT

	# Accepter les paquets entrants relatifs à des connexions déjà établies. 
	$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

	# FTP local
	# $MOD ip_conntrack_ftp
	# $IPT -A INPUT -p tcp -i $IFACE_LAN --dport 21 -j ACCEPT

	# SSH local
	$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 22 -j ACCEPT

	# SSH en provenance de l'extérieur, une tentative de connexion par minute
	# $IPT -A INPUT -p tcp -i $IFACE_INET --dport 22 -m state --state NEW \
	# 				-m recent --set --name SSH
	# $IPT -A INPUT -p tcp -i $IFACE_INET --dport 22 -m state --state NEW \
  #					-m recent --update --seconds 60 --hitcount 2 --rttl --name SSH -j DROP
	# $IPT -A INPUT -p tcp -i $IFACE_INET --dport 22 -j ACCEPT

	# DNS local
	# $IPT -A INPUT -p tcp -i $IFACE_LAN --dport 53 -j ACCEPT
	# $IPT -A INPUT -p udp -i $IFACE_LAN --dport 53 -j ACCEPT

	# DHCP
	# $IPT -A INPUT -p udp -i $IFACE_LAN --dport 67 -j ACCEPT

	# HTTP local
	# $IPT -A INPUT -p tcp -i $IFACE_LAN --dport 80 -j ACCEPT

	# NTP local
	# $IPT -A INPUT -p udp -i $IFACE_LAN --dport 123 -j ACCEPT

  # Samba 
  # $IPT -A INPUT -p udp -i $IFACE_LAN --dport 137:138 -j ACCEPT
  # $IPT -A INPUT -p tcp -i $IFACE_LAN --dport 139 -j ACCEPT
  # $IPT -A INPUT -p tcp -i $IFACE_LAN --dport 445 -j ACCEPT

	# CUPS
	# $IPT -A INPUT -p tcp -i $IFACE_LAN --dport 631 -j ACCEPT
	# $IPT -A INPUT -p udp -i $IFACE_LAN --dport 631 -j ACCEPT

	# NFS
	# $IPT -A INPUT -p tcp -i $IFACE_LAN --dport 111 -j ACCEPT
	# $IPT -A INPUT -p udp -i $IFACE_LAN --dport 111 -j ACCEPT
	# $IPT -A INPUT -p tcp -i $IFACE_LAN --dport 2049 -j ACCEPT
	# $IPT -A INPUT -p udp -i $IFACE_LAN --dport 2049 -j ACCEPT
	# $IPT -A INPUT -p tcp -i $IFACE_LAN --dport 32765:32769 -j ACCEPT
	# $IPT -A INPUT -p udp -i $IFACE_LAN --dport 32765:32769 -j ACCEPT

	# NIS
	# $IPT -A INPUT -p tcp -i $IFACE_LAN --dport 834 -j ACCEPT
	# $IPT -A INPUT -p udp -i $IFACE_LAN --dport 834 -j ACCEPT

  # Squid 
  # $IPT -A INPUT -p tcp -i $IFACE_LAN --dport 3128 -j ACCEPT
  # $IPT -A INPUT -p udp -i $IFACE_LAN --dport 3128 -j ACCEPT

  # Rediriger toutes les requêtes HTTP - sauf celles vers le serveur lui-même -
  # vers le port 3128 pour obtenir un proxy transparent
  # $IPT -A PREROUTING -t nat -i $IFACE_LAN -p tcp ! -d 192.168.2.1 \
  # 			        --dport 80 -j REDIRECT --to-port 3128

	# MPD local
	# $IPT -A INPUT -p tcp -i $IFACE_LAN --dport 8000 -j ACCEPT

	# Enregistrer la trace des paquets rejetés
	$IPT -A INPUT -j LOG --log-prefix "+++ IPv4 packet rejected +++"
	$IPT -A INPUT -j REJECT

  # Activer le relais des paquets
  $IPT -t nat -A POSTROUTING -o $IFACE_INET -s $IFACE_LAN_IP -j MASQUERADE

}

function stop {

  # Accepter tous les paquets
  $IPT -P INPUT ACCEPT
  $IPT -P FORWARD ACCEPT
  $IPT -P OUTPUT ACCEPT
  $IPT -t nat -P PREROUTING ACCEPT
  $IPT -t nat -P INPUT ACCEPT
  $IPT -t nat -P OUTPUT ACCEPT
  $IPT -t nat -P POSTROUTING ACCEPT
  $IPT -t mangle -P PREROUTING ACCEPT
  $IPT -t mangle -P INPUT ACCEPT
  $IPT -t mangle -P FORWARD ACCEPT
  $IPT -t mangle -P OUTPUT ACCEPT
  $IPT -t mangle -P POSTROUTING ACCEPT

  # Remettre les compteurs à zéro
  $IPT -t filter -Z
  $IPT -t nat -Z
  $IPT -t mangle -Z

  # Supprimer toutes les règles ainsi que les chaînes personnalisées
  $IPT -t filter -F
  $IPT -t filter -X
  $IPT -t nat -F
  $IPT -t nat -X
  $IPT -t mangle -F
  $IPT -t mangle -X

}

function status {
  echo
  echo "=== Filter table ==="
  echo
  $IPT -L -v -n
  echo
  echo "==== NAT table ===="
  echo
  $IPT -t nat -L -v -n
  echo
}

case $1 in
  start)
    echo "Starting firewall."
    start
  ;;
  stop)
    echo "Stopping firewall."
    stop
  ;;
  restart)
    echo "Stopping firewall."
    stop
    echo "Starting firewall."
    start
  ;;
  status)
    status
  ;;
  *)
  echo "Usage: $0 {start|stop|restart|status}"
  ;;
esac

