Sans vergogne je me suis inspiré de deux sources puisées sur ce site ("iptables par l'exemple" et "Mur Pare-feu pas à pas") pour écrire le script suivant pour mon firewall.
Pouvez-vous me dire quelles erreurs, quels manques, quelles redondances il y aurait ?
#!/bin/sh
# d’abord quelques variables dépendantes du contexte
# l'emplacement d'iptables :
IPTABLES=/sbin/iptables
# nom de l'interface réseau vers internet :
EXTERNAL_IF="eth1"
# nom de l'interface réseau vers le réseau local :
INTERNAL_IF="eth0"
# le réseau local
RESEAU_LOCAL="192.1.1.0/12"
# on commence par l’arrêt du coupe-feu
echo "Arrêt du coupe-feu"
echo "On vide toutes les règles."
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -t nat -F POSTROUTING
$IPTABLES -F LOG_DROP
$IPTABLES -X
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
# on relance le coupe-feu
echo "Relance du coupe-feu"
# Pour fixer les politiques par défaut (c.a.d: ce qui se passe quand aucune
# règle ne s’applique), ici, on refuse tout , (hop hop hop on circule mais ailleurs !)
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
# On trace ce qu’on jette
$IPTABLES -N LOG_DROP
$IPTABLES -A LOG_DROP -j LOG --log-prefix '[IPTABLES DROP] : '
$IPTABLES -A LOG_DROP -j DROP
$IPTABLES -A FORWARD -j LOG_DROP
$IPTABLES -A INPUT -j LOG_DROP
$IPTABLES -A OUTPUT -j LOG_DROP
# On accepte tout ce qui se passe sur l'interface lo
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
# Pour accepter tout ce qui se passe sur le réseau local :
$IPTABLES -A INPUT -s $RESEAU_LOCAL -j ACCEPT
$IPTABLES -A OUTPUT -d $RESEAU_LOCAL -j ACCEPT
$IPTABLES -A FORWARD -s $RESEAU_LOCAL -j ACCEPT
# Pour accepter les résolutions de nom (ie: le dns) :
$IPTABLES -A INPUT -i $EXTERNAL_IF --protocol udp --source-port 53 -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF --protocol udp --destination-port 53 -j ACCEPT
$IPTABLES -A INPUT -i $EXTERNAL_IF --protocol tcp --source-port 53 -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF --protocol tcp --destination-port 53 -j ACCEPT
# Pour accepter le trafic web (on veut surfer!) :
$IPTABLES -A INPUT -i $EXTERNAL_IF --protocol tcp --source-port 80,443 -m state --state ESTABLISHED -j LOG_ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF --protocol tcp --destination-port 80,443 -m state --state NEW,ESTABLISHED -j LOG_ACCEPT
# on accepte aussi que l’extérieur établisse une nouvelle connexion https sur le firewall (pour webmin)
$IPTABLES -A INPUT -i $EXTERNAL_IF --protocol tcp --source-port 443 -m state --state NEW-j LOG_ACCEPT
# ici on traite pop smtp à initiative locale
$IPTABLES -A INPUT -i $EXTERNAL_IF --protocol tcp --source-port 25,110 -m state --state ESTABLISHED -j LOG_ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF --protocol tcp --destination-port 25,110 -m state --state NEW,ESTABLISHED -j LOG_ACCEPT
# on autorise le ping
$IPTABLES -A OUTPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
# en le limitant
$IPTABLES -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state NEW -m limit --limit 5/min -j ACCEPT
# pour autoriser le partage de connexion au niveau du noyau
echo 1 > /proc/sys/net/ipv4/ip_forward
# on cache les autres machines du réseau local derrière le mur pare feu :
$IPTABLES -A POSTROUTING -t nat -o $EXTERNAL_IF -j MASQUERADE
Voilà voila...
D'avance merci pour la correction de ma copie.
--------------------------------------------------------------------------------
Le monde est tellement con, on dirait que c'est moi qui fait tout !
Poste le Thursday 26 January 2006 12:29:46