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:
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. |
Les correspondances utilisables pour la définition de la règle dépendent du contexte: la table, le protocole etc.
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.
La cible LOG est spécialement destinée à journaliser de informations détaillées sur les paquets.
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.
Fonctionne comme la cible DROP mais renvoie un message d'erreur à l' hôte à l'origine du paquet.
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
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
iptables-restore écrase les règles préexistantes et les remplaces par celles passées en entrée:
iptables-restore < firewall.rules
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