Outils pour utilisateurs

Outils du site


linux:iptables

IPTABLES : Firewall logiciel

Iptables est un logiciel libre de l'espace utilisateur Linux grâce auquel l'administrateur système peut configurer les chaînes et règles dans le pare-feu en espace noyau (et qui est composé par des modules Netfilter).

Netfilter est une architecture de filtrage de paquet pour les noyaux Linux. Il n’inspecte que les en-têtes des paquets ce qui le rend très rapide et ne génère pas de latence.

NETFILTER

Le fontionnement de IPTABLES

Comportement

Lorsqu'une trame arrive sur le host firewall, IPTABLES consulte les règles pour vérifier si l'une d'entre elles peut s'appliquer. Lorsque c'est le cas, la règle est appliquée et IPTABLES cesse la consultation.

Ordre des règles est donc primordial en cas de règles contradictoires.

Enfin si aucune règle précise n'est définit, ce sera la POLICY par défaut qui s'applique (DROP ou ACCEPT).

Schéma logique

Schéma fonctionnement IPTABLES

Suivi de l'état des connexions

Netfilter est un firewall avec état (statefull), il dispose des modules (conntrack) qui interprètent ces informations afin de déterminer l'état de connexion de chaque paquet.
L'option –state permet de préciser les états dans la définition des règles.


Les différents états possibles :

  • NEW : établissement de connexion du client vers le serveur.
  • ESTABLISHED : réponse du serveur à une demande de connexion du client.
  • RELATED : connexion relative à une connexion précédemment établie.
  • INVALID : signifie que le paquet ne peut pas être identifié ou aucun état connu.


Syntaxe de IPTABLES

iptables   <table>   <commande>   <paramètres>   <cible>

Les tables


Les différentes tables :

  • filter : table par défaut
  • nat : translation d'addresse et/ou ports
  • mangle : modifier les en-têtes des paquets ou marquer les paquets


Les commandes d'administration de IPTABLES

-A –apend ajoute la règle
-D –delete supprime une règle
-R –replace remplace la règle spécifié
-I –insert insère une règle dans un endroit spécifié
-L –list affiche les règles
-F –flush vide toutes les règles
-N –new-chain créé une nouvelle chaîne
-X –delete-chain supprime une chaîne
-P -policy spécifie la valeur de la cible par défaut de la chaîne
  • Consulter les tables :

iptables -L

  • Consulter les tables NAT :

iptables -t nat -L

  • Vider les tables :

iptables -F

  • Vider les tables NAT :

iptables -t nat -F

  • Script pour une default POLICY en ACCEPT :

#!/bin/bash
iptables -F
iptables -t nat -F 
iptables -t nat -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
echo "IPTABLES DEFAULT POLICY ACCEPT : OK"
exit 0

  • Script pour une default POLICY en DROP :

#!/bin/bash
iptables -F
iptables -t nat -F
iptables -t nat -X 
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
echo "IPTABLES DEFAULT POLICY DROP : OK"
exit 0

Les chaînes pré-définies

CHAINE TABLE DESCRIPTION
PREROUTING nat, mangle Chaîne passeront les paquets entrants dans la mchien avant routage
INPUT filter, mangle Chaîne traitant les paquets entrant avant les couches supérieurs (applications)
FORWARD filter, nat, mangle Paquets transmis par la machine sans que les applications n'en aient connaissance
OUTPUT filter, nat , mangle Chaîne appelée par les paquets envoyés par des programmes présents sur la machine
POSTROUTING nat, mangle Paquets prêts à être envoyés (transmis ou générés)

Les paramètres

-p –protocol tcp, udp, icmp, all ou N° de protocole /etc/protocols
-s –source adresse IP ou réseau
-d –destination adresse IP ou réseau
-j –jump cible sans la cible, la règle n'est pas prise en compte
-i –in-interface nom de l'interface qui reçoit les paquets
-o –out-interface nom de l'interface qui envoit les paquets
! inverse ce signe inverse le test

Les cibles

ACCEPT laisse poursuivre le cheminement des paquets
DROP supprime les paquets sans message de retour (aucune trace)
LOG permet la journalisation (/var/log/syslog par défaut)
REJECT comme DROP mais envoie une réponse de refus
SNAT modifie l'IP de l'émetteur par la valeur spécifiée ( -j SNAT –to-source IP:PORT)
DNAT remplace l'IP du destinataire par la valeur spécifiée ( -j DNAT –to-destination IP:PORT)
MASQUERADE demande à netfilter de remplacer l'IP par son interface de sortie

