Re,
Voici donc la dernière mouture. Merci à ceux qui voudront bien tester.
[code]#!/bin/sh
BEGIN INIT INFO
Provides: parefeu
Required-Start: $local_fs
Should-Start:
Required-Stop: $local_fs
Should-Stop:
X-Start-Before: $network
X-Stop-After: $network
Default-Start: S
Default-Stop: 0 6
Short-description: Configuration du pare-feu
Description: Met en place les règles iptables (IPv4 uniquement)
END INIT INFO
— 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
readonly 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=“eth0”
Activation des logs (mettre à “true” pour activer)
LOGGING=false
NE RIEN MODIFIER APRES CETTE LIGNE (à moins de savoir ce que vous faite)
if [ -n “${IFACE}” ] ; then
IFACE="-i ${IFACE}"
fi
Récupération de la version du noyau et test si >= à 2.6.36
version=$(uname -r| cut -f1 -d"-")
major=awk -v str=$version 'BEGIN {split(str, tk, "."); print tk[1]}'
minor=awk -v str=$version 'BEGIN {split(str, tk, "."); print tk[2]}'
revis=awk -v str=$version 'BEGIN {split(str, tk, "."); print tk[3]}'
if [ $major -gt 2 ] ; then k2636=1
elif [ $major -lt 2 ] ; then k2636=0
elif [ $minor -gt 6 ] ; then k2636=1
elif [ $minor -lt 6 ] ; then k2636=0
elif [ $revis -ge 36 ] ; then k2636=1
else k2636=0
fi
— FONCTIONS
fw_start () {
Vidage
fw_clear
Parefeu - Suppression des règles
Interdictions
$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
Trafic d’entrée :
$IPTABLES -t filter -A INPUT ${IFACE} -m state --state ESTABLISHED,RELATED -j ACCEPT
Limitation de la taille et de la fréquence des pings acceptés
$IPTABLES -A INPUT ${IFACE} -p icmp --icmp-type echo-request -m limit --limit 10/second -m length --length 8:2000 -j ACCEPT
Sortie autorisée, si aucun port autorisé en sortie n’est défini
if [ -z “$REMOTE_TCP_SERVICES”] && [ -z “$REMOTE_UDP_SERVICES” ]; then
$IPTABLES -t filter -A OUTPUT -j ACCEPT
else
$IPTABLES -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Services à autoriser en sortie
for PORT in $REMOTE_TCP_SERVICES; do
$IPTABLES -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT
done
for PORT in $REMOTE_UDP_SERVICES; do
$IPTABLES -A OUTPUT -p udp --dport ${PORT} -j ACCEPT
done
fi
Services à autoriser en entrée
for PORT in $TCP_SERVICES; do
$IPTABLES -A INPUT ${IFACE} -p tcp --dport ${PORT} -j ACCEPT
done
for PORT in $UDP_SERVICES; do
$IPTABLES -A INPUT ${IFACE} -p udp --dport ${PORT} -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
Toutes les autres connexions sont enregistrées dans syslog (si activé)
if $LOGGING ; then
$IPTABLES -t filter -A INPUT -j LOG --log-level=4
echo "Pare-feu - Activation des logs : [OK]"
fi
}
fw_save () {
iptables-save > /etc/firewall
echo “\nPare-feu - Sauvegardé dans /etc/firewall”
}
fw_clear () {
$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
if [ $k2636 -eq 1 ] ; then
$IPTABLES -t nat -P INPUT ACCEPT
fi
$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
$IPTABLES -F
echo “\nPare-feu - Remise à zéro”
}
fw_status () {
$IPTABLES -L --line-numbers
}
-----------------------------------------------------------------------------
case “$1” in
start|restart)
log_daemon_msg "Starting firewall…"
fw_start
log_end_msg $?
;;
save)
log_daemon_msg "Saving firewall…"
fw_save
log_end_msg $?
;;
stop)
log_daemon_msg "Clearing firewall rules…"
fw_clear
log_end_msg $?
;;
status)
log_daemon_msg "Firewall status"
fw_status
;;
*)
log_action_msg "Usage $0 {start|save|restart|stop|status}"
exit 1
;;
esac
exit 0[/code]