Iptables

De Backtrack-fr


Ce document contient les informations de base à propos de iptables, pour ceux qui souhaitent mettre en place un firewall et/ou un partage de connexion sans passer par une interface graphique. Les lecteurs désirant approfondir leur recherche trouveront des dizaines de tutoriels sur iptables & netfilter.

Sommaire

Firewalling avec IPtables

Netfilter est inclus dans le Kernel, il est donc présent dans toutes les distributions Gnu/linux récentes. (kernel 2.4)
Iptables est la commande qui permet d'interagir avec lui (Netfilter).
Il offre la possibilité de contrôler, modifier et filtrer les paquets IP, et de suivre les connexions.
Il fournit ainsi les fonctions de pare-feu, de partage de connexions internet et d'autorisation du trafic réseau.
Iptables est l'interface "ligne de commande" permettant de configurer Netfilter.
Iptables nécessite obligatoirement les droits 'Root'. les commandes et les règles sont passées en ligne de commande.
Le plus "simple" est d'écrire des scripts incorporant le détail des règles. (à rajouter dans /etc/init.d).

Tables et Policy

Une table est un module de netfilter; chaque module est composé de plusieurs chaines.
Les chaines représentant la politique appliquée (policy) selon des arguments cibles.
(à chaque règle est associée une action)
Chaque chaîne est une liste de règles auxquelles peuvent correspondre un ensemble de paquets. Chaque règle spécifie ce qui doit être fait avec un paquet qui correspond. Cela s'appelle une «cible», qui peut être un saut vers une chaîne définie par l'utilisateur dans la même table.

!!Tenter d'expliquer plus clairement!!

Table Filter

La table FILTER permet de filtrer les trames réseaux.
Toute trame (paquet) entrante est analysée afin de déterminer sa source d'origine et sa destination finale.
Elle permet de détruire (DROP), journaliser (LOG), accepter (ACCEPT) ou rejeter (REJECT) des trames.
Elle utilise trois chaînes.

Les chaines Filter

