Iptables est un firewall intégré aux distribution linux très utiles aux administrateurs systèmes pour sécuriser sa machine, il permet :
- le filtrage de port / ip / protocole
- la modification de paquets
- le transfert d’ip
Installation
Par défaut il est installé de base mais si ce n’est pas le cas pour vous voici comment l’installer :
Installation sur Ubuntu / Debian :
apt install iptables
Installation sur Red Hat / Centos :
yum install iptables
Les Tables
Le firewall fonctionne par tables, chaque table à un objectif et possèdes des chaines ( les chaines sont des événements assigné à une table).
Il existe 4 tables et chacune ont leurs particularités :
Table NAT :
Gère la translation de port et d’adresse ip.
4 chaînes :
- PREROUTING: action avant le routage
- POSTROUTING : action après le routage
- INPUT (entrant)
- OUTPUT (sortant)
3 cibles :
- DNAT : IP de destination
- SNAT : IP source
- MASQUERADE : simulation d’une gateway
Table Filter :
La table par défaut, elle permet le filtrage : des ports, des adresses IP, des protocoles, des expéditeurs etc…
3 chaînes :
- Input
- Output
- Forward
4 statut :
- Drop : refus du paquets ( sans l’indiquer à l’expéditeur )
- Accept : accepte les paquets
- Reject : rejet des paquets et indique à l’expéditeur le refus
- Deny
- LOG : trace les paquets
Table Mangle :
Cette table sert à modifier les paquets entrant, sortant, avant le routage et après.
4 chaînes :
- PREROUTING: action avant le routage
- POSTROUTING : action après le routage
- INPUT
- OUTPUT
5 cibles :
- TOS : type de service
- TTL : durée de vie des paquets
- MARK : marque un paquet pour le suivre
- SECMARK : marque un paquets pour les outils de sécurité (comme SElinux)
- CONNSECMARK : copie d’un paquet
Table raw :
Permet de placer un tag sur les paquets pour indiquer qu’ils ne doivent pas être vérifié.
2 chaînes :
- PREROUTING
- OUTPUT
Les commandes
Pour lister les règles :
-L
root@serveur-test:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
root@serveur-test:~#
Cette commande liste par défaut les règles de la table filtrer
Pour spécifier une table :
-t nom_de_la_table
root@serveur-test:~# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Ajouter une règle à une chaine (en fin de liste):
-A
exemple avec input : -A INPUT
Supprimer une règle :
-D chaine numéro_de_ligne
exemple 3ème output : -D OUTPUT 3
Afficher le numéro de ligne de la règle :
-L –line-number
Remplacer une règle :
-R chaine numéro_de_ligne
Insérer une règle en début de liste :
-I
Insérer une règle sur la ligne 6 :
-I 6
Supprimer toutes les règles d’une chaînes :
-F chaîne
Création d’une chaîne :
-N
Suppression de chaîne :
-X
Définir la politique par défaut d’une chaîne (exemple avec Output en REJECT par défaut):
-P Output REJECT
Spécifier un protocole :
-p tcp
Spécifier la source de l’expéditeur :
-s adresse_ip
Action à exécuter :
-j DROP
La destination :
-d
L’interface d’entrée (eth0 ici) :
-i eth0
L’interface de sortie :
-o eth0
Port source (80):
–sport 80
Port de destination (443):
–dport 443
Plusieurs ports :
-m multiport –sport 80,90,8000
Commandes dans la pratique
Bloquer le port HTTP de mon serveur :
iptables -I INPUT -p tcp --dport 80 -j REJECT
Empêcher ma machine de répondre au ping :
iptables -I INPUT -p icmp -j DROP
J’ai une application qui écoute sur le port 8080 et je souhaite que seul ma machine hôte puisse accéder à ce port (bloquer le port 8080 pour les autres machines) – 0.0.0.0:8080 en 127.0.0.1:8080 :
iptables -I INPUT -p tcp --dport 8080 -j REJECT
iptables -I INPUT -p tcp --dport 8080 -s 127.0.0.1 -j ACCEPT
La première règle rejete les flux entrant vers le port 8080 pour toutes les machines ( ainsi que le localhost) puis la seconde règle autorise le port 8080 uniquement pour notre localhost.
Remplacer la règle 2 pour autoriser les flux vers le port 8090 :
iptables -R INPUT 1 -p tcp --dport 8090 -s 127.0.0.1 -j ACCEPT
Tout interdire (aucun flux entrant, sortant ou routé) :
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
Bloquer les flux venant d’un réseau en particulier (ici le 172.16.16.0/24) :
iptables -A INPUT -s 172.16.16.0/24 -j DROP
Sauvegarder et restaurer ces modifications
Toutes ces modifications ne sont pas permanentes, au prochain reboot de serveur les modifications seront perdu.
iptables-save
iptables-save est un binaire très utile pour sauvegarder nos tables iptables. Il permet de retranscrire dans un fichier toutes notre configurations.
iptables-save > regles.save
iptables-restore
Puis en utilisant iptables-restore on peut restaurer nos règles avec le fichier précédemment généré :
iptables-restore regles.save
Restaurer ses règles dès la mise en réseau
Pour éviter que des connexions aient lieu sur notre serveur avant l’importation de nos règles, nous pouvons ajouter une ligne dans la configuration de notre carte réseau de sorte que les règles soient chargées avant la connexion au réseau de notre machine.
Modifier le fichier /etc/network/interfaces et ajouter la ligne pre-up comme ci-dessous :
auto eth1
iface eth1 inet static
address 172.16.16.40
netmask 255.255.255.0
pre-up iptables-restore /root/regles.save
Maintenant lors de chaque reboot restart du service networking, les règles seront chargées.
Ainsi si tu lance la commande :
systemctl restart networking.service
Les règles seront chargées.
Si tu veux aller plus loin avec l’outil, le site debian-facile.org a fait un tuto très complet avec pleins d’exemples sur son utilisation.
Les autres articles autour de linux : ICI