[Edit] : une grossière erreur empêchait ce script de fonctionner (INPUT bloqué même pour les connexions déjà établies, et OUTPUT trop peu permissif).

Je vous ait expliqué dans mon post précédent comment installer un serveur web sécurisé sous Debian. Voici maintenant comment le sécuriser un minimum : un script de firewall. Il n'a absolument rien de transcendant : il permet juste de fermer tous les ports, sauf les ports HTTP (80) et SSH (22), plus une mention spéciale pour le NTP.

Vérifiez tout d'abord qu'iptables est bien installé : apt-get install iptables.

Voici le script /etc/firewall.sh commenté pas-à-pas :

#!/bin/sh

Indique avec quel programme le script doit être interprété.

# Règles par défaut
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

On rejette par défaut ce qui arrive (INPUT) et ce qui ne fait que traverser (FORWARD), mais on accepte ce qui sort (OUTPUT).

# On accepte les connexions boucle locale (sur lo)
iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -i lo -j ACCEPT
iptables -A FORWARD -o lo -j ACCEPT

Cela permet des tests sur les adresses localhost (127.0.0.1 et ::1).

# On accepte les connexions depuis le LAN
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT

On accepte tout sur le LAN (les machines du réseau local, qui sont sûres dans mon cas).

# On accepte les connexions HTTP et SSH dans les deux sens
iptables -A INPUT -i eth0 -p tcp --sport www -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport ssh -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

On veut pouvoir se connecter à notre serveur web de l'extérieur, et naviguer depuis notre serveur (en fait, certains scripts en ont besoin) ! On autorise donc les connexions entrantes nouvelles (NEW), déjà établies (ESTABLISHED) ou en relation (RELATED). Comme HTTP possède un port bien défini (80), il est présent dans la liste des ports de /etc/services : on peut donc l'indiquer comme --sport (port source) ou -dport (port de destination) en indiquant son nom dans le fichier /etc/services : www.

Il en va de même pour SSH. SSH est aussi présent dans /etc/services.

# On autorise le ping
iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 2/s -j ACCEPT

On autorise enfin le ping, mais avec modération : pas plus de 2 pings par seconde (-- limit 2/s).

# On autorise les connexions TCP et UDP déjà établies à entrer
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT

Et on n'oublie pas qu'une connexion est dans les deux sens !

Voilà donc un script de lancement de firewall ! On peut également créer un script d'init pour notre firewall :

#!/bin/sh

stop() {
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
}

case $1 in
"start")
/etc/firewall.sh
;;
"stop")
stop
;;
"restart")
stop
/etc/firewall.sh
;;
esac

La fonction stop() arrête le firewall en flushant (vidant) les règles d'INPUT, OUTPUT et FORWARD. On redéfinit les stratégies par défaut à ACCEPT (on accepte tout). L'instruction case permet ensuite de savoir si l'utilisateur veut qu'on lance (start), arrête (stop) ou redémarre (restart) le firewall. Dans le premier cas, on appelle notre script de lancement de firewall que l'on a précédemment créé. Dans le second, on appelle la fonction stop(), et dans le troisième, on combine les deux et dans le bon ordre ! $1 désigne le premier argument passé au script, on lance donc notre firewall en tapant /etc/init.d/firewall start... Vous en déduisez comment on l'arrête ou le redémarre. N'oubliez pas d'ajouter ce script à ceux qui démarrent au lancement de la machine : update-rc.d firewall defaults.

Et voilà ! Pour plus d'informations sur les iptables, outil décidément très puissant, consultez l'article de Léa Linux "Mur de feu pas-à-pas" ou "iptables par l'exemple", beaucoup plus complet.