====== 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:
* FORWARD: s'applique à tous paquets non générés localement et non destinés à l'hote local.
* INPUT: tout paquet destiné a l’hôte local.
* OUTPUT: tout paquet généré localement.
===== 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 =====
* https://wiki.visionduweb.fr/index.php/Configurer_le_pare-feu_Iptables
* https://stackoverflow.com/questions/4314163/create-iptables-rule-per-process-service