meta données pour cette page
Filtrage réseau avec Iptables
Iptables sert à gérer les requêtes clientes qui dialogue avec la machine. Le projet est disponible à chez Netfilter.
Documentation
Les fichiers de configuration se situe dans :
/proc/sys/net/
N'oublions pas les bonnes méthodes de sauvegarde :
iptables-save > backup.txt iptables-restaure < backup.txt
Le pare-feu est couramment en amont d'un réseau privé dont-il contient de nombreuses règles. Pour éviter de se perdre, il est recommandé de ce concevoir un tableau à double dimensions répertoriant tous les flux de communications entre les serveurs sans oublier les voies de retour.
Syntaxe de base
iptables <commande> <chaîne> <type> <critères> <action>
Commandes :
- -L –line-numbers : liste les règles avec leur numéro
- -A : Ajouter une règle
- -R : Remplacer une règle (en se basant par rapport au numéro de la règle)
- -I n : Ajouter une règle avant n
- -D n : Supprime une règle avec son numéro
- -F : Remise à zéro de la table
- -S : Présente les règles sous forme d'arguments
Chaînes :
- -N : Créer une chaîne
- -X : Détruit une chaîne
- -E : Renomme une chaîne
Type :
- INPUT : Concernera les paquets destiné au système
- OUPUT : Concernera les paquets sortant du système
- FORWARD : Concerne les paquets à rediriger vers un autre système présent sur le réseau
Critères :
- -p <tcp/udp/icmp> : Type de protocole
- -dsport <numero_port>: Port source
- -dport <numero_port> : Port destination
- -i <interface> : Interface source
- -o <interface> : Interface destination
- -s <ip/cidr> : IP source
- -d <ip/cidr> : IP destination
- –mac-source <adresse-mac> : adresse MAC source
- -m state <NEW/ESTABLISHED/RELATED/INVALID> : En fonction de l'état de la connexion
Action :
- -j DROP : Ignore le paquet
- -j REJECT : Ignore le paquet, et prévient l'émetteur
- -j ACCEPT : Accepte la paquet
- -j RETURN : Reviens à la chaîne mère (?)
- -j REDIRECT : Redirige le paquet vers le port du système en local. Pas de retransmission possible à une machine tierce!
- -j LOG : Enregistre dans /var/log/kern.log les infos de la requête
Autoriser le dialogue client-server
Les commandes ci-dessous sont courante sur un routeur. On prend l'exemple pour une connexion à un serveur SSH:
iptables -A FORWARD --m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -p tcp -s <ip_source> -d <ip_destination> --dport 22 --syn -m state --state NEW -j ACCEPT
ou :
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
On n'oublie pas d'activer le routage :
echo 1 > /proc/sys/net/ipv4/ip_forward
Les commandes ci-dessous sont utilisé lors d'une communication directe au serveur:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp -s <ip_source> -d <ip_destination> --dport 22 --syn -m state --state NEW -j ACCEPT
Bloquer un port
iptables -D INPUT -i eth0 -p tcp --dport 80 -j DROP
On utilise ici -D car par défaut on bloque toutes les requêtes.
Bloquer une IP ou un range d'IPs
iptables -A INPUT -s 192.168.0.1 -j DROP iptables -A INPUT --src-range 192.168.1.90-192.168.1.101 -j DROP
Bloquer un protocole
iptables -D INPUT -i eth1 -p icmp -j DROP
On utilise ici -D car par défaut on bloque toutes les requêtes.
Équilibrage de charge
iptables -t nat -A PREROUTING -p tcp --dport 80 -i <interface_local?> -j DNAT --to 192.168.2.2 192.168.2.3
Exemple de configuration de base
- On interdit tout par défaut
iptables -P FORWARD DROP iptables -P OUTPUT DROP iptables -P INPUT DROP
- On accepte les réponses aux requêtes envoyés aux serveurs
iptables -A FORWARD -m state --state ESTABLISHED, RELATED -j ACCEPT
- On autorise la communication au serveur 10.0.0.5 avec le réseau logique 192.168.1.0/24
iptables -A FORWARD -m tcp -p tcp -s 192.168.1.0/24 -d 10.0.0.5 --dport 25 -m state --state NEW --syn -j ACCEPT
- On met du NAT vers le serveur 10.0.0.5 avec le port 25 en écoute
iptables -t nat -A PREROUTING -d 192.168.10.1 -m tcp -p tcp --dport 25 -j DNAT --to-destination 10.0.0.5
Sinon :
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Exemple de configuration de base 2
sudo iptables -A INPUT -m state ESTABLISHED -j ACCEPT sudo iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT sudo iptables -A INPUT -j LOG logprefix "iptables denied: " loglevel 7 sudo iptables -P INPUT DROP
Liste de diverses commandes
# pour autoriser local->destination:143 iptables -A INPUT -p tcp --sport 143 -j ACCEPT
Bloquer des IPs par pays
1. Télécharger la plage d'IPs au format CIDR : https://www.ip2location.com/free/visitor-blocker
2. L'envoyer sur le serveur en excluant les commentaires et en mettant au format iptable:
for i in $( cat firewall-pays1.txt |grep -v "#" ) ; do echo "-A INPUT -s $i -j DROP "; done >> /root/iptable.save for i in $( cat firewall-pays2.txt |grep -v "#" ) ; do echo "-A INPUT -s $i -j DROP "; done >> /root/iptable.save
3. Déplacer les argupments COMMIT au bon endroit dans le fichier puis charger la configuration :
iptables-restore < /root/iptable.save
Analyser les logs
Pour cela, il faut utiliser ce paquet : fwlogwatch