iptables


Définition


Un firewall permet de protéger un réseau vis à vis d’autres réseaux. Le but d’un firewall est d’autoriser ou non, un certain trafic en filtrant les paquets entrant et/ou sortant. C’est l’élément de base dans la sécurisation d’un réseau local.

Étant donné qu’il traite des paquets, le firewall agit sur la couche 3 du modèle OSI, mais il peut aussi agir en couche 2 en filtrant au niveau MAC. Il peut aussi réaliser du NAT, SNAT, DNAT et PAT.

Le firewall utilisé sous Linux est netfilter, on parle de SPI (Stateful Packet Inspection). Il est utilisable via les commandes iptables (IPv4) et ìp6tables (IPv6).


Notion importante


Paquets en:

  • INPUT: lorsqu’un hôte reçoit des paquets qui lui sont destinés
  • OUTPUT: lorsqu’un hôte crée des paquets
  • FORWARD: lorsqu’un hôte joue le rôle de “routeur” (activer le forwarding : $ sudo sysctl net.ipv4.ip_forward=1)

Type de firewall:

  • stateless : ne garde aucune trace des connexions qui le traverse.
  • stateful : mémorise l’état des connexionx TCP afin de contrôler les échanges.

Fonctionnement iptables

Étapes pour créer une régle avec iptables :

  1. choisir la table
  2. choisir la chaine
  3. choisir action sur la chaine
  4. sélectionner les paquets

Une régle est découpée comme ceci :

$ iptables -t table -action_chaine chaine select paquets -j action_paquets

Choisir la table


-t filter

  • filtrage des paquets qui partent et qui arrivent
  • table par défaut, si rien n’est précisé

-t nat

  • faire du DNAT, SNAT, PAT

-t mangle

  • modifier des données des couches hautes, notamment TCP

Choisir la chaine


pour -t filter :

  • INPUT
  • FORWARD
  • OUTPUT

Sur ces 3 chaines on peut :

  • -j ACCEPT : on accepte le paquet
  • -j DROP : on refuse le paquet sans prévenir l’expéditeur de celui-ci
  • -j REJECT : on refuse le paquets mais on prévient l’expéditeur
  • -j LOG : on affiche un log

pour -t nat :

  • PREROUTING
    • avant le routage (avant le forward)
  • OUTPUT
    • traite paquets crées localement avant leur routage
  • POSTROUTING
    • après le routage

Sur ces 3 chaines on peut :

  • -j DNAT : Destination NAT, on modifie @ de destination du paquet
  • -j SNAT : Source NAT, on modifie @ source du paquet
  • -j MASQUERADE : changer @ source privée d’un paquet pour utiliser une @ publique pour aller sur internet

pour -t mangle

  • PREROUTING
  • INPUT
  • OUTPUT
  • FORWARD
  • POSTROUTING

Choisir action sur la chaine


  • -A : ajouter
  • -D : supprimer
  • -R : remplacer
  • -I index : insérer (indice)
  • -L : afficher
  • -F : vider
  • -N –new-chain : nouvelle chaine
  • -X –delete-chain : supprimer chaine
  • -P –policy : politique par défaut d’une chaine

La policy est appliquée au paquet si aucune règle ne s’applique sur lui. iptables -t filter -P FORWARD DROP

# créer une chaine
$ iptables -N my_chain

# l'utiliser
$ iptables -t nat -A INPUT -p tcp -j my_chain

Sélectioner des paquets


  • -p : protocole des données, tcp, udp, icmp,…
  • -s : @IP src. du paquet
  • -d : @IP dst. du paquet
  • -i : interface d’entrée du paquet (eth0, enp0s3)
  • -o : interface de sortie
  • -f : si le paquet est un fragment
  • --sport : port source
  • --dport : port destination
  • -m multiport
    • -m multiport --dports 10:100
  • –tcp-flags : flags tcp
    • --tcp-flags SYN,RST,ACK,FIN,URG,PSH,ALL,NONE
  • –icmp-type 8 : code icmp
  • –mac-source : @MAC source de la trame
  • –state : état de la connexion
    • -m state --state NEW,ESTABLISHED,RELATED,INVALID -m -match suivi du nom du module et des options de celui-ci prefixé par –
États d’une connexion Description
ETABLISHED connexion déjà établie
NEW demande nouvelle connexion
INVALID associé à connexion inconnue
RELATED le paquet est en rapport avec une connexion déjà existante

VII - Exemples de commandes


# bloquer tout le trafic TCP à destination de la machine
$ iptables -t filter -A INPUT -p tcp -j DROP

