iptables – configuration du firewall

iptables linux configuration firewall

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
tables iptables
filter
nat
mangle
raw

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

Laisser un commentaire