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
:
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
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
:
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
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 -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 |
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ègleslimit
etconn
: limiter nombre de connexions sur des serviceslimit
etburst
: système de jeton et d’autorisationlog
: logger un trafique sur dudmesg
hashlimit
: é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