Post

Iptables Cheatsheet

Un aide-mémoire iptables sur les chaînes, les tables, les règles de filtrage, le NAT et le suivi des connexions.

Iptables Cheatsheet

Informations sur Iptables

Introduction

Sous Linux, le pare-feu est géré par Netfilter, un module du noyau qui contrôle les paquets réseau autorisés à entrer dans le système ou à en sortir.

Iptables est l’outil en espace utilisateur qui interagit avec Netfilter. Il fournit une interface en ligne de commande pour définir et gérer les règles de filtrage.

On peut considérer Netfilter comme le composant qui effectue le filtrage et iptables comme l’interface qui permet de le configurer.

Chaînes

Iptables utilise trois chaînes principales sur lesquelles nous pouvons agir pour contrôler les paquets reçus :

  • INPUT : trafic entrant destiné au pare-feu
  • OUTPUT : trafic sortant provenant du pare-feu
  • FORWARD : trafic qui traverse le pare-feu (trafic de transit)

Politique par défaut

Après l’installation d’iptables, les fonctions de pare-feu sont présentes, mais elles ne sont pas encore actives. Par défaut, le pare-feu est complètement ouvert, ce qui signifie que :

  • toutes les chaînes ACCEPTENT le trafic
1
2
# To see your defaults policy :
sudo iptables -L | grep policy

Dans une configuration renforcée, on utilise souvent iptables pour limiter les connexions. Selon le principe du moindre privilège, il faut bloquer toutes les connexions et n’autoriser que celles dont on a besoin.

1
2
3
4
# Basic hardened default Policy :
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT DROP

Astuce : pour rétablir l’acceptation du trafic après 30 secondes, vous pouvez tester votre configuration sans risquer de vous verrouiller hors de la machine :

1
2
# Put all chains to DROP then revert to ACCEPT after 30 sec
sudo iptables -P INPUT DROP && sudo iptables -P FORWARD DROP && sudo iptables -P OUTPUT DROP && sleep 30 && sudo iptables -P INPUT ACCEPT && sudo iptables -P FORWARD ACCEPT && sudo iptables -P OUTPUT ACCEPT

Construire des commandes

Vous pouvez suivre cette image de bas en haut pour formuler une règle iptables.

Schéma de construction d’une règle iptables

Interfaces

1
2
-i inside (internal)
-o outside (external)

Adresses

1
2
-s source address
-d destination address

Protocole

1
-p tcp (TCP protocol)

Ports

1
2
--sport (source port)
--dport (destination port)

Modules

Pour les modules et le suivi des connexions, consultez la fin de cette page.

Actions

-j ACCEPT : autoriser le paquet à poursuivre son parcours dans le pare-feu. -j REJECT : rejeter le paquet et renvoyer un message d’erreur à l’expéditeur (ICMP port unreachable pour UDP, TCP RST pour TCP) -j DROP : supprimer le paquet sans envoyer de réponse à l’expéditeur -j MASQUERADE : effectuer un SNAT avec l’adresse IP actuelle du pare-feu, même si elle est dynamique -j SNAT : effectuer un SNAT avec l’adresse IP source spécifiée, avec possibilité de traduire aussi le port -j LOG : consigner les informations du paquet dans le journal système, sans effet sur son parcours

Exemple court

Pour autoriser l’accès SSH à un serveur ainsi que le trafic de réponse correspondant :

1
2
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Tables iptables

Les tables sont des structures qui définissent le traitement des différents types de trafic réseau. Chaque table contient un ensemble de règles organisées en chaînes qui déterminent les actions à effectuer.

On peut créer des tables personnalisées pour classer le trafic et simplifier l’administration, mais nous ne couvrons ici que les tables courantes.

  • Filter : table par défaut utilisée pour le filtrage des paquets
  • Nat : utilisée pour le NAT ; modifie les en-têtes des paquets pour changer l’adresse IP ou le port source/de destination
  • Mangle : modifications spécialisées des paquets, comme le changement d’un champ ou la définition de certains indicateurs
  • Raw : configurations avancées

Schéma des tables iptables

Plus de détails

Lorsqu’un paquet arrive, il traverse la chaîne PREROUTING de la table NAT, où il peut être modifié avant la prise de décision de routage.

Après la décision de routage, si le paquet est destiné à un processus local, il entre dans la chaîne INPUT de la table Filter. S’il est routé vers une autre destination, il passe par la chaîne FORWARD (par exemple, lorsque le pare-feu sert de passerelle pour un client).

Pour les paquets sortants, ils passent d’abord par la chaîne OUTPUT de la table Filter. S’ils sont modifiés (par exemple par le NAT), ils passent ensuite par la chaîne POSTROUTING de la table NAT.

La table Mangle peut intervenir à n’importe quel moment pour modifier les paquets selon les besoins, ce qui permet des scénarios de routage et de filtrage complexes.

Journalisation iptables

1
2
iptables -I FORWARD -j LOG        # Log packets in the FORWARD chain
sudo journalctl                   # View logged packets in the system journal

Exemple de règle DNAT dans PREROUTING, par exemple pour un proxy inverse :

1
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# redirects incoming UDP traffic on ports 53, 80, and 4444 for the specified IP to port 15351, useful for wireguard server to listen on multilples ports
iptables -t nat -I PREROUTING -i eth0 -d <yourIP/32> -p udp -m multiport --dports 53,80,4444 -j REDIRECT --to-ports 15351

### Example Commands
sudo iptables -A FORWARD -m conntrack --ctstate NEW -j ACCEPT          # Allow new connections
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT   # Allow responses to existing connections

### Listing and Deleting Rules
sudo iptables -L --line-numbers    # List rules
sudo iptables -D INPUT 3           # Delete the 3rd rule from the INPUT chain
sudo iptables -F                   # Flush all rules

### Managing ESTABLISHED Connections
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT

### SNAT (Source Network Address Translation)
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 1.2.3.4

### Masquerade
sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE

### View the NAT Table
sudo iptables -t nat -nvL

### SNAT Traffic Redirection
iptables -t nat -A POSTROUTING -s 192.168.1.100 -j SNAT --to-source 10.0.0.100

### DNAT (Destination Network Address Translation)
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080

À propos des modules et du suivi des connexions

Modules

-m (module iptables) established, related (suivi des connexions)

Conntrack et State

-m conntrack –ctstate (suivi moderne des connexions) -m state –state (suivi hérité des connexions, fonctionne comme conntrack)

Suivi des connexions
  • NEW : le paquet initie une nouvelle connexion ou est associé à une connexion qui n’a pas encore vu de paquets dans les deux directions. Un paquet TCP SYN est marqué NEW.

  • ESTABLISHED : le paquet fait partie d’une connexion ayant vu des paquets dans les deux directions, après la fin de l’établissement TCP (SYN-ACK).

  • RELATED : le paquet initie une nouvelle connexion associée à une connexion existante.

Cet article est sous licence CC BY 4.0 par l'auteur.