- Si le paquet est adressé au poste, il est confronté au filtre INPUT.
- Si une règle l'autorise à passer, le paquet passera la barrière de INPUT, à défaut, et à condition qu'il soit actif (FORWARDING), la trame passera par le filtre FORWARD.
- Si le paquet sort du poste, il devra passer la chaine OUTPUT.

  • INPUT : Vérifie les paquets entrants.
  • OUTPUT : Vérifie les paquets sortants.
  • FORWARD : Vérifie et autorise les trames à passer d'une interface réseau à l'autre.
    (dans le cadre d'une interface réseau servant de passerelle vers une autre)

Table Nat

La table NAT est dédiée à la traduction/Translation d'adresses et de ports.(NAT).

Les chaines Nat

  • PREROUTING [le traffic entrant avant routage]

Traite les paquets arrivant de l'extérieur avant qu'ils ne soient routés.
Elle permet de modifier la destination de la connexion (DNAT).

  • POSTROUTING [le traffic sortant après routage]

Traite les paquets après la décision de routage, juste avant que le paquet soit expédié.
Elle permet la modification de la source de la connexion (SNAT).

  • OUTPUT fonctionne comme la chaîne PREROUTING pour les connexions issues d'un processus du système.

(trafic généré par la machine locale avant le routage.)

Table Mangle

Cette table est employée lors d'un traitement spécial des paquets.

Les chaines Mangle

Elle a deux chaînes pré-définies :

  • PREROUTING : Permet de modifier les paquets entrants avant qu'ils ne soient routés.
  • OUTPUT : Permet de modifier les paquets locaux avant leur reroutage vers leur destination.

Table Raw

Les chaines Raw

Les Cibles

Une règle de pare-feu spécifie les critères pour un paquets, et une cible. Netfilter lit les chaines de ses tables de haut en bas. Si le paquet ne correspond pas, la règle suivante de la chaîne est examinée ; si il correspond, la règle suivante est spécifiée par la valeur de la cible, qui peut être le nom d'une chaîne définie par l'utilisateur, ou l'une des valeurs spéciales suivantes : ACCEPT, DROP, QUEUE, ou RETURN.

  • ACCEPT:

Les paquets sont acceptés et poursuivent jusqu'à destination.

  • DROP:

Les paquets sont ignorés. Ils ne franchissent aucune règle.

  • REJECT:

Équivalent à DROP et expédie une réponse à l'émetteur pour lui signaler que le paquet a été refusé.

  • QUEUE:
  • RETURN:

Utile dans les chaînes utilisateurs. Cette cible permet de revenir à la chaîne appelante.
Si RETURN est utilisé dans une des chaînes de base précédente, cela est équivalent à l'utilisation de sa cible par défaut.

Commandes

Commande:
IPV4

# iptables [-t table] commande [correspondance] [cible/saut]

IPV6

# ip6tables [-t table] commande [correspondance] [cible/saut]


Option
Paramètre
Explication
Exemple
-t(table)
"filter", "nat", "mangle" Spécifie la Table à utiliser.Si aucun paramètre n'est fourni, c'est la table Filter qui est sélectionnée par défaut. "iptables -t nat ..." permet de travailler sur ta table "NAT".
-F(Flush)
"filter", "nat", "mangle" Supprime toutes les règles d'une chaîne prédéfinie (tel "PREROUTING", "INPUT", "FORWARD", "OUTPUT" et "POSTROUTING").

Si aucun paramètre n'est donné, toutes les chaînes prédéfinies sont supprimés.

"iptables -F" supprime toutes les chaînes prédéfinies de la table "filter".
-X(eXclude)
[Chaîne utilisateur] Supprime une chaîne utilisateur. Si il n'y a aucun paramètre, toutes les chaînes utilisateurs sont supprimées. "iptables -X perso_3" supprime la chaîne utilisateur "perso_3".
-P(Policy)
"filter", "nat", "mangle" Définie la politique (ou cible) par défaut d'une chaîne.

Seules les chaînes prédéfinies peuvent avoir un comportement par défaut.

Cette cible ne sera appliquée qu'après l'exécution de la dernière règle de la chaîne.

"iptables -P INPUT DROP"

supprime par défaut tout les trames dans la chaîne "INPUT".

Si aucune règle plus "souple" n'est définie, aucun paquet réseau n'arrivera derrière cette règle.

-N(New)
[Chaîne utilisateur] Cette option crée une nouvelle chaîne utilisateur.

Par la suite, des règles doivent êtres créées, afin de remplir cette chaîne.

"iptables -N Log_xx" crée une chaîne utilisateur dont le nom laisse supposer que l'on va logger certaines connexions.
-A(Append)
[Chaîne] Commande primordiale, elle ajoute une règle à une chaîne prédéfinie ou utilisateur. "iptables -A INPUT ..." ajoute une règle à la table des paquets entrants.
-D(Delete)
[Chaîne] [Numéro de règle] Supprime une règle dans une chaîne particulière.

Le numéro de la règle peut être retrouvé avec la commande "iptables -L" ou "iptables -L -n"

"iptables -D OUTPUT 4 -t mangle" supprime la 4ieme règle de la chaîne "OUTPUT" de la table "Mangle".
-L(Liste)
[Chaîne] Afficher la liste des règles pour la chaîne indiquée. Ou, si aucune chaîne n'est indiquée, cela affichera les règles pour toutes les chaînes de la table indiquée. Note : Rajouter à "-L" les options "-n" et "-v" est très utile. "iptables -L -n -v" affiche le maximum d'informations sur les règles de la table "filter".
-j(jump)
[Cible] Défini l'action à prendre si un paquet répond aux critères de cette règle. Les principales valeurs sont : ACCEPT, DROP, REJECT, LOG "iptables -A OUPUT -j DROP" supprime tous les paquets sortant des processus locaux. Ca, c'est de la censure !!
-i(input)
[Interface réseau] Critère sur l'interface réseau dont provient le paquet "iptables -A INPUT -i eth0 ..." filtre les paquets arrivant aux programmes et venant de l'interface réseau eth0.
-o(output)
[Interface réseau] Critère sur l'interface réseau d'où les paquets vont sortir "iptables -A OUTPUT -o ppp0" filtre les paquets créés par les programmes et sortant sur Internet.
-s(source)
[!] [Adresse IP ou réseau] Critère sur l'adresse IP source du paquet "iptables -t nat -A PREROUTING -i 192.168.0.0/24 ..." travaille sur le routage des paquets du réseau interne sky.net.
-d(destination)
[!] [Adresse IP ou réseau] Critère sur l'adresse IP de destination du paquet "iptables -A OUTPUT -d 192.168.0.0/24 ..." filtre les paquets sortant de l'espace utilisateur, à destination du réseau sky.net.
-p(protocole)
[!] "all", "tcp", "udp", "icmp", ou un numéro Critère sur le type de trames utilisé dans le paquet. D'autres numéros de protocoles peuvent être utilisés. Voir votre fichier "/etc/procoles" "iptables -A INPUT -p udp ..." filtre uniquement les paquets de type UDP.
--sport
[!] [Port ou service] Critère sur le port source des paquets IP "iptables -A INPUT -sport 80 ... " filtre tout ce qui vient du port HTTP (80).
--dport
[!] [Port ou service] Critère sur le port de destination des paquets IP "iptables -O OUPUT -dport ! 21 ... " filtre tout ce qui n'est pas à destination du FTP (21).
-m(module)
[Nom d'un module] Demande d'utiliser un module particulier "iptables ... -m state ..." utilise le module de suivi de connexion ("state" veut dire "statut" en français).
--state
[!] "NEW", "ESTABLISHED", "RELATED", "INVALID" Cette option ne s'utilise que cumulée avec l'option "-m state", afin d'être utilisé pour le suivi de connexion "iptables ... --state NEW,ESTABLISHED ..." filtre les paquets de nouvelles connexions, ou de connexions déjà établies via une "poignée de main".
--log-prefix--ulog-prefix
[Un mot] Rajoute un commentaire pour les cibles LOG et ULOG "iptables ... -j LOG --log-prefix toto" rajoutera le mot "toto" au log de cette règle.

Remarque : On trouve parfois dans la colonne "Paramètre" du tableau le paramètre "[!]". Ce paramètre peut se rajouter aux autres paramètres de l'option, afin d'indiquer la négation.

Exemples :

iptables -I INPUT -p tcp -sport 80 -j DROP

Supprime toutes les trames HTTP rentrant dans l'espace utilisateur.

iptables -I INPUT -p tcp -sport '''!''' 80 -j DROP

Supprime toutes les trames rentrant dans l'espace utilisateur, excepté celles de HTTP.

Exemples de règles

Bloquer tout le trafic réseau Entrant/sortant:

# iptables -F
# iptables -A INPUT -j REJECT
# iptables -A OUTPUT -j REJECT
# iptables -A FORWARD -j REJECT

Bloquer tout le trafic réseau Entrant:

# iptables -F INPUT
# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
# iptables -A INPUT -j REJECT

Bloquer tout le trafic réseau Sortant:

# iptables -F OUTPUT
# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -j REJECT

Bloquer des services ou des ports:

# iptables -A INPUT -p tcp --dport www -j REJECT
# iptables -A INPUT -p tcp -i lo --dport www -j ACCEPT
# iptables -A INPUT -p tcp --dport www -j REJECT

Bloquer un hôte distant:

# iptables -A INPUT -s remote_IP_address -j REJECT
# iptables -A INPUT -p tcp -s remote_IP_address --dport smtp -j REJECT
# iptables -A INPUT -s IP_address_1 [-p protocol --dport service] -j ACCEPT
# iptables -A INPUT -s IP_address_2 [-p protocol --dport service] -j ACCEPT
# iptables -A INPUT -s IP_address_3 [-p protocol --dport service] -j ACCEPT
# iptables -A INPUT [-p protocol --dport service] -j REJECT
# iptables -A OUTPUT -d remote_IP_address -j REJECT
# iptables -A OUTPUT -p tcp -d remote_IP_address --dport www -j REJECT

Blocage sortant des serveurs Web du réseau LAN:

# iptables -A OUTPUT -p tcp -d 192.168.0.0/24 --dport www -j REJECT

Blocage sortant Telnet du réseau LAN:

# iptables -A OUTPUT -p tcp -o lo --dport telnet -j ACCEPT
# iptables -A OUTPUT -p tcp --dport telnet -j REJECT

Blocage distant mais local autorisé sur service désigné en passant par Lo:

# iptables -A INPUT -p tcp -i lo --dport service -j ACCEPT
# iptables -A INPUT -p tcp --dport service -j REJECT

Blocage par controle des adresses MAC:

# iptables -F INPUT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -m mac --mac-source 12:34:56:89:90:ab -j ACCEPT
# iptables -A INPUT -j REJECT


Blocage de tous les accès sauf un SSH:

# iptables -F INPUT
# iptables -A INPUT -p tcp --dport ssh -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -j REJECT

Blocage que d'un service ou port spécifique:

# iptables -A OUTPUT -p tcp --dport telnet -j REJECT

Protéger un serveur simplement:

Autoriser les connexions sur www, ssh, et smtp.

# iptables -F INPUT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -m multiport -p tcp --dport www,ssh,smtp -j ACCEPT
# iptables -A INPUT -j LOG -m limit
# iptables -A INPUT -j REJECT

Accepte les requetes ICMP (ping) Entrantes

# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

Blocage des requetes ICMP (ping) Entrantes

# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

Blocage des packets réseaux broadcasts Entrants

# iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP

Bloque certains scans de ports

# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# iptables -A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP

Lister les règles d'Iptables:

# iptables -L 
# iptables -L -v

Sources

  • Un excellent site sur le fonctionnement de NetFilter

Olivier ALLARD-JACQUIN

Outils personnels