Tutoriel Iptables

Tutoriel Iptables

Netfilter, iptables ??

Voir Netfilter

La méthode Debian (avec un peu de sel)

Dans pas mal d’autres distributions, il y a une fichier /etc/init.d/iptables qui est chargé automatiquement. Il n’y a pas de fichier de ce style dans Debian (au moins dans Etch, Lenny et Squeeze). La méthode Debian (voir ici) est de charger les règles du firewall dès que le réseau est démarré (donc l’ordinateur est toujours protégé).

Donc comment faire :

  • Se connecter en root
  • Créer un fichier nommé firewall.sh qui va contenir les règles iptables (plus de détail après).
  • Valider que ce fichier est exécutable :
chmod +x firewall.sh
  • Exécuter firewall.sh et vérifier si tout fonctionne encore normalement (ssh, samba, torrent, www, …)
./firewall.sh
  • Tout fonctionne correctement, donc enregistrons les règles dans un fichier (pour moi dans /etc) :
iptables-save > /etc/firewall.conf
  • Créer une script pour lancer les règles :
echo "#!/bin/sh" > /etc/network/if-up.d/iptables 
echo "iptables-restore < /etc/firewall.conf" >> /etc/network/if-up.d/iptables 
chmod +x /etc/network/if-up.d/iptables 

Mise à jour des règles du firewall

Pour les mettre à jour il faut :

  • Éditer firewall.sh pour faire les changements voulus.
  • L’exécuter et vérifier que tout marche comme escompté.
  • Lancer :
iptables-save > /etc/firewall.conf
  • Fini ;)

Un script simple expliqué

Attention

Ce script est peut être très mauvais, et peut exposer votre ordinateur.

Script complet

Il peut être téléchargé ici.

Explications détaillées

Mon ordinateur a une seule carte réseau et est derrière un routeur. C’est un simple poste de travail.

#!/bin/sh

iptables -F
iptables -X
  • iptables -F : vide toutes les commandes iptables.
  • iptables -X : supprime toutes les commandes iptables.
# Default rules
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

iptables -P défini le fonctionnement par défaut.

iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -i lo -j ACCEPT
iptables -A FORWARD -o lo -j ACCEPT

Je ne suis pas certain que cela serve mais cela ne doit pas faire de mal. Chaque process peut communiquer via lo.

#Samba access but only in the LAN
iptables -A INPUT -s 192.168.0.0/24 -p udp -m udp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/24 -p udp -m udp --dport 138 -j ACCEPT
iptables -A INPUT  -m state --state NEW -m tcp -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT
iptables -A INPUT  -m state --state NEW -m tcp -p tcp -s 192.168.0.0/24 --dport 445 -j ACCEPT

Ca devient intéressant. Même si je suis derrière un routeur sans transfert de port (donc sans possibilité d’accéder à ma machine), je peux limiter l’acces aux partages samba à mon LAN (192.168.0.0/24).

# We accept incoming connections on the torrent port
iptables -A INPUT -p tcp --dport 34567 -m state --state NEW -j ACCEPT

Ouverture de port pour le torrent (ici le 34567).

# SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

Pour le ssh c’est presque comme le torrent. MAis pour se protéger des méchants hackeurs en herbe, j’ai mis une limite de 4 connexions par minute (60 secondes). Chaque fois que quelqu’un essaye d’ouvrir une cinquième connexion il est banni pour une minute supplémentaire. Il existe d’autres solution pour vous prémunir d’attaques ssh (et avoir un /var/log/auth.log propre) :

  • Utiliser fail2ban
  • Ne pas utiliser le port 22 comme port externe
  • désactiver la connexion par mot de passe (utilisez des clés)
# Ping
iptables -A INPUT -p icmp -m limit --limit 30/minute -j ACCEPT
iptables -A INPUT -p icmp -j DROP

Comme pour le ssh, on limite à 30 ping par minute.

# PPTP VPN
iptables -A INPUT -j ACCEPT -p tcp --sport 1723
iptables -A INPUT -j ACCEPT -p gre

J’utilise pptpclient pour me connecter à un VPN PPTP Windows. Dans ce cas il faut ouvrir un port TCP et autoriser un nouveau protocole (gre).

# rtsp only on LAN
iptables -A INPUT -s 192.168.0.0/24 -m tcp -p tcp --dport 554 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/24 -m udp -p udp --dport 554 -j ACCEPT

# upnp A/V only on LAN
iptables -A INPUT -s 192.168.0.0/24 -m tcp -p tcp --dport 49200 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/24 -m udp -p udp --dport 49200 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/24 -m udp -p udp --dport 1900 -j ACCEPT

# FTP only on LAN
iptables -A INPUT  -m state --state NEW -m tcp -p tcp -s 192.168.0.0/24 --dport 21 -j ACCEPT
iptables -A INPUT  -m state --state NEW -m tcp -p tcp -s 192.168.0.0/24 --dport 20 -j ACCEPT

Toujours le même principe, il faut juste connaitre les port à ouvrir. Pour le serveur FTP, avec mes règles seul le mode actif sera possible (le mode passif est possible mais la configuration est un peu plus complexe).

# We allow TCP and UDP connections already established to enter
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT

Ici on autorise toutes les connexions démarrées.

echo "Use iptables-save to update /etc/firewall.conf"

Un petit rappel.