Sécuriser un réseau d’entreprise avec Iptables
Iptables est un logiciel incoutournable pour les administrateurs systèmes/réseaux.
En effet, livré en standard dans toutes les distributions linux, c’est un firewall très complet, fiable, et dispose d’énormement d’options qui permettent un filtrage très fin.
Il permet par exemple de faire du firewalling , de la translation de port et d’adresse, du filtrage au niveau 2 , du “Mangle”…
Présentation
1) les tables:
Trois tables servant à contenir des règles de filtrage sont disponibles:
- La table FILTER:
C’est la table par défaut lorsque l’on en spécifie pas.
Cette table contient toutes les règles de filtrage, il existe 3 types de chaînes : FORWARD pour les paquets passant par le firewall, INPUT pour les paquets entrant et OUTPUT pour les paquets sortants. Les cibles disponibles sont : ACCEPT, DENY, DROP, REJECT °.
- La table NAT(Network Adress Translation):
Cette table permet d’effectuer toutes les translations d’adresses nécessaires.
Elle contient trois chaine:
° La chaîne PREROUTING:
Permet de faire de la translation d’adresse de destination. Cette méthode est utilisé si l’on veut cacher son réseau local, comme par exemple faire croire qu’il y a un serveur WEB sur le port 80 directement sur le net, alors que celui-ci est hébergé par un hôte du réseau privé sur un autre port.
° La chaîne POSTROUTING:
Elle permet de faire de la translation d’adresse de la source, comme du masquage d’adresse.La méthode standard pour partager une connexion Internet.
° La chaîne OUTPUT:
Celle-ci va permettre de modifier la destination de paquets générés localement.
- La table MANGLE:
Cette table permet le marquage des paquets entrants (PREROUTING) et générés localement (OUTPUT). Le marquage de paquets va permettre un traitement spécifique des paquets marqués dans les tables de routage avec IPROUTE 2.
2) les chaînes:
Une chaîne est une suite de règles qui sont prises dans l’ordre. Ces chaînes vont permettre d’identifier des paquets qui correspondent à certains critères.
3) les cibles:
Les cibles enfin sont des sortes d’aiguillage qui dirigeront les paquets satisfaisant aux critères . Les cibles préconstruites sont :
° ACCEPT
Les paquets qui satisfont aux critères sont acceptés.
° DROP
Les paquets qui satisfont aux critères sont rejetés, on les oublie, on n’envoie même pas de message ICMP .
° LOG
C’est une cible particulière qui permet de tracer au moyen de syslog les paquets qui satisfont aux critères.
exemples:LOG_ACCEPT, LOG_DROP
Suivant les contextes, d’autres cibles deviennent accessibles, comme REJECT, ALLOW, DENIED, REDIRECT…
Les commandes
-A –append : Ajoute la règle à la fin de la chaîne spécifiée
Exemple de code:
iptables -A INPUT
-D –delete : Permet de supprimer une chaîne. On peut l’utiliser de 2 manières, soit en spécifiant le numéros de la chaîne a supprimer, soit en spécifiant la règle à retirer.
Exemples de code :
iptables -D INPUT --dport 25 -j DROP
iptables -D INPUT 1
-R –replace : Permet de remplacer la chaîne spécifiée.
Exemple :
iptables -R INPUT 1 -s 192.168.11.200-j DROP
-I –insert : Permet d’ajouter une chaîne dans un endroit spécifié de la chaîne.
Exemple :
iptables -I INPUT 1 --dport 143 -j ACCEPT
-L –list : Permet d’afficher les règles.
Exemples :
iptables -L # Affiche toutes les règles des chaînes de FILTER
iptables -L INPUT # Affiche toutes les règles de INPUT (FILTER)
-F –flush : Permet de vider toutes les règles d’une chaîne.
Vider toute les règles OUTPUT:
iptables -F OUTPUT
-N –new-chain : Permet de créer une nouvelle chaîne.
Exemple :
iptables -N LOG_ACCEPT
-X –delete-chain : Permet d’effacer une chaîne.
Exemple :
iptables -X LOG_DROP
-P –policy : Permet de spécifier au noyau la politique par défaut d’une chaîne DENY, ACCEPT, REJECT, DROP …
Exemple :
iptables -P INPUT DROP
Commandes pour matcher
Le symbole “!” est utilisé pour spécifier le contraire.
Par exemple, on peut ainsi “blacklister” une ip:
iptables -A INPUT -p tcp --source ! 192.168.1.65 -j ACCEPT
-j (jump) : Défini l’action à prendre si un paquet répond aux critères de cette règle: ACCEPT, LOG, DROP…
Exemple :
iptables -A INPUT -p udp -j DROP
-p –protocol : Spécifier un protocole : tcp, udp, icmp, all (tous)
Exemple :
# iptables -A INPUT -p tcp -j ACCCEPT
-s –source : Spécifier une adresse source à matcher
Exemple :
iptables -A INPUT -p tcp -s 192.168.42.42 -j ACCEPT
-d –destination : Spécifier une adresse destination
Exemple :
iptables -A FORWARD -p tcp -d 10.1.0.1 -j ACCEPT
-i –in-interface : Spécifier une interface d’entrée
Exemple :
iptables -A INPUT -p tcp -i eth1 -j DROP
-o –out-interface : Spécifier une interface de sortie
Exemple :
iptables -A OUTPUT -p icmp -o eth1 -j DROP
-f –fragment : Paquet fragmenté
Exemple :
iptables -A INPUT -p icmp -f -j DROP
–sport –source-port : Spécifier le port source ou une plage de ports, fonctionne aussi en udp, -m multiport permet de
spécifier plusieurs ports à matcher.
Exemples :
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p udp --sport 80 -j DROP
iptables -A OUTPUT -p tcp -m multiport --sport 3128,21,1000 -j DROP
iptables -A OUTPUT -p tcp --sport 1024:2042 -j ACCEPT
–dport –destination-port : Spécifier le port destination ou une plage de ports, fonctionne aussi en udp, -m multiport
permet de spécifier plusieurs ports a matcher.
Exemples :
iptables -A INPUT -p tcp --dport 110 -j DROP
iptables -A INPUT -p udp --dport 110 -j DROP
iptables -A INPUT -p tcp -m multiport --dport 110,4242,119 -j DROP
iptables -A INPUT -p tcp --sport 4925:4633 -j ACCEPT
–tcp-flags : Spécifier un flag tcp à matcher : SYN ACK FIN RST URG PSH ALL NONE
Exemple :
iptables -A INPUT -p tcp --dport 42 --tcp-flags SYN,ACK -j ACCEPT
–icmp-type : Spécifier un type de paquet icmp à matcher
Exemple :
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
–mac-source : Spécifier l’adresse MAC à matcher
Exemple :
iptables -A INPUT --mac-source 42.42.AA.42.42.AA -j DROP
En cas d’erreur, il peut-être nécessaire de spécifier le module mac, exemple :
iptables -A INPUT -m mac --mac-source 42.42.AA.42.42.AA -j DROP
–state : Permet de spécifier l’état du paquet à matcher parmi les états suivants :
ESTABLISHED : paquet associé à une connexion déjà établie
NEW : paquet demandant une nouvelle connexion
INVALID : paquet associé à une connexion inconnue
RELATED : Nouvelle connexion mais liée, idéal pour les connexions FTP
Exemples :
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Le NAT
–to-destination : Utilisé en target pour le DNAT, permet de spécifier l’adresse de destination de la translation, on peut également spécifier un port s’il est différent du port source.
Exemples :# iptables -t nat -A PREROUTING -d ! 91.1254 port 82-j DNAT –to-destination 192.168.2.1:110
iptables -t nat -A PREROUTING -d ! 91.125.21.54 –tcp –dport 80 -j DNAT –to-destination 192.168.2.1:8080
–to-source : Utilisé pour en target pour le SNAT, permet de spécifier l’adresse source de la translation.
Les logs:
–log-level : Level, niveau de log
–log-prefix : Permet de spécifier un préfixe pour les logs.
Enfin, maintenant que nous avons tous les éléments, nous pouvons donc faire un script:
#!/bin/sh
#activation du routage
echo 1 > /proc/sys/net/ipv4/ip_forward
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ] ; then
for filtre in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo 1 > $filtre
done
fi
#on veut pas de ping
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
#on vide toute les regles
iptables -F
iptables -X
#Activation des logs
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix ' [IPTABLES DROP] : '
iptables -A LOG_DROP -j DROP
iptables -N LOG_ACCEPT
iptables -A LOG_ACCEPT -j LOG --log-prefix ' [IPTABLES ACCEPT] '
#par défaut, on interdit tout.
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#on accepte tout sur l'interface locale
iptables -A INPUT -i lo -j ACCEPT
#on accepte tout en sortie
iptables -A OUTPUT -o lo -j ACCEPT
#on accepte tout sur le réseau local
iptables -A INPUT -i eth1 -j ACCEPT
# on cache les machines du LAN
iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE
#on accepte le ssh
iptables -A INPUT -i eth0 -m state --state NEW,ESTABLISHED -p tcp --dport 22 -j ACCEPT
#on accepte la resolution DNS
iptables -A INPUT -i eth0 -m state --state NEW,ESTABLISHED -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -m state --state NEW,ESTABLISHED -p udp --dport 53 -j ACCEPT
#On accede au web
iptables -A INPUT -i eth0 --protocol tcp --source-port 80 -j ACCEPT
#NAT
#si on a un serveur web sur le réseau local
iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 80 -j DNAT --to 192.168.5.10
#si on a un serveur smtp
iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 25j DNAT --to 192.168.5.11
Tags :firewall, iptables, linux, open source





