Table des matières

iptables: Manipulation des règles

Les règles sont lues séquentiellement au sein de la chaîne par le noyau pour déduire ce qu'il convient de faire d'un paquet. Si tous les critères (match ou correspondance) sont remplis, il exécute l'instruction donnée par la cible (ou saut).

La syntaxe générale est la suivante:

iptables -t table commande correspondance cible

La table filter est utilisée par défaut lors de l'utilisation de la commande iptables sans l'argument -t. Elle est dédiée au filtrage des paquets. Les accepte les cibles DROP, LOG, ACCEPT et REJECT. La table filter inclue 3 chaînes pré-définies:

Commandes

Le tableau ci-dessous résume les commandes disponibles

Commande Description
-A,--append Ajout d'une règle en fin de chaîne.
-D,--delete Supprime une règle via son numéro ou sa définition.
-R,--replace Remplacer une règle préexistante.
-I,--insert Insérer une règle à l'index choisit.
-L,--list Lister les règles d'une chaîne.
-F,--flush Suppression de toutes les règles d'une chaîne.
-Z,--zero RAZ des compteurs pour une chaîne ou toutes les chaînes.
-N,--new-chain Créer une nouvelle chaîne.
-X,--delete Supprimer une chaîne.
-P,--policy Stratégie par défaut pour une chaîne prédéfinie.
-E,--rename Renommer une chaîne.

Correspondances

Les correspondances utilisables pour la définition de la règle dépendent du contexte: la table, le protocole etc.

Correspondances implicites

Correspondances explicites

Cibles

La cible et le saut forment la partie de la règle qui indique le comportement à adopter lorsque les critères de correspondance sont vérifiés. Il existe deux cibles de base ACCEPT et DROP.

On parle de saut lorsque l'action consiste a exécuter une autre chaîne de la même table. Les cibles spécifie une action a effectuer sur le paquet en question. Certaines cibles stopperont la progression du paquet dans la chaîne (comme DROP ou ACCEPT) alors que d'autres permettront de continuer d'évaluer les autres règles de la chaîne comme LOG,ULOG ou TOS.

Cible LOG

La cible LOG est spécialement destinée à journaliser de informations détaillées sur les paquets.

Cible ULOG

Journalisation en espace utilisateur. Permet d'envoyer le paquet complet à des systèmes de log externes dans l'espace utilisateur au travers d' une interface de connexion réseau: diverses bases de données ou systèmes prévus pour faciliter la recherche/débogage via les logs.

Cible REJECT

Fonctionne comme la cible DROP mais renvoie un message d'erreur à l' hôte à l'origine du paquet.

Afficher les règles

L'argument -S utilisé sans la chaîne en option permet de lister les règles existantes sur l'ensemble des chaines associées à la table:

# liste toutes les règles de toutes les chaines de la table filter
iptables -t filter -S
 
# la table utilisée par défaut est filter, commande équivalente:
iptables -S
 
# lister seulement les règles de la chaine INPUT dans la table filter
iptables -S INPUT
 
# equivalent
iptables -t filter -S INPUT

Sauvegarder les règles

Les règles saisies à l'aide du CLI iptables sont actives mais ne seront pas conservées après redémarrage. Pour sauvegarder les règles actives dans un fichier texte afin de pouvoir les recharger, on peut utiliser iptables-save

iptables-save > firewall.rules

Restauration d'un jeu de règles

iptables-restore écrase les règles préexistantes et les remplaces par celles passées en entrée:

iptables-restore < firewall.rules

Exemples

Autoriser/interdire une application

On ne peut pas directement écrire de règle qui autorise ou refuse les paquets liés à une application (un binaire) en le désignant par son nom de fichier. En revanche grâce au module owner on peut écrire des règles pouvant s'appliquer à des utilisateurs ou des groupes.

L'astuce consiste à créer un groupe système, à affecter ce groupe au binaire puis à créer une règle pouvant s'appliquer.

Dans l'exemple proposé la politique par défaut rejette tous les paquets en sortie. On souhaite autoriser une application particulière (discord) à utiliser une plage de ports UDP en sortie (50000 à 50100)

# creation du groupe système
sudo addgroup --system discordnetpol
 
# affecter le groupe 
# lancer le programme
sg discordnetpol /usr/share/discord/Discord

Références