Activer le NAT FTP derrière un firewall en ACTIF

Installer l'utilitaire conntrack et charger les modules indispensables sur le serveur firewall:

  • Installer conntrack :

aptitude install conntrack

  • Charger le module conntrack_ftp pour FTP actif :

modprobe ip_conntrack_ftp

  • Charger le module nat_ftp si la passerelle fait du NAT:

modprobe ip_nat_ftp

  • Visualiser les flux avec leurs états :

conntrack -E

Analyse avec conntrack

Exemple de configuration

Ce script a été réalisé dans le cadre d'une simluation de réseau d'entreprise.

  • Le réseau LAN : 192.168.0.0/24
  • Le réseau DMZ : 192.168.1.0/24
  • Le serveur Firewall : SRV-FW (routeur/pare-feu)

De multiples services sont installés, certains en failover ce qui justifie le nombre de règles.

#!/bin/bash

#VIDER LES TABLES PRECEDENTES
iptables -F
echo "Vidange des Tables : OK"

#AUTORISER LOOPBACK
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
echo "LOOPBACK : OK"

# PING ACCES LAN-FW
iptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.254 -p icmp -j ACCEPT
iptables -A OUTPUT -o eth0 -s 192.168.0.254 -d 192.168.0.0/24 -p icmp -j ACCEPT
# PING FORWARD LAN-INTERNET
iptables -A FORWARD -i eth0 -o eth1 -s 192.168.0.0/24 -p icmp -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -d 192.168.0.0/24 -p icmp -j ACCEPT
# PING REJECT INTERNET-FW
iptables -A INPUT -i eth1 -p icmp -j REJECT
# PING REJECT DMZ-FW
iptables -A INPUT -i eth2 -s 192.168.1.0/24 -d 192.168.1.254 -p icmp -j REJECT
iptables -A INPUT -i eth2 -s 192.168.1.0/24 -d 192.168.0.254 -p icmp -j REJECT
iptables -A INPUT -i eth2 -s 192.168.1.0/24 -d 88.44.22.13 -p icmp -j REJECT

# PING LAN-DMZ DMZ-LAN
iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p icmp -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -s 192.168.1.1 -d 192.168.0.0/24 -p icmp -j ACCEPT
echo "ICMP ALL EXCEPT SRV-FW FROM DMZ/INTERNET : OK"

# SSH ACCES LAN-FW
iptables -A INPUT -i eth0 -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT
echo "SSH LAN-FW : OK"

# SSH FORWARD LAN-DMZ
iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -s 192.168.1.1 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT
echo "SSH LAN-DMZ : OK"

# SQUID ACCES LAN-FW
iptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.254 -p tcp --dport 3128 -j ACCEPT
iptables -A OUTPUT -o eth0 -s 192.168.0.254 -d 192.168.0.0/24 -p tcp --sport 3128 -j ACCEPT
echo "SQUID LAN-FW : OK"

# SQUID ACCES DMZ-FW
iptables -A INPUT -i eth2 -s 192.168.1.0/24 -d 192.168.1.254 -p tcp --dport 3128 -j ACCEPT
iptables -A OUTPUT -o eth2 -s 192.168.1.254 -d 192.168.1.0/24 -p tcp --sport 3128 -j ACCEPT
echo "SQUID DMZ-FW : OK"

# DNS ACCES LAN-FW
iptables -A INPUT -i eth0 -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
echo "DNS LAN-FW : OK"

# DNS FORWARD LAN-DMZ
iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -s 192.168.1.1 -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
echo "DNS LAN-DMZ : OK"

# NTP ACCES LAN-FW
iptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.254 -p udp --dport 123 -j ACCEPT
iptables -A OUTPUT -o eth0 -s 192.168.0.254 -d 192.168.0.0/24 -p udp --sport 123 -j ACCEPT
echo "NTP LAN-FW : OK"

# NTP ACCES DMZ-FW
iptables -A INPUT -i eth2 -s 192.168.1.1 -d 192.168.1.254 -p udp --dport 123 -j ACCEPT
iptables -A OUTPUT -o eth2 -s 192.168.1.254 -d 192.168.1.1 -p udp --sport 123 -j ACCEPT
echo "NTP DMZ-FW : OK"

# DHCP FORWARD LAN-DMZ
iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p udp --sport 68 --dport 67 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -s 192.168.1.1 -d 192.168.0.0/24 -p udp --sport 67 --dport 68 -j ACCEPT
echo "DHCP LAN-DMZ : OK"

