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.

Firewall-sans-rootAu 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 ?

Une réflexion au sujet de « Un Firewall avec Iptables »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.