iptables est une interface permettant de configurer netfilter qui n’est autre que l’outil de gestion du pare-feu (firewall) intégré aux systèmes Linux.

Fonctionnement

iptables fonctionne selon un système de tables, ces tables sont composées de chaînes.
Tout paquet entrant est analysé afin de déterminer notamment sa source et sa destination.
Elle est composée de trois sortes de chaîne :

Permet d’analyser les paquets entrants. Si le paquet est adressé au poste, il est confronté au filtre INPUT.

Permet d’analyser et d’autoriser les trames à passer d’une interface à une autre, seulement dans le cadre d’une interface réseau servant de passerelle.

Permet d’analyser les paquets sortants. Si le paquet sort du poste, il passera par la chaîne OUTPUT.

À cette table, peuvent être affectées des politiques (policy) : DROP, LOG, ACCEPT et REJECT.


Exécution des règles

Il existe plusieurs méthodes pour activer vos règles de firewall ou le rendre actif même après un reboot : la création manuelle des règles, l’écriture dans un fichier executable, le stockage dans un fichier appelé par un script, …

Voici les 2 méthodes les plus courantes pour les activer et les conserver après reboot:

1ère méthode

Créez votre fichier de script (vous trouverez un exemple de script iptables entier dans le paragraphe suivant) puis faites en un exécutable de démarrage :

sudo vim /etc/init.d/MonFirewall
sudo chmod +x /etc/init.d/MonFirewall
sudo update-rc.d MonFirewall default

2ème méthode

Exécutez les commandes iptables directement depuis le prompt puis rendez-les “persistantes” (toujours actives après reboot) :

sudo apt-get install iptables-persistent
sudo service iptables-persistent

Il prend les arguments save pour sauvegarder les règles, flush pour vider toutes les règles et reload pour les recharger depuis les fichiers précités.


Exemple de script autonome

Voici un exemple de script à rendre exécutable et à charger au démarrage :

more /etc/init.d/MonFirewall

#!/bin/bash
echo Setting firewall rules...
#
# config de base
#

# Vider les tables actuelles
iptables -t filter -F
iptables -t filter -X
echo - Vidage : [OK]

# Autoriser SSH
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
echo - Autoriser SSH : [OK]

# Ne pas casser les connexions établies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
echo - Ne pas casser les connexions établies : [OK]

# Interdire toute connexion entrante
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
echo - Interdire toute connexion entrante : [OK]

# Interdire toute connexion sortante
iptables -t filter -P OUTPUT DROP
echo - Interdire toute connexion sortante : [OK]

# Autoriser les requetes DNS, FTP, HTTP, NTP etc. SORTANTES
iptables -t filter -A OUTPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo - Autoriser les requêtes DNS, FTP, HTTP, NTP : [OK]

# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo - Autoriser loopback : [OK]

# Autoriser ping
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo - Autoriser ping : [OK]

# Gestion des connexions ENTRANTES autorisées
#
# iptables -t filter -A INPUT -p  --dport -j ACCEPT

# Autoriser HTTP, HTTPS
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
echo - Autoriser serveur Apache : [OK]

# Autoriser FTP
modprobe ip_conntrack
modprobe ip_conntrack_ftp
iptables -t filter -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo - Autoriser serveur FTP : [OK]

# Autoriser Mail
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
echo - Autoriser serveur Mail : [OK]

# Limiter le Syn-Flood à 1 seconde
iptables -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT
iptables -A FORWARD -p udp -m limit --limit 1/second -j ACCEPT
echo - Limiter le Syn-Flood : [OK]

# IP à blacklister
# iptables -A INPUT -s ADRESSE_IP -j DROP
echo - Mise à jour des IP blacklistées : [OK]

# Bloquer le Spoofing
iptables -N SPOOFED
iptables -A SPOOFED -s 127.0.0.0/8 -j DROP
iptables -A SPOOFED -s 169.254.0.0/12 -j DROP
iptables -A SPOOFED -s 172.16.0.0/12 -j DROP
iptables -A SPOOFED -s 192.168.0.0/16 -j DROP
iptables -A SPOOFED -s 10.0.0.0/8 -j DROP
echo - Bloquer le Spoofing : [OK]

echo Firewall mis a jour avec succès !

Tester l’ouverture d’un port

Afin de tester le bon fonctionnement d’une application ou l’implémentation d’une règle de filtrage de type firewall vous avez la possibilité d’utiliser l’outil “Telnet” intégré à une majorité de systèmes d’exploitation.

L’utilisation se fait depuis une invite de commande ( Microsoft : PowerShell ou via un terminal en environnement Unix/Linux).

Voici un exemple de contrôle de la bonne ouverture du port 80 sur le site www.jaguar-network.com

~ > telnet www.jaguar-network.com 80
Trying 85.31.196.218...
Connected to www.jaguar-network.com.
Escape character is '^]'.

Le port est ouvert, l’application est connectée et attend que vous y passiez une commande.
Si le port est fermé, le logiciel n’arrive pas à lancer la connexion et les messages suivants peuvent être rencontrés :

    telnet: Unable to connect to remote host: Operation timed out
    telnet: Unable to connect to remote host: Connection refused