Configuration d'iptables pour DMZ
Configuration d'iptables pour DMZ
Cet article présente de façon pratique la mise en place d'un pare-feu (en anglais, firewall) ou
d'un proxy sur une machine GNU/Linux tournant au minimum avec un noyau 2.4.
Pour des informations plus théoriques sur les pare-feux et les proxys, vous pouvez lire l'article
pare-feu.
Présentation d'iptables
iptables est une solution complète de pare-feu pour le système GNU/Linux depuis le noyau
2.4, remplaçant ipchains, le pare-feu du noyau 2.2. iptables permet de faire du firewalling à
états (stateful), de la translation de port et d'adresse, du filtrage au niveau 2 et beaucoup
d'autres choses que nous n'allons pas aborder comme le « mangle » ou modification des
paquets à la volée (atchoum).
iptables est fiable et dispose de très nombreuses options qui permettent de faire du filtrage très
fin.
Précisons dès maintenant que le module qui fournit au noyau Linux les fonctions de pare-feu,
de partage de connexions internet (NAT) et d'historisation du trafic réseau s'appelle Netfilter.
iptables est en fait juste l'outil qui permet à un administrateur de configurer Netfilter en mode
utilisateur.
Licence d'iptables
1/ Installation
1.1/ Prérequis
iptables est installé en standard sur de nombreuses distributions GNU/Linux récentes (kernel
2.4.x. ou supérieur).
iptables a besoin au minimum d'un noyau 2.4 compilé avec des options spéciales. Ceci ne
pose pas de problèmes avec les noyaux génériques des principales distributions : tout a déjà
été fait pour vous.
Si vous désirez re-compiler votre kernel, il faut spécifier les options nécessaires au
fonctionnement d'iptables.
Les options suivantes doivent êtres activées en module (M) ou dans le kernel (Y) :
CONFIG_PACKET
CONFIG_NETFILTER
CONFIG_IP_NF_CONNTRACK
CONFIG_IP_NF_FTP
CONFIG_IP_NF_IRC
CONFIG_IP_NF_IPTABLES
CONFIG_IP_NF_FILTER
CONFIG_IP_NF_NAT
CONFIG_IP_NF_MATCH_STATE
CONFIG_IP_NF_TARGET_LOG
CONFIG_IP_NF_MATCH_LIMIT
CONFIG_IP_NF_TARGET_MASQUERADE
et éventuellement :
1.3/ Installation
Notons que sur les versions inférieures a Red Hat 7.1, il faut compiler un noyau 2.4 car
iptables ne supporte pas les noyaux 2.2.x. La compilation de iptables est complexe. Le mieux
est de lire le fichier INSTALL du package des sources.
Dans le cas ou les options iptables du noyau ont été compilées en modules, il est nécessaire de
charger ces modules avant de pouvoir utiliser iptables :
# modprobe ip_tables
# modprobe ip_nat_ftp
# modprobe ip_nat_irc
# modprobe iptable_filter
# modprobe iptable_mangle
# modprobe iptable_nat
Si on a besoin de pouvoir rediriger (forward) les paquets IP arrivant sur un interface réseau
(connectée par exemple à Internet) vers une autre interface réseau (connectée par exemple au
réseau local), il sera nécessaire, dans la plupart des cas, d'exécuter cette commande :
# echo 1 > /proc/sys/net/ipv4/ip_forward
Nota bene : tous les modprobe semblent inutiles car le kernel les charge automatiquement si
l'on se sert de l'une des fonctionnalités d'iptables.
2/ Présentation
2.1/ Les tables
A noter : Les règles sont évaluées dans l'ordre, par défaut la table FILTER est vide et donc
accepte tout. Aucune règle de translation d'adresse n'est présente par défaut.
#
chaîne
une chaîne est une suite de règles, qui sont prises dans l'ordre ; dès qu'une règle
s'applique à un paquet, elle est déclenchée, et la suite de la chaîne est ignorée.
* SNAT
Permet de modifier l'adresse source du paquet.
* DNAT
Permet de modifier l'adresse destination du paquet.
* MASQUERADE
Une passerelle (gateway) transforme les paquets sortants passant par elle pour donner
l'illusion qu'ils sortent de la passerelle elle-même par un port alloué dynamiquement ;
lorsque la passerelle recoit une réponse sur ce port, elle utilise une table de
correspondance entre le port et les machines du réseau privé qu'elle gère pour lui faire
suivre le paquet.
° policy ACCEPT
Permet d'accepter un paquet grâce à la règle vérifiée.
° policy DROP
Rejet d'un paquet sans message d'erreur si la règle est vérifiée ("non ! j'en veux pas
mais je dis rien à l'expediteur").
° policy REJECT
Rejet avec un retour de paquet d'erreur à l'expediteur si la règle est verifiée ("un
paquet recommandé de La Poste refusé par son destinataire").
° policy LOG
Affiche le résultat vers la sortie standard.
Peut être associé a un préfixe pour une meilleure lisibilité (un préfixe pour les paquets
rejetes,un autre pour les paquets forwardés etc...).
Exemple : -j LOG --log-prefix '[IPTABLES DROP] : '
iptables n'est pas livré avec une interface graphique par défaut ; les commandes et les règles
sont généralement passées en ligne de commande. Le mieux est d'écrire des scripts (à rajouter
dans /etc/rc.d/init.d) qui permettent d'appliquer toutes les règles d'un seul coup, dès le
démarrage de GNU/Linux.
-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
Remarques :
Le "!" peut être utilisé pour certaines commandes afin de spécifier le contraire (on peut le
traduire par "sauf"). Par exemple une commande qui doit refuser tout trafic TCP sauf ce qui
provient de l'adresse IP [Link] sera traduite par la commande suivante :
Exemple :
# iptables -A INPUT -p tcp --source ! [Link] -j DROP
Les adresses IP peuvent optionnellement être spécifiées avec le masque associé sous la forme
[adresse ip]/[masque].
-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 icmp -j DROP
--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
--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
Spécificités NAT :
Les exemples qui suivent supposent que vous êtes reliés à internet par modem via l'interface
ppp0 (mais en remplaçant ppp0 par eth0 - par exemple, on peut adapter les exemples pour
d'autres type de liaisons) et que votre réseau local est [Link]/24 (classe C).
Pour fixer les politiques par défaut (cad: ce qui se passe quand aucune règle ne
correspond - ne matche pas), ici, on refuse tout (normal, on fait un pare-feu, oui ou
non ?) :
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix '[IPTABLES DROP] : '
iptables -A LOG_DROP -j DROP
Enfin (pour loguer le trafic autorisé), recommencer en remplaçant -j DROP, par -j ACCEPT et
a la place de -j LOG_DROP il faut mettre -j LOG_ACCEPT
Pour accepter tout ce qui se passe sur l'interface lo (sinon ce n'est pas la peine
d'activer le réseau !) :
La première ligne pour accepter ce qui entre sur notre interface ppp0 sur le port 80 (le
port http) si c'est une connexion déjà établie, la seconde pour accepter ce qui sort sur
ppp0 sur le port 80 si c'est une nouvelle connexion ou si c'est une connexion déjà
établie.
Pour autoriser le ssh, il faut préciser le port 22; pour autoriser l'irc, le port 6667 (ou celui que
vous utilisez pour vous connecter à votre serveur); pour le smtp (envoi d'emails), le port 25;
pour le pop3 (réception d'emails), le port 110; pour le imap (réception d'emails), les ports 143
et 220 (imap3) ; pour le cvs, le port 2401 ; pour le https, le port 443. De manière générale, le
numéros de port se trouvent dans /etc/services.
Pour le ftp c'est un peu plus complexe. D'abord, il faut charger le module :
ip_conntrack_ftp (c'est lui qui suit - track en anglais - les connexions ftp) et, si vous
natez (en utilisant le masquerading par exemple) vos connexions ftp vers d'autres
postes le module : ip_nat_ftp :
modprobe ip_conntrack_ftp
# éventuellement : modprobe ip_nat_ftp
Cela pour que la connexion puisse s'établir. Ensuite (et c'est la qu'on a besoin de
ip_conntrack_ftp) :
Pour que serveur puisse établir la connexion pour les données (en mode actif). Et
enfin :
Pour que le serveur puisse établir la connexion pour les données (en mode passif). Ici
aussi ip_conntrack_ftp est nécessaire.
Pour partager une connexion, il faut que le forwarding soit activé dans le noyau
(echo 1 > /proc/sys/net/ipv4/ip_forward), puis il faut autoriser iptable à faire
le forwarding :
iptables -F FORWARD
iptables -A FORWARD -j ACCEPT
Sur chaque machine devant être cachée par le pare-feu (ou devant partager la
connexion avec la machine qui est connectée à internet), il faut ajouter une route par
defaut :
/etc/sysconfig/network
et d'ajouter dedans :
GATEWAY=[Link]
Pour cet exemple, le pare-feu aura la connexion à Internet (interface eth2) et disposera de 2
pattes sur des réseaux privés (eth0 et eth1) :
il fait office de proxy sur le port 3128 pour un réseau qui aura ainsi un accès internet
et une DMZ* ("zone démilitarisée") sur laquelle il y a un ensemble de serveurs
disponibles de l'extérieur dont un serveur web qui a pour adresse [Link] écoutant
sur le port 80 en TCP.
À noter que dans de nombreuses distributions, ce script existe déjà. Ainsi, sous Red Hat et
Fedora, il s'appelle /etc/init.d/iptables. Le service associé s'appelle iptables et
lorsqu'il est actif, il utilise les règles définies dans le fichier /etc/sysconfig/iptables.
Go !
Fichier de chargement /etc/init.d/firewall :
#!/bin/bash
#
# Lancement du script de pare-feu
# Arnaud de Bermingham
. /etc/init.d/functions
RETVAL=0
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
/sbin/iptables -L
/sbin/iptables -t nat -L
RETVAL=0
;;
*)
echo "Usage: firewall {start|stop|restart|status}"
RETVAL=1
esac
exit
Et maintenant : /etc/flush_iptables.sh.
#!/bin/sh
#
# Script pour vider les règles iptables
# Arnaud de Bermingham
# duracell@[Link]
#
# On remet la police par défaut à ACCEPT
#
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
#
# On remet les polices par défaut pour la table NAT
#
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
#
# On vide (flush) toutes les règles existantes
#
iptables -F
iptables -t nat -F
#
# Et enfin, on efface toutes les chaînes qui ne
# sont pas à defaut dans la table filter et nat
iptables -X
iptables -t nat -X
# Message de fin
echo " [termine]"
3.3/ Les prérequis pour le script du pare-feu et création des tables pour les logs
#!/bin/sh
# script /etc/[Link]
# Activation du forwarding
# C'est pas pour faire joli, on aura des règles
# de forward et il faut bien que les paquets
# traversent la machine, donc on met ce fichier à 1
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
# pas de icmp
modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe iptable_filter
modprobe iptable_nat
iptables -F
iptables -X
Ceci était bien évidemment un exemple, vous pouvez dès à présent préparer votre propre
pare-feu personnalisé !
Vous pouvez l'adapter à vos besoins, votre connexion vers internet (par ADSL par exemple),
etc.
[Link] disabled
Si vous voyez enable, c'est que votre pare-feu est bien activé.
Et pour l'activer :
# chkconfig iptables on
Sous Ubuntu et Debian, c'est la commande iptables-persistent qui gère les règles iptables
au démarrage, avec comme argument save pour sauvegarder les règles, flush pour les vider
et reload pour les recharger, tout cela en se basant sur le fichier /etc/iptables/rules.v4
(resp. v6 pour IPv6).
Autres ressources
Le partage de connexion facile.
Cliquez sur 'ShieldsUP!', puis sur l'un des boutons : 'Test My Shields !" et "Probe My Ports !".
Ça vaut pas un bon nmap fait par un ami, mais ça permet de voir ou on en est.
Évidemment, si vous êtes derrière une box internet (Freebox, Livebox etc.), ce sera son pare-
feu à elle - il s'agit d'ailleurs probablement d'iptables également - qui sera testé et non pas
celui de votre distribution.
Lab set up : Take a system with 3 lan cards & configure it as a router
eth0 ([Link]/24) connected to internal network
eth1 ([Link]/24 (assume)) connected to internet (public network)
eth2 ([Link]/24) connected to DMZ network (web server [Link]/24, mail server
[Link]/24, dns server at [Link])
#redirect incoming web requests at eth1 ([Link]) of FIREWALL to web server at [Link]
iptables -t nat -A PREROUTING -p tcp -i eth1 -d [Link] –dport 80 -j DNAT –to-dest [Link]
iptables -t nat -A PREROUTING -p tcp -i eth1 -d [Link] –dport 443 -j DNAT –to-dest [Link]
#redirect incoming mail (SMTP) requests at eth1 ([Link]) of FIREWALL to Mail server at
[Link]
iptables -t nat -A PREROUTING -p tcp -i eth1 -d [Link] –dport 25 -j DNAT –to-dest [Link]
#redirect incoming DNS requests at eth1 ([Link]) of FIREWALL to DNS server at [Link]
iptables -t nat -A PREROUTING -p udp -i eth1 -d [Link] –dport 53 -j DNAT –to-dest [Link]
iptables -t nat -A PREROUTING -p tcp -i eth1 -d [Link] –dport 53 -j DNAT –to-dest [Link]
Introduction:
Ce document vous présente la mise en place d’une passerelle afin de segmenter votre réseau
entre une zone démilitarisé (DMZ), une zone client (LAN), et votre connexion internet
omme vous pouvez le constater, il y a de nombreuses étapes à franchir. Un paquet peut être
arrêté dans n’importe quelle chaîne d’iptables, et même ailleurs s’il est malformé. Pourtant, il
est intéressant de se pencher sur le sort du paquet vu par iptables.
La chaîne INPUT est systématiquement parcourue par les paquets souhaitant atteindre les
processus locaux de la passerelle.
La chaîne FORWARD est systématiquement parcourue par les paquets qui sont redirigés, ils
n’atteindront jamais la couche applicative de la passerelle.
Pour être plus clair. Si un paquet atteignant la première décision de routage n’est pas destiné à
la machine locale, il sera orienté vers la chaîne FORWARD. En revanche, s’il est destiné à
une adresse IP que la machine écoute, ce paquet sera envoyé vers la chaîne INPUT, et donc à
la machine locale.
Il est important de remarquer que même si des paquets sont destinés à la machine locale, leur
adresse de destination peut être modifiée à l’intérieur de la chaîne PREROUTING par une
opération de NAT. En effet, puisque ceci a lieu avant la première décision de routage, le paquet
ne sera examiné qu’après un éventuel changement. A cause de cette particularité, le routage
peut être altéré avant que la décision de routage ne soit prise. Notez bien que tous les paquets
transiteront par l’un ou l’autre des chemins de ce dessin. Si vous réalisez du DNAT sur un
paquet pour le renvoyer sur le réseau duquel il provient, il continuera malgré tout sa route à
travers les chaînes restantes jusqu’à ce qu’il retourne sur le réseau externe.
Les tables:
La table FILTER : sert principalement à filtrer les paquets c’est la table que vous utiliserez
le plus. On peut établir une correspondance avec des paquets et les filtrer comme on le désire.
C’est l’endroit prévu pour intervenir sur les paquets et analyser leur contenu, c’est-à-dire les
détruire avec la cible DROP ( -j DROP) ou les accepter avec ACCEPT (-j
ACCEPT) suivant leur contenu. Bien entendu, il est possible de réaliser préalablement du
filtrage mais cette table a été spécialement conçue pour ça. Presque toutes les cibles sont
utilisables dans celle-ci. Vous savez maintenant que c’est l’emplacement idéal pour effectuer
votre filtrage principal.
La table NAT : devrait être utilisée seulement pour effectuer de la traduction d’adresse
réseau (NAT) sur différents paquets. Autrement dit, elle ne devrait servir qu’à traduire le
champ de l’adresse source d’un paquet ou celui de l’adresse destination. Précisons à nouveau
que seul le premier paquet d’un flux rencontrera cette chaîne. Ensuite, les autres paquets
subiront automatiquement le même sort que le premier. Voici les cibles actuelles capables
d’accomplir ce genre de choses :
DNAT
SNAT
MASQUERADE
REDIRECT
La cible DNAT est généralement utile dans le cas où vous détenez une adresse IP publique et
que vous désirez rediriger les accès vers un pare-feu localisé sur un autre hôte (par exemple,
dans une zone démilitarisée ou DMZ). Concrètement, on change l’adresse de destination du
paquet avant de le router à nouveau vers l’hôte désigné.
La cible SNAT est quant à elle employée pour changer l’adresse de source des paquets. La
plupart du temps, vous dissimulerez votre réseau local ou votre DMZ, etc. Un très bon exemple
serait donné par un pare-feu pour lequel l’adresse externe est connue, mais qui nécessite de
substituer les adresses IP du réseau local avec celle du pare-feu. Avec cette cible, le pare-feu
effectuera automatiquement sur les paquets du SNAT dans un sens et du SNAT inverse dans
l’autre, rendant possible les connexions d’un réseau local sur Internet. A titre d’exemple, si
votre réseau utilise la famille d’adresses [Link]/masque_réseau, les paquets envoyés sur
Internet ne reviendront jamais, parce que l’IANA (institut de régulation des adresses) a
considéré ce réseau (avec d’autres) comme privé, et a restreint son usage à des LAN isolés
d’Internet.
La cible MASQUERADE s’utilise exactement de la même façon que la cible SNAT, mais la
cible MASQUERADE demande un peu plus de ressources pour s’exécuter. L’explication
vient du fait que chaque fois qu’un paquet atteint la cible MASQUERADE, il vérifie
automatiquement l’adresse IP à utiliser, au lieu de se comporter comme la cible SNAT qui se
réfère simplement à l’unique adresse IP configurée. Par conséquent, la
cible MASQUERADE permet de faire fonctionner un système d’adressage IP dynamique
sous DHCP, que votre FAI devrait vous procurer pour des connexions à Internet de
type PPP, PPPoE ou SLIP.
La table MANGLE:
La table Mangle permet de découper, nos paquets avant qu’ils entrent dans la couche réseau,
afin que d’autres programmes de la couche Kernel puissent en faire quelque chose. Cette
technique va permettre de différencier les paquets, on va donc pouvoir privilégier certains
flux afin de garantir une optimisation de la bande passante, entendez bien là qu’on parle de
QoS.
TOS
TTL
MARK
SECMARK
CONNSECMARK
La cible TOS permet de définir et/ou modifier le champ de Type de Service d’un paquet.
C’est utile pour définir des stratégies réseau concernant le choix de routage des paquets.
Sachez que, d’une part ceci n’a pas été perfectionné, d’autre part ce n’est pas vraiment
implémenté sur Internet car la majorité des routeurs ne se préoccupent pas de ce champ, et
quelquefois même, ils adoptent un comportement erroné. Bref, ne configurez pas ce champ
sur les paquets qui naviguent sur Internet, sauf si vous souhaitez leur appliquer des décisions
de routage, avec iproute2.
La cible TTL permet de modifier le champ durée de vie ou TTL (Time To Live) d’un paquet.
Il est possible par exemple de spécifier aux paquets d’avoir un champ TTL spécifique. Ceci
peut se justifier lorsque vous ne souhaitez pas être rejeté par certains Fournisseurs d’Accès à
Internet (FAI) trop indiscrets. En effet, il existe des FAI qui désapprouvent les utilisateurs
branchant plusieurs ordinateurs sur une même connexion, et de fait, quelques-uns de ces FAI
sont connus pour vérifier si un même hôte génère différentes valeurs TTL, supposant ainsi que
plusieurs machines sont branchées sur la même connexion.
La cible MARK permet d’associer des valeurs de marquage particulières aux paquets. Elles
peuvent ensuite être identifiées par les programmes iproute2 pour appliquer un routage
différent en fonction de l’existence ou de l’absence de telle ou telle marque. On peut ainsi
réaliser de la restriction de bande passante et de la gestion de priorité (Class Based Queuing).
La cible SECMARK peut être utilisée pour placer des marques dans un contexte de sécurité
sur des paquets dans SELinux ou tout autre système de sécurité capable de gérer ces marques.
NEW :
ESTABLISHED
RELATED
INVALID
L’intégralité du traçage de connexion est effectué par une structure particulière à l’intérieur du
noyau appelée conntrack. La structure conntrack peut soit être chargée comme un module,
soit être interne au noyau. Il faut donc bien vérifier si conntrack est disponible, et dans le cas
contraire le charger au début du script.
Le traçage de connexion est entièrement pris en charge dans la chaîne PREROUTING, sauf pour
les paquets générés en local, qui sont pris en charge dans la chaîne OUTPUT. Ceci signifie
qu’iptable effectue tous les calculs d’état dans la chaîne PREROUTING. Si on envoie le premier
paquet d’un flux, l’état est défini comme NEW dans la chaîne OUTPUT, et quand on reçoit un
paquet de réponse, l’état passe à ESTABLISHED, et ainsi de suite. Si le premier paquet n’est
pas envoyé par nous-mêmes, l’état NEW est naturellement défini dans la chaîne PREROUTING.
Ainsi, tous les changements d’état et calculs sont réalisés dans les
chaînes PREROUTING et OUTPUT de la table nat.
La syntaxe :
Avant d’attaquer le script, il faut comprendre comment écrire une règle iptables.
Un exemple de règle:
On pourrait commencer par ce demander quel filtre appliquer ? Voici un exemple de ce qu’on
peut rechercher
#!/bin/sh
# Script "[Link]"
# Fichier contenant les règles de filtrage "iptables"
DMZ=eth0
WAN=eth3
LAN=eth1
_stop(){
# REMISE à ZERO des règles de filtrage
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
_start(){
###################################### INITIALISATION
#################################
#Chargement des modules
echo " + Initialisation des modules"
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ip_conntrack_irc
modprobe ip_conntrack
modprobe iptable_nat
modprobe iptable_filter
# Initialise la table Filter (par defaut tout les echanges sont refuses)
echo " + Initialisation de la table Filter"
iptables -t filter -F
iptables -t filter -X
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
# Initialise la table NAT (par defaut tout les echanges sont actives)
echo " + Initialisation de la table NAT"
iptables -t nat -F
iptables -t nat -X
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
# Initialise la table Mangle (par defaut tout les echanges sont actives)
echo " + Initialisation de la table MANGLE"
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
###################################### LoopBack
#######################################
####################################### SSH
##########################################
##Activation du routage
echo "1" > /proc/sys/net/ipv4/ip_forward
## Masquerading
iptables -t nat -A POSTROUTING -s [Link]/24 -o $WAN -j
MASQUERADE
iptables -t nat -A POSTROUTING -s [Link]/24 -o $WAN -j
MASQUERADE
## FORWARD du port 80
iptables -A FORWARD -i $WAN -p tcp --dport 80 -j ACCEPT
###########################################################################
###########
# REGLES GENERAL CLIENT
#
###########################################################################
###########
###########################################################################
###########
# REGLES GENERAL DMZ
#
###########################################################################
###########
case "$1" in
start)
_start
;;
stop)
_stop
;;
restart)
_stop
_start
;;
*)
echo "Usage: {start|stop|restart}"
exit 1
esac
Voila qui est fait j’espère qu’il ne vous a pas fait trop peur, vous allez voir c’est assez
simple. Commençons par le décortiquer :
#!/bin/sh
# Script "[Link]"
# Fichier contenant les règles de filtrage "iptables"
DMZ=eth0
WAN=eth3
LAN=eth1
_stop(){
# REMISE à ZERO des règles de filtrage
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
echo "0" > /proc/sys/net/ipv4/ip_forward
Nous commençons par déclarer les variables, je ne peux que vous inviter à rentrer un
maximum de variable afin de ne pas devoir refaire votre script à chaque modification
d’interface ou de plage-IP.
Dans la section _stop() nous déclarons les commandes de réinitialisation d’Iptables, elles
vident les règles et remette les règles par défaut sur ACCEPT, on désactive par la même
occasion le routage.
_start(){
###################################### INITIALISATION
#################################
#Chargement des modules
echo " + Initialisation des modules"
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ip_conntrack_irc
modprobe ip_conntrack
modprobe iptable_nat
modprobe iptable_filter
# Initialise la table Filter (par defaut tout les echanges sont refuses)
echo " + Initialisation de la table Filter"
iptables -t filter -F
iptables -t filter -X
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
# Initialise la table NAT (par defaut tout les echanges sont actives)
echo " + Initialisation de la table NAT"
iptables -t nat -F
iptables -t nat -X
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
# Initialise la table Mangle (par defaut tout les echanges sont actives)
echo " + Initialisation de la table MANGLE"
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
Les choses intéressante arrivent, le script s’exécute verticalement, c’est a dire qu’Iptables va
appliquer les règles dans le sens de lecture de haut en bas, nous commençons par initialiser les
règles afin d’être sur qu’il n’y ait pas de vielles règles qui traînent dans le cas d’une nouvelle
exécution du script alors que des règles seraient déjà appliqués.
Puis on attribue la règle DROP par défaut sur les tables INPUT, FORWARD, OUTPUT
A ce stade là, pour votre passerelle c’est comme si elle n’a plus aucun câble de branché …
même un ping localhost ne passe plus :p Essayez !!
On va donc commencer par autoriser la passerelle à pouvoir communiquer avec son interface
Loopback (lo):
###################################### LoopBack
#######################################
Pour ne pas vous couper la connexion ssh il ne faut pas oublier d’ajouter dès le début une
règle autorisant les flux SSH.
####################################### SSH
##########################################
A partir de là, vous devez normalement pouvoir ping votre propre interface, et établir une
connexion SSH vers votre passerelle.
Le partage de la connexion :
Nous allons indiquer au noyau qu’on veut activer le routage de packets :
##Activation du routage
echo "1" > /proc/sys/net/ipv4/ip_forward
Puis le Masquerading afin que la passerelle cache le reste du réseau. Pour l’éxterieur toutes
les requettes proviendrons de la passerelle.
## Masquerading
iptables -t nat -A POSTROUTING -s [Link]/24 -o $WAN -j
MASQUERADE
iptables -t nat -A POSTROUTING -s [Link]/24 -o $WAN -j
MASQUERADE
Il n’y a plus qu’a autoriser le FORWARD du port 80 et votre passerelle sera en mesure de
renvoyer internet vers vos réseaux.
Le réseau CLIENT :
Nous souhaitons que le réseau Client soit joignable de l’extérieur uniquement si la connexion
a déjà été établie, et nous souhaitons que le réseau client puisse établir de nouvelles
connexions vers l’extérieur.
###########################################################################
###########
# REGLES GENERAL CLIENT
#
###########################################################################
###########
En français :
Pour le FORWARD, ce qui rentre par $WAN, sort par $LAN, provenant de l’adresse ip
[Link]/0 (ALL) à destination du réseau [Link]/24 J’autorise les connexion déjà établie
ou en cour d’établissement.
Pour le FORWARD, ce qui rentre par $LAN, sort par $WAN, provenant de l’adresse ip
[Link]/24 à destination du réseau [Link]/0, j’autorise les nouvelles connexions, les
connexions déjà établies ou en cours d’établissements.
Voila, j'ai un soucis, j'essaie de réaliser un firewall sous Ubuntu avec les iptables. Mon réseau est
constitué d'une DMZ(eth4) et d'un LAN(eth5) le tout fournit par WAN(eth3)
Cependant j'ai un problème que je n'arrive pas à résoudre.
#!/bin/sh
# script /etc/[Link]
# LAN-DMZ
# IMPORTANT:
# For the firewall works, it must have the foward actived !!!!!
# So we active this option for the IPv4 :
echo 1 > /proc/sys/net/ipv4/ip_forward
## 3. Conexiones WAN-DMZ
# Every WAN connextion which try to entre in the networks without the
server address but with special port (80; 443; 25) are routing to the DMZ
# 3 possibility, for the port 80 and 443 the request are routing to the web
server
# and if the port is 25 the request are routing to the MAIL sever
iptables -t NAT -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-
destination [Link]:80
iptables -t NAT -A PREROUTING -i eth0 -p tcp –dport 443 -j DNAT –to-
destination [Link]:443
iptables -t NAT -A PREROUTING -i eth0 -p udp –dport 25 -j DNAT –to-
destination [Link]:25
## 4. Conexiones WAN-LAN
# For security reason, we need to hide LAN IP from the world
# When the LAN when go to the WAN, the firewall will change the LAN ip to
eth 0
# Like that, if on hacker want try to look the LAN IP. He will see only the
public Firewall IP
#toutes les adresses du lan son changées par celle de ETH0 du FW (sécurité)
iptables -t nat -A POSTROUTING -s [Link]/24 -o eth0 -j MASQUERADE
I – Contexte :
II – Configuration IP des postes :
IP : [Link]
IP : [Link] IP : 192.168.1.X (DHCP)
Passerelle : [Link]
Passerelle : [Link] Passerelle : [Link]
DNS : [Link]
DNS : [Link] DNS : [Link]
Nom DNS : [Link]
III – Objectifs :
On va tout d’abord paramétrer la DMZ pour filtrer les trames qui entre et qui sortent dans les
différents réseaux (WEB et LAN)
13
14 21
23 31
32 24
41 34
42
43
Le filtrage va nous servir à protéger le serveur Web des intrusions tout en le rendant
accessible pour ses fonctions principales (Visionner le contenu de la page HTML du serveur,
accès à la base de données).
V – Configuration du filtrage:
Tout d’abord il faut vérifier la situation initiale, pour ce faire il faut réalise un ping vers
l’extérieur et dans le réseau local. Si les deux répondent c’est que la configuration est
correcte.
1. ping [Link]
2. ping [Link]
Pourquoi ? Pour partir sur une base saine ou l’on pourra tout choisir a notre guise.
1. iptables -F
Test : pour tester les modifications il va falloir afficher le contenu de la table, si cette dernière
est vide, la commande a réussi.
1. iptables -L
Etape 2 – Mettre en place la politique par défaut qui consiste à tout bloquer sauf sorties
du routeur URANUS.
Test : réaliser un ping vers l’extérieur et dans le réseau local. Si les deux ne répondent pas
c’est que la politique par défaut a bien été appliquée.
1. ping [Link]
2. ping [Link]
Le trafic établi est la réponse aux trames déjà existantes, il est important de l’autoriser.
Accepter les trames établies pour toutes trames traversant, entrant ou sortant du routeur :
Etape 4 – Nouvelle règle : le LAN parle vers la DMZ et le LAN parle vers le WAN
L’objectif est d’autoriser toutes les trames sortant du LAN afin qu’elles puissent
communiquer avec toutes les zones de notre situation initiale.
Test :
Réaliser un ping sur le poste client Windows 7 en direction d’internet et de la DMZ, ceux-là
doivent fonctionner.
1. ping [Link]
2. ping [Link]
1. ping [Link]
Quand le serveur web aura besoin d’aller sur internet il pourra envoyer des paquets sur ce
dernier, ce qui n’était pas possible auparavant.
Test : Réaliser un ping vers internet depuis le serveur web dans la DMZ.
1. ping [Link]
Quand le serveur web envoie des paquets il faut que le destinataire lui réponde, c’est pour cela
qu’il est important que ce paramètre soit ajouté au script.
Autoriser les trames traversant du WAN vers la DMZ ayant comme port 80 pour aller en
direction du serveur web :
Cela permettra au serveur web de pouvoir bénéficier de la résolution de noms proposée par le
serveur 2012.
Filtrer et accepter toutes les trames traversant de la DMZ vers le LAN ayant comme port 53
via le protocole UDP ayant pour destination le serveur 2012 pour une résolution de nom
(DNS) :
Ensuite il faut bien sûr ajouter le serveur DNS dans la configuration IP de votre poste Debian
(Voir documentation : configuration IP d’un poste Debian)
Une fois que tout cela est fait il faut savoir si le serveur DNS a bien accroché à votre serveur
web.
1. nslookup
2.
3. # écran va afficher via quel serveur Debian passe. Dans mon cas il s’agit d’[Link] (nom
du serveur 2012)
Etape 9 – Règle : Autoriser l’accès en consultation au serveur web depuis l’extérieur
Cela consiste à rediriger les trames adressées à l’IP publique du réseau vers le serveur web.
Cela permettra à l’avenir d’avoir accès à la page web du serveur web depuis l’extérieur.
Accorder l’adresse IP publique du routeur Uranus pour un accès externe à la page publique du
serveur WEB. L’accès se fera comme cela ([Link] :
Test : se rendre sur une machine à l’extérieur du groupement de réseau et entrer dans la barre
d’adresse l’adresse IP de la broche eth1 (comprendre adresse IP publique). Et vous devriez
voir la page par défaut de votre serveur web (apache /var/www/[Link]).
It works!
The web server software is running but no content has been added, yet.
Toutes les lignes que nous avons rentré dans la partie V sont éphémères, c’est-à-dire qu’après
un redémarrage de votre routeur Debian elles ne prennent plus effet, il est donc préférable de
sauvegarder la configuration d’iptables grâce au paquet iptables-persistent
1. mkdir /root/scripts
1. nano /root/scripts/scripts_filtrage
Sur Windows la création d’un script se passe par le biais de la surcouche « bloc-notes » et
après on le sauvegarde au format « .bat ». Sur linux c’est formellement la même chose sauf
que bloc-notes se surnomme « nano » nous sommes à l’intérieur à présent, il suffit d’y ajouter
une première ligne qui définira le type de fichier, dans notre cas nous voulons un script (donc
il s’agit d’un « .sh »).
1. # !/bin/sh
(PS : les « # » représentent les lignes de commentaires, elles ne sont pas obligatoires mais
vous aide à comprendre votre script)
1. # !/bin/sh
2. # supprimer le filtrage
3. iptables -F
4. # politique par defaut: on bloque tout sauf output
5. iptables -P FORWARD DROP
6. iptables -P INPUT DROP
7. iptables -P OUTPUT ACCEPT
8. # trafic etabli autorise
9. iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
10. iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
11. iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
12. # le LAN parle vers la DMZ et le LAN parle vers le WAN
13. iptables -A FORWARD -i eth0 -j ACCEPT
14. # le LAN parle au routeur
15. iptables -A INPUT -i eth0 -j ACCEPT
16. # la DMZ parle vers le WAN
17. iptables -A FORWARD -i eth2 -o eth1 -j ACCEPT
18. # redirection ip-pub/serveur web
19. iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination
[Link]
20. # autorise les trames rediriges du WAN vers le serveur web
21. iptables -A FORWARD -i eth1 -o eth2 -d [Link] -p tcp --dport 80 -j ACCEPT
22. # Acces au DNS depuis le serveur WEB
23. iptables –t filter –A FORWARD –i eth2 –o eth0 –d [Link] –p udp --dport 53 –j ACCEPT
# nano /etc/network/if-up.d/[Link]
#!/bin/sh
lan_ip="[Link]"
lan_if="eth0"
wan_ip="[Link]"
wan_if="eth1"
dmz_ip="[Link]"
dmz_if="eth2"
lo_if="lo"
lo_ip="[Link]"
dc="[Link]"
db="[Link]"
itchief="[Link]"
mail="[Link]"
IPTABLES="/sbin/iptables"
# Module loading
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state
# Enable Forwarding
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
# Set policies
# Loopback
This script was created in special link up state Ubuntu directory and will be executed when
init process starts network scripts. Save the file and make it executable:
# chmod +x /etc/network/if-up.d/[Link]