Un Firewall avec Iptables
Après avoir sécurisé l’accès SSH de notre serveur il convient maintenant de “l’habiller”. En effet celui ci est actuellement “à poil” sur internet, nous allons donc lui faire revêtir une “armure” en veillant à ce que notre serveur puisse tout de même “respirer” ! Bon ok, l’analogie n’est peut-être pas très bien trouvé mais l’essentiel est là… Nous allons installer un pare-feu sur notre machine Linux à l’aide de l’incontournable Iptables.
Au lieu de repartir de zéro j’ai modifié le script iptables de « Nicolargo » (http://blog.nicolargo.com/ ) et je l’ai adapté à mes besoins. Personnellement je n’utilise aucun contrôle sur le trafic sortant de mon serveur, uniquement sur l’entrant.
Commencez par créer votre script :
nano /etc/init.d/firewall.sh
Copiez coller le script ci-dessous (je vous expliquerais 2-3 choses plus bas :
#!/bin/sh
#
# Simple Firewall configuration.
#
# Author: Nicolargo
# Edit : fmplaw
#
# chkconfig: 2345 9 91
# description: Activates/Deactivates the firewall at boot time
#
### BEGIN INIT INFO
# Provides: firewall.sh
# Required-Start: $syslog $network
# Required-Stop: $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start firewall daemon at boot time
# Description: Custom Firewall script.
### END INIT INFO
PATH=/bin:/sbin:/usr/bin:/usr/sbin
# Services that the system will offer to the network
# SSH = 22
TCP_SERVICES="22"
UDP_SERVICES=""
if ! [ -x /sbin/iptables ]; then
exit 0
fi
##########################
# Start the Firewall rules
##########################
fw_start () {
# Input traffic:
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Services
if [ -n "$TCP_SERVICES" ] ; then
for PORT in $TCP_SERVICES; do
/sbin/iptables -A INPUT -p tcp --dport ${PORT} -j ACCEPT
done
fi
if [ -n "$UDP_SERVICES" ] ; then
for PORT in $UDP_SERVICES; do
/sbin/iptables -A INPUT -p udp --dport ${PORT} -j ACCEPT
done
fi
# Remote testing
/sbin/iptables -A INPUT -p icmp -j ACCEPT
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -P INPUT DROP
/sbin/iptables -A INPUT -j LOG
# Other network protections
# (some will only work with some kernel versions)
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
}
##########################
# Stop the Firewall rules
##########################
fw_stop () {
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT ACCEPT
}
##########################
# Clear the Firewall rules
##########################
fw_clear () {
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
}
##########################
# Test the Firewall rules
##########################
fw_save () {
/sbin/iptables-save > /etc/iptables.backup
}
fw_restore () {
if [ -e /etc/iptables.backup ]; then
/sbin/iptables-restore < /etc/iptables.backup
fi
}
fw_test () {
fw_save
sleep 30 && echo "Restore previous Firewall rules..." && fw_restore &
fw_stop
fw_start
}
case "$1" in
start|restart)
echo -n "Starting firewall.."
fw_stop
fw_start
echo "done."
;;
stop)
echo -n "Stopping firewall.."
fw_stop
echo "done."
;;
clear)
echo -n "Clearing firewall rules.."
fw_clear
echo "done."
;;
test)
echo -n "Test Firewall rules..."
fw_test
echo -n "Previous configuration will be restore in 30 seconds"
;;
*)
echo "Usage: $0 {start|stop|restart|clear|test}"
echo "Be aware that stop drop all incoming/outgoing traffic !!!"
exit 1
;;
esac
exit 0
Ensuite rendez le exécutable :
chmod +x /etc/init.d/firewall.sh
Puis on le lance au démarrage :
update-rc.d firewall.sh defaults
Cela dit il peut-être utile de comprendre comme il fonctionne… Tout d’abord il reconnait les paramètres suivants :
start : permet de lancer le script.
stop : ATTENTION réinitialise les règles iptables et empêche le trafic forward et input.
restart : redémarre le script.
clear : réinitialise les règles iptables et autorise tous les trafics.
test : permet de tester la configuration iptables 30 sec.
save : permet de sauvegarder la conf iptables.
restore : permet la restauration de la conf iptables.
L’intérêt de ce script est qu’il est très facilement éditable. En effet si vous voulez ajouter le service ftp à votre serveur il est impératif d’ouvrir les ports 20 et 21 en TCP. Rien de plus simple, éditez votre script :
nano /etc/init.d/firewall.sh
Puis rajoutez ces ports à la ligne 26 (voir script ci-dessus) de la variable TCP_SERVICES:
# Services that the system will offer to the network
# SSH = 22
TCP_SERVICES="22 20 21"
UDP_SERVICES=""
Sauvegardez ces changements et relancez le services :
/etc/init.d/firewall.sh restart
Et voilà ! Simple, non ?

1 commentaire sur « Un Firewall avec Iptables »
alexis Vernier
Merci Fluffy
EXCELLENT TUTO
Laisser un commentaire
Le formulaire de commentaire revient très bientôt sur le nouveau site.