# AUTORISER LE PAT EN SORTIE SUR INTERFACE PUBLIQUE
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
echo "NAT ALL-INTERNET : OK"

# DNS ACCES FW-DNS_FAI
iptables -A OUTPUT -o eth1 -s 88.44.22.13 -d 66.55.44.33 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth1 -s 66.55.44.33 -d 88.44.22.13 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
echo "DNS FW-INTERNET : OK"

# HTTP(s) ACCES FW-INTERNET
iptables -A OUTPUT -o eth1 -s 88.44.22.13 -p tcp -m multiport --dport 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth1 -d 88.44.22.13 -p tcp -m multiport --sport 80,443 -m state --state ESTABLISHED -j ACCEPT
echo "HTTP(s) FW-INTERNET : OK"

# HTTP(s) ACCES FW-DMZ
iptables -A OUTPUT -o eth2 -s 192.168.1.254 -p tcp -m multiport --dport 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth2 -d 192.168.1.254 -p tcp -m multiport --sport 80,443 -m state --state ESTABLISHED -j ACCEPT
echo "HTTP(s) FW-DMZ : OK"

# NTP ACCES FW-INTERNET
iptables -A INPUT -i eth1 -d 88.44.22.13 -p udp --dport 123 -j ACCEPT
iptables -A OUTPUT -o eth1 -s 88.44.22.13 -p udp --dport 123 -j ACCEPT
echo "NTP FW-INTERNET : OK"

# le PAT IP_PUBLIQUE-DMZ:80
iptables -t nat -A PREROUTING -d 88.44.22.13 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1:80
# HTTP FORWARD INTERNET-DMZ
iptables -A FORWARD -i eth1 -o eth2 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2 -o eth1 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
echo "NAT INTERNET WEB-DMZ : OK"

# ACCES DMZ VERS INTERNET
#iptables -A INPUT -i eth2 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth2 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
#echo "DNS DMZ-INTERNET : OK"

# DNS FW-DMZ
iptables -A OUTPUT -o eth2 -s 192.168.1.0/24 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth2 -s 192.168.1.0/24 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
echo "DNS FW-DMZ : OK"

# DNS TRANSFERT FW-DMZ
iptables -A OUTPUT -o eth2 -d 192.168.1.0/24 -p tcp --sport 1024:65535 --dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -s 192.168.1.0 -p tcp --sport 53 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth2 -d 192.168.1.1 -p tcp --dport 1024:65535 --sport 53 -j ACCEPT
iptables -A INPUT -i eth2 -d 192.168.1.254 -p tcp --sport 1024:65535 --dport 53 -j ACCEPT
echo "DNS TRANSFERT FW-DMZ : OK"

# NIS YPSERV FORWARD LAN-DMZ
iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p tcp --dport 834 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p tcp --sport 834 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p udp --dport 834 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p udp --sport 834 -j ACCEPT
echo "NIS YPSERV LAN-DMZ : OK"

# NIS YPBIND FORWARD LAN-DMZ
iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p tcp --dport 835 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p tcp --sport 835 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p udp --dport 835 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p udp --sport 835 -j ACCEPT
echo "NIS YPBIND LAN-DMZ : OK"

# NIS PORTMAPPER FORWARD LAN-DMZ
iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p udp --dport 111 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p udp --sport 111 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p tcp --dport 111 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p tcp --sport 111 -j ACCEPT
echo "NIS PORTMAPPER LAN-DMZ : OK"

# FTP FORWARD LAN-DMZ
iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p tcp --dport 20 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p tcp --sport 20 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
echo "FTP LAN-DMZ : OK"
exit 0

Configuration règle IPTABLES sur DNSAlias

IPTABLES n'interroge pas DNS. Il résout uniquement en terme IP.

  • Astuce pour récupérer L'IP d'un enregistrement DNSAlias :

vi /root/script/firewall
# Recupere IP dynamique
IP_DYNAMIQUE=$(ping -c1 truc.dyndnslias.com | grep time | head -1 | cut -d"(" -f2 | cut -d")" -f1)

# La regle IPTABLE avec l'IP contenue dans une variable
iptables -t filter -A INPUT -p tcp -s $IP_DYNAMIQUE --dport 22 -j ACCEPT

linux/iptables.txt · Dernière modification: 15/04/2016 à 21:15 (modification externe)

Outils de la page