{{tag>netadmin firewall linux iptables}}
===== Introduction à iptables =====
iptables est un CLI permettant de configurer Netfilter. C'est le successeur du CLI ipchains (noyaux 2.2.x).
Netfilter est conçu pour agir sur les couches transport et réseau, c'est un élément de la sécurité mais il n'est pas capable de faire des vérifications sur les données transitant globalement. L'unité de traitement de netfilter est le paquet, les correspondances (match) utilisées pour définir les règles se basent sur les attributs des entêtes des protocoles. Pour effectuer des contrôles au niveau application on utilisera plutôt des serveurs mandataires (proxy).
chaîne: Une chaîne se compose d'un ensemble ordonné de règles appliquées aux paquets qui la traversent. Netfilter en fonction du contexte choisit quelles chaînes utiliser.
table: Chaque table à un rôle spécifique et iptables possède trois tables: filter, mangle et nat.
ruleset: Ensemble complet de règles chargées par une implémentation. Cela comprend les règles des trois tables filter, mangle et nat et les filtres qui les suivent. La plupart du temps le ruleset est définit dans un fichier de configuration.
Les règles de filtrages du pare-feu sont définies dans les chaînes de la table **filter**. Lorsqu' on invoque iptables sans l'argument **-t** c'est la tables filter qui est implicitement utilisée.
la table filter contient 3 chaînes de traitements:
* INPUT: chaîne des règles pour les paquets entrant
* OUTPUT: règles appliquées aux paquets sortants
* FORWARD: paquets non destinés à la machine
Les chaînes génériques peuvent appeler des chaînes définies par l'utilisateur.
===== Traçage de connexion =====
Les pare-feux qui implémentent le traçage de connexion sont dits pare-feux à état. Un pare-feu à état est généralement bien plus sûr car il impose une plus grande rigueur dans l'écriture des rulesets.
L’intégralité du traçage de connexion est effectué par une structure particulière à l'intérieur du noyau appelée **conntrack**. Des informations spécifiques et uniques sont capturés dans les paquets afin de pouvoir tracer les différents flux de données. La défragmentation est toujours active si le traçage de connexion est actif.
Le nombre maximum de connexions suivies par la table de traçage est fonction de la mémoire du système est peut être modifiée via la variable système /proc/sys/net/ipv4/ip_conntrack_max
iptables via la correspondance **state** sera capable de sélectionner les paquets à partir de leur état actuel **NEW**,**ESTABLISHED**,**RELATED**,**INVALID** ou **UNTRACKED**.
L'etat **UNTRACKED** est utilisé pour les paquets spécifiquement marqués dans la table raw pour ne pas être tracés. La table raw a été conçue spécialement pour cette raison. Dans cette table une marque NOTRACK peut être placée sur les paquets dont on souhaite désactiver le suivi par Netfilter.
Le fonctionnement du traçage de connexions nécessite des ressources. Il peut être intéressant dans certains cas de ne pas tracer les paquets:
* Pour un routeur fortement sollicité, ne pas tracer les paquets relayés ne lui étant pas directement adressés.
* Pour un serveur web interne générant beaucoup de trafic, ne pas tracer le port 80
Certains protocoles sont plus complexes dans le fonctionnement et nécessite pour que le traçage de connexions puisse fonctionner l'ajout de greffons dédiés capables de sonder les données, la charge utile des paquets (FTP, TFPT, IRC, etc)
===== Politique =====
Les politique (policy) est le comportement par défaut adopté par une chaîne générique lorsque aucune correspondance n'a été trouvée pour le paquet en cours d'évaluation.
Afficher les politiques définies:
iptables -L -v | grep policy
==== Définir les politiques par défaut ====
Pour chaque chaîne de traitement, les règles sont parcourues séquentiellement, lorsque aucune correspondance n'est trouvée la politique par défaut est appliquée. Pour modifier la politique:
$ sudo iptables --policy INPUT DROP
Ici la politique par défaut pour les paquets entrants devient DROP, ils seront ignorés si aucune règle ne peut être appliquée.
===== Ajouter une règle =====
L'argument **-A** ou **%%--%%append** (ajouter) permet d'ajouter une règle pour la chaine spécifiée. Il existe également l'argument **-I** ou **%%--%%insert** pour ajouter une règle en spécifiant sa position.
$ sudo iptables -A INPUT -i em2 -p tcp -s 192.168.0.0/24 --dport ssh -j REJECT
Ici les paquets entrant par l'interface em2 avec une adresse de réseau 192.168.0.0/24 et essayant de contacter le service écoutant sur le port SSH seront rejetés.
On peut ensuite insérer une règle d'exception permettant à une machine particulière de ce réseau de se connecter en ssh:
$ sudo iptables -I INPUT 1 -p tcp -i em2 -s 192.168.0.123 --dport ssh -j ACCEPT
===== Supprimer une règle =====
Pour supprimer une règle utiliser l'argument **-D** ou **%%--%%delete**. L'argument **%%--%%flush** supprimera toutes les règles définies sur une chaîne ou sur l'ensemble des règles.
===== Les états =====
La plupart des services ont besoin de communications bidirectionnelles. Il faut donc prévoir des règles traitant les paquets entrant dans la chaine INPUT et des règles pour les paquets sortants dans la chaine OUTPUT. Pour cela il peut être intéressant d'utiliser les états
États:
* **NEW**: nouvelle connexion
* **RELATED**: la connexion est nouvelle mais est en relation avec une autorisée
* **ESTABLISHED**: la connexion est établie
* **INVALID**: le trafic ne peut pas être identifié.
La règle ci-dessous permet d'autoriser le trafic en sortie à partir du moment ou il est lié à une connexion autorisée établie en entrée:
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Le reste de la configuration s'effectuera sur la chaine **INPUT**. Un exemple avec le service ssh, ici on autorise le trafic pour le service ssh si la connexion est initée depuis l'interface lan:
iptables -A INPUT -i lan -p tcp -s 192.168.0.0/24 -d 192.168.0.254 --dport ssh -j ACCEPT
===== Broadcast/multicast =====
Pour ignorer les paquets broadcastés ou les multicast:
iptables -A INPUT -m pkttype –pkt-type broadcast -j DROP
iptables -A INPUT -m pkttype –pkt-type multicast -j DROP
===== Enregistrer la configuration =====
Les modifications apportées ne sont pas permanentes. Pour les enregistrer et les retrouver au prochain redémarrage:
$ sudo iptables-save > /path/to/rules.conf
Modifier le fichier de configuration des interfaces pour qu'il charge le fichier contenant les règles:
# Paramétrage de l'interface WAN
auto wan
iface wan inet static
pre-up iptables-restore < /path/to/rules.conf
address 192.168.1.1
...
===== Lister les tables =====
Pour lister toutes les tables existantes sur le système:
$ sudo cat /proc/net/ip_tables_names
===== Références =====
* http://felipeferreira.net/index.php/2008/12/iptables-howto/
* https://www.inetdoc.net/guides/iptables-tutorial/commands.html
* https://sleeplessbeastie.eu/2018/06/21/how-to-create-iptables-firewall-using-custom-chains/
* https://www.youtube.com/watch?v=6Ra17Qpj68c