Il peut parfois sembler difficile à un débutant de configurer lui-même son firewall à l'aide d' iptables. En réalité, si l'on dispose d'un exemple de script bien commenté, cela devient assez aisé de personnaliser son firewall.
#!/bin/bash
KIKOX=192.168.0.10 # La Passerelle
LINDOWS=192.168.0.20 # PC du réseau sous LinuX
WINDOWS=192.168.0.30 # PC du réseau sous Windows
AZGAARD=192.168.0.10/24
FIREWALL=$KIKOX
WEB=$KIKOX # mettre "" si aucun serveur web
PORT=80 # le port du serveur web
FTP=$KIKOX
FTPPORT=21
DONKEY=$KIKOX
INTERNE="eth0" # : interface vers le réseau éthernet à protéger
EXTERNE="ppp0" # : interface vers internet (ADSL)
IPTABLES=/sbin/iptables
mode=$1
case "$mode" in
'start')
echo "SmileBoB Firewall: "
# on efface toutes les règles existantes
for table in filter nat mangle;
do
$IPTABLES -t $table -F
$IPTABLES -t $table -X
done
# avant tout, on accepte tout ce qui vient du réseau interne
$IPTABLES -A INPUT -s $AZGAARD -j ACCEPT
# on accepte toute les reponses associées au trafic sortant
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
# on accepte les recherches DNS à partir des serveurs de nom connus (/etc/resolv.conf)
for DNS in $(grep ^n /etc/resolv.conf | awk '{print $2}');
do
$IPTABLES -t filter -A INPUT -s $DNS -j ACCEPT
done
# on accepte les demandes de connexion ssh
$IPTABLES -A INPUT -p tcp --destination-port ssh -j ACCEPT
# si un serveur web est défini, on s'occupe de lui :)
if [ -n "$WEB" ]
then
echo ""
echo "Section WEB :"
# on accepte les requêtes HTTP entrantes
$IPTABLES -t filter -A INPUT -p tcp --source-port www -j ACCEPT
$IPTABLES -t filter -A INPUT -p tcp --destination-port www -j ACCEPT
echo " Port WWW $PORT ouvert : [OK]"
if [ $FIREWALL != $WEB ] # si le serveur web n'est pas sur la passerelle
then
# on pense a activer le port forwarding du firewall vers notre serveur web
$IPTABLES -t nat -A PREROUTING -p tcp -d $FIREWALL --dport http -j DNAT --to $WEB:$PORT
echo " Forwarding WWW sur $WEB port $PORT: [OK]"
fi
fi
if [ -n "$FTP" ]
then
echo ""
echo "Section FTP :"
#on accepte les requete ftp entrantes
$IPTABLES -t filter -A INPUT -p tcp --source-port ftp -j ACCEPT
$IPTABLES -t filter -A INPUT -p tcp --destination-port ftp -j ACCEPT
echo " Port FTP $FTPPORT ouvert : [OK]"
echo "interface web ouverte"
if [ $FIREWALL != $FTP ] #si le serveur n'est pas sur la passerelle
then
# on forward
$IPTABLES -t nat -A PREROUTING -p tcp -d $FIREWALL --dport ftp -j DNAT --to $FTP:$FTPPORT
echo " Forwarding FTP sur $FTP port $FTPPORT : [OK]"
fi
fi
if [ -n "$DONKEY" ]
then
echo ""
echo "Section Emule :"
#on accept sur les port entrants par défault d'eMULE
$IPTABLES -A INPUT -p tcp --dport 4662 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 34037 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 34038 -j ACCEPT
echo " Emule ouverture du port entrant 4662 : [OK]"
$IPTABLES -A INPUT -p udp --dport 4672 -j ACCEPT
echo " Emule ouverture du port entrant 4672 : [OK]"
# on accepte les sorties pour emule
$IPTABLES -A INPUT -p tcp --sport 4662 -j ACCEPT
echo " Emule ouverture du port sortant 4662 : [OK]"
$IPTABLES -A INPUT -p udp --sport 4672 -j ACCEPT
echo " Emule ouverture du port sortant 4672 : [OK]"
if [ $FIREWALL != $DONKEY ]
then
# Redirection car emule n'est pas sur la passerelle
$IPTABLES -t nat -I PREROUTING -p tcp -s ! $AZGAARD --dport 4662 -j DNAT --to $WINDOWS
echo " Forwarding du port 4662 : [OK]"
echo " Forwarding du port 4672 : [OK]"
$IPTABLES -t nat -I PREROUTING -p udp -s ! $AZGAARD --dport 4672 -j DNAT --to $WINDOWS
fi
fi
# on refuse et on entre dans le journal tout ce qui est entrant et qui n'est pas sur loopback
$IPTABLES -N logdeny
$IPTABLES -t filter -A logdeny -j LOG --log-prefix "Pfirewall : "
$IPTABLES -t filter -A logdeny -j DROP
$IPTABLES -t filter -A INPUT -i ! lo -m state --state NEW,INVALID -j logdeny
# on active la conversion d'adresse réseau (IP forwarding)
if [ -n "$INTERNE" ]
then
echo 1 > /proc/sys/net/ipv4/ip_forward
# on accepte les paquets entre internet et le réseau interne si :
# - connexion existente
# inititation d'une nouvelle conexion par un membre du réseau interne
$IPTABLES -A FORWARD -i $EXTERNE -o $INTERNE -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $INTERNE -o $EXTERNE -j ACCEPT
if [ $EXTERNE = ppp0 ]
then
# on convertit toute adresse IP sortante en l'IP externe du firewall (dynamique ici)
$IPTABLES -t nat -A POSTROUTING -s $AZGAARD -o $EXTERNE -j MASQUERADE
else
# on convertit toute adresse IP sortante en l'IP externe du firewall (fixe ici)
$IPTABLES -t nat -A POSTROUTING -o $EXTERNE -j SNAT --to $FIREWALL
fi
fi
echo "[ OK ]"
;;
'stop')
echo 0 > /proc/sys/net/ipv4/ip_forward
# on efface toutes les règles existantes
for table in filter nat mangle; do
$IPTABLES -t $table -F
$IPTABLES -t $table -X
done
;;
*)
echo "usage $0 start|stop"
;;
esac
Vous pouvez, si vous le désirez, le copier dans /etc/init.d puis créer un lien pour lancer le script automatiquement au démarrage.