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
Iptable n'a pas de fichier de configuration car tout est chargé est mémoire. De ce fait, n'oubliez pas de faire une sauvegarde régulière de la configuration au risque de la perdre lors d'un reboot.

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 ­­log­prefix "iptables denied: " ­­log­level 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