iptables
02/02/2019definition
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).
important notion
Paquets en:
INPUT: lorsqu’un hôte reçoit des paquets qui lui sont destinésOUTPUT: lorsqu’un hôte crée des paquetsFORWARD: 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.

Étapes pour créer une régle avec iptables :
- choisir la table
- choisir la chaine
- choisir action sur la chaine
- sélectionner les paquets
Une régle est découpée comme ceci :
$ iptables |
-t table | -action_chaine | chaine | select paquets | -j action_paquets |
choose the 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
for -t filter :
INPUTFORWARDOUTPUT
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
for -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
for -t mangle :
PREROUTINGINPUTOUTPUTFORWARDPOSTROUTING
choose table action
-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 -matchsuivi 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 |
commands example
# 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
configuration example
# 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
more
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
filter on mac address
# 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
netfilter modules
time: limiter durée connexion par joursquota: ajouter un quota sur certains paquetsnth: faire équilibrage de charge, round robin entre plusieurs serveursu32: modules pour tester valeur d’octets particuliers du datagramme IPlength: limiter paquets à une certaines tailleowner: tenir compte des paquets crées localement du processus de son propriétaireset: contruire liste d’IP ou de MAC ou de numéro de port et les utiliser dans les règleslimitetconn: limiter nombre de connexions sur des serviceslimitetburst: système de jeton et d’autorisationlog: logger un trafique sur dudmesghashlimit: éviter bruteforce
mangle table
# 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