# bloquer tous le trafic à destination de notre machine envoyé sur le port 80 en tcp avec comme adress source 192.168.10.3.
$ iptables -t filter -A INPUT -s 192.168.10.3 -p tcp --dport 80 -j DROP

# rediriger tout le trafic arrivant sur le port 80 de notre machine avec comme adresse de destination 51.18.65.167 en tcp vers la machine local 10.10.10.10 sur le port 80.
$ iptables -t nat -A PREROUTING -d 51.18.65.167 -p tcp --dport 80 -j DNAT -–to-destination 10.10.10.10:80

# proxy transparent, forcer utilisateurs à utiliser proxy, même si navigateur non configuré
$ iptables –t nat –A PREROUTING –s 192.168.1.0/24 –p tcp –-dport 80 –j REDIRECT –-to-port 3128

# accepter tous les paquets du réseau 192.168.1.0/24 en entré, en sortie et en routage.
$ iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
$ iptables -A OUTPUT -d 192.168.1.0/24 -j ACCEPT
$ iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT

# DNAT en PREROUTING
$ iptables –t nat –A PREROUTING –d 10.0.0.10 –p tcp –-dport 2222 –j DNAT –-to-destination 192.168.1.100:22

# SNAT en POSTROUTING
$ iptables –t nat –A POSTROUTING –s 192.168.1.0/24 –j SNAT –-to-source 1.2.3.1
$ iptables –t nat –A POSTROUTING –s 192.168.1.0/24 –j MASQUERADE

Exemple de configuration


# vide toutes les chaînes
/sbin/iptables --flush

# autorise tout le trafic possible sur la loopback
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT

# policies par défaut : on bloque tout 
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP

# autorise le trafic déjà établie
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# autorise tout trafic en sortie (outbound)
/sbin/iptables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT

Aller plus loin


conntrack est une partie de netfilter, pour gérer la durée de vie des connexions la 3ème colonne indique 30, c’est à dire le temps avant de fermer la connexion

# vérifier connexion
$ sudo conntrack -L
$ sudo conntrack -E # temp réel
# aide sur un module
$ iptables -m limit -h

! devant une selection permet de faire linverse

# afficher toutes les règles
$ sudo iptables -t filter -L

# Pour surveiller, l’application des règles et voir si elles se déclenchent 
$ sudo watch ebtables -L --Lc
$ sudo watch iptables -t nat -nvL

# Pour sauvegarder/restaurer ce que l’on a définit dans iptables :
iptables-save
  -c : permet de conserver les valeurs de compteurs à fin de statistiques ;
  -t : permet de sélectionner la table à sauvegarder (si l’option est omise, toutes les tables sont sauve-
gardées).
iptables-restore
  -c : permet de restaurer les valeurs de compteur ;
  -n : permet de ne pas effacer les règles existantes avant restauration.

# réinitialer compteurs
$ sudo iptables -Z FORWARD

Filtrage sur @mac

# nat sur @mac
$ ebtables -t nat -A PREROUTING -d 00:11:22:33:44:55 -i eth0 -j dnat --to-destination 54:44:33:22:11:00
$ ebtables -t nat -A POSTROUTING -s 00:11:22:33:44:55 -i eth0 -j snat --to-source 54:44:33:22:11:00 --snat-target ACCEPT

# répondre automatiquement à requêtes arp
ebtables -t nat -A PREROUTING -p arp --arp-opcode Request --arp-ip-dst 192.168.127.2 -j arpreply --arpreply-mac de:ad:be:ef:ca:fe

Modules netfilter

  • time: limiter durée connexion par jours
  • quota: ajouter un quota sur certains paquets
  • nth: faire équilibrage de charge, round robin entre plusieurs serveurs
  • u32: modules pour tester valeur d’octets particuliers du datagramme IP
  • length: limiter paquets à une certaines taille
  • owner: tenir compte des paquets crées localement du processus de son propriétaire
  • set: contruire liste d’IP ou de MAC ou de numéro de port et les utiliser dans les règles
  • limit et conn: limiter nombre de connexions sur des services
  • limit et burst: système de jeton et d’autorisation
  • log: logger un trafique sur du dmesg
  • hashlimit : éviter bruteforce

Table mangle

# champs TOS et DSCP
$ iptables -t mangle -A FORWARD -p tcp --dport 80 -j DSCP --set-dscp 1
$ iptables -t mangle -A FORWARD -p tcp --dport 80 -j DSCP --set-dscp-class EF

# TTL
$ iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-inc 1
# --ttl-set 20
# --ttl-dec 2
# --ttl-inc 2

Sources