#!/bin/sh
# firegate.sh : Rulesset netfilter pour routeur filtrant
# Par lithium
# Version : 2.1
### Declalaration des variables ###
IPT="iptables"
DMZ="192.168.1.1"
IFppp="ppp0"
IFlan="eth0"
### Declaration des fonctions ###
# Parametres du noyau
function KernelConf ()
{
# Je ne veux pas de spoofing
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done
# Protection contre l'echo en broadcast
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Protection contre les mauvais messages d'erreur
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# pas de icmp (ping)
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Protection contre le syn-flood
$IPT -A FORWARD --protocol TCP --syn -m limit --limit 1/s -j ACCEPT
# Protection contre le test de port furtif
$IPT -A FORWARD --protocol TCP --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
# Protection contre le ping de la mort
$IPT -A FORWARD --protocol icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# Permettre le forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
}
# Purge des reglers etablies
function FlushTables ()
{
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
}
# Tout ouvrir
function AcceptAll ()
{
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A INPUT -i $IFlan -j ACCEPT
$IPT -A OUTPUT -o $IFlan -j ACCEPT
}
# Tout fermer
function DropAll ()
{
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
$IPT -t nat -P PREROUTING DROP
$IPT -t nat -P POSTROUTING DROP
$IPT -t nat -P OUTPUT DROP
$IPT -A INPUT -i lo -j DROP
$IPT -A OUTPUT -o lo -j DROP
$IPT -A INPUT -i $IFlan -j DROP
$IPT -A OUTPUT -o $IFlan -j DROP
}
# Regles par defaut
function DefaultPolicy ()
{
# Bloquer tout le trafic
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
# Ouvrir les transctions NAT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
# Ouvrir l'interface locale
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# Et le reseau local
$IPT -A INPUT -i $IFlan -j ACCEPT
$IPT -A OUTPUT -o $IFlan -j ACCEPT
# La gateway peut acceder au net
$IPT -A OUTPUT -o $IFppp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -i $IFppp -m state --state ESTABLISHED,RELATED -j ACCEPT
# Toute les machines du reseau aussi
$IPT -t nat -A POSTROUTING -o $IFppp -j MASQUERADE
$IPT -A FORWARD -i $IFlan -o $IFppp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IFppp -o $IFlan -m state --state ESTABLISHED,RELATED -j ACCEPT
# Autoriser l'accés au serveur http de la DMZ depuis l'exterieur
$IPT -t nat -A PREROUTING -i $IFppp -p tcp --dport 80 -j DNAT --to-destination $DMZ:80
$IPT -A FORWARD -i $IFppp -o $IFlan -p tcp --destination-port 80 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A FORWARD -o $IFppp -i $IFlan -p tcp --source-port 80 -m state --state ESTABLISHED -j ACCEPT
}
### Programme ###
case $1 in
start)
KernelConf
FlushTables
DefaultPolicy
;;
stop)
KernelConf
FlushTables
AcceptAll
;;
lock)
KernelConf
FlushTables
DropAll
;;
*)
echo "Utilisation : ./firegate.sh start | stop | lock"
;;
esac |