Chrooter apache
Ajout disque dur
Ajout carte
Audit des disques durs
Gestion des peripheriques
Disquette d'installation
Ajout d'un scanner
Graver en ligne de commande
Astuces
Astuces en Bash
Configuration reseau
Dns
Serveur cvs
Proxy squid 
Installation serveur ftp
Installation qmail 
Installation serveur courrier sous debian
Outil TCP/IP 
Le serveur samba
Connexion a distance securisee
Client/serveur vnc
Configurer apache
Dyndns
Chiffrer un fichier/dossier
Securiser son poste
Mur pare feu pas a pas
Authentification ht-access
Surveillance de serveur CACTI
Snort
Snort-inline
Securiser Apache avec mod_security
Filtrage squid/squidguard/dansguardian
Auditer son site web
Sécuriser son linux
Installer un Lamp avec ssl
Contrer les scans de ports
Traitement anti-spam
Installer/Utiliser tripwire
Utilisation de lilo
Les commandes Linux
Le multi-tache
Le crontab
Exploration de la configuration
Quotas
Messagerie
Installer une application
Debugger ses applications
Le format RPM
Mise a jour du noyau
Qemu
Tour d'horizon des principaux p2p
Récupération du système
Bips d'un pc
Astuces windows
Table Ascii
Lamerland
Conversion de fichiers musicaux
hakin9
Secureroot.com
Hackerthreads.org
Defcon
Hackerlounge
Les derniers exploits
Tous les codes sources
Securite sous Linux
Les logiciels libres quotidiens
Ezine divers
Madchat
Textes divers
Archives
 
Toutes les traductions
Toutes les traductions
Hackin9

Il y a actuellement 4 visiteurs connectés sur le site !

Google
Mur pare feu pas à pas
Mur pare feu pas à pas

 

Introduction
On commence
Politique par defaut
Les regles locales
Suivre son mur pare-feu
Partager la sonnection
Autoriser des connections
Cas général : réseau local vers internet
Cas général : internet vers réseau local
Cas particuliers
Le ping !
Quels ports autoriser ?
Fin de script
Arrêter le mur pare feu
Conclusion

 

Introduction:

il n'est pas question d'expliquer ici le fonctionnement d'iptables, il existe pour cela de très bons articles dont celui de Léa.
Le mur pare feu que je vous propose de construire sera adapté à vos besoins.
Il ne comportera aucun gadget, aucune optimisation du réseau. Ce sera un mur pare feu rien qu'un mur pare feu.

On commence

Vous devrez mettre dans le fichier /usr/bin/startfirewall tout ce qui va suivre.
Comme tout script, le script de notre mur pare feu doit commencer par :
#!/bin/sh

Mais, pour être facilement modifiable, nous allons définir en plus quelques variables :
# (suite du script...)
# mettez ici l'emplacement d'iptables :
IPTABLES=/sbin/iptables
# mettez ici le nom de l'interface réseau vers internet :
EXTERNAL_IF="ppp0"
# mettez ici le nom de l'interface réseau vers votre lan :
INTERNAL_IF="eth0"

Ensuite, il nous faut charger les modules dont nous aurons besoin :
# (suite du script...)
# si vous voulez pouvoir autoriser les connections ftp :
modprobe ip_conntrack_ftp
# si vous voulez pouvoir autoriser le DCC sous IRC :
modprobe ip_conntrack_irc

Suivant votre configuration, il peut être nécessaire de charger un autre module, pour en avoir la liste :
ls /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/


///////////////////////////////////////

Politique par defaut

Un mur pare feu correctement configuré se doit de rejeter tout ce qui n'a pas été explicitement autorisé.
C'est le rôle de la politique par défaut (default policy). Pour fixer celle-ci, nous utilisons les 3 règles suivantes
:
# (suite du script...)
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
La dernière règle peut être omise si vous souhaitez tout transmettre [aux]/[depuis les] machines de votre réseau local.


Les regles locales

Pour ne pas être ennuyé, il faut tout autoriser pour ce qui est du traffic réseau local (sur 'lo' et '$INTERNAL_IF' aka: 'eth0') :
# (suite du script...)
# "On accepte le traffic sur 'lo'"
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A FORWARD -i lo -j ACCEPT
$IPTABLES -A FORWARD -o lo -j ACCEPT
# "On accepte le traffic sur le réseau local"
$IPTABLES -A INPUT -i $INTERNAL_IF -j ACCEPT
$IPTABLES -A OUTPUT -o $INTERNAL_IF -j ACCEPT
$IPTABLES -A FORWARD -i $INTERNAL_IF -j ACCEPT
$IPTABLES -A FORWARD -o $INTERNAL_IF -j ACCEPT


Suivre son mur pare-feu

Ceci n'est pas vraiment obligatoire.
Si vous ne regardez pas régulièrement les logs de votre mur pare feu, celui-ci a toutes les chances de devenir inefficace. Nous allons donc 'logguer' une partie des connections que nous refuserons


:
# (suite du script...)
# On loggue les packets DROPés
$IPTABLES -A LOG_DROP -j LOG --log-prefix "[IPT] "
$IPTABLES -A LOG_DROP -j DROP

Le texte [IPT] peut être remplacé par n'importe quel texte de votre choix. Vous pouvez, de la même façon, créer plusieurs cibles 'DROP' pour les logguer différemment.

Partager la connection

Le mur pare feu peut aussi servir à partager la connection, pour cela il faut faire deux choses :
1. l'autoriser au niveau du noyau :
# (suite du script...)
echo 1 > /proc/sys/net/ipv4/ip_forward

2. cacher les autres machines du réseau local derriére le mur pare feu :
# (suite du script...)
$IPTABLES -A POSTROUTING -t nat -o $EXTERNAL_IF -j MASQUERADE/td>

Autoriser des connections

A partir de maintenant je vais vous donner des recettes de cuisine.
Tout d'abord, il faut savoir que vous pouvez au choix utiliser un numéro de port ou son nom dans le fichier /etc/services.
J'utiliserais, dans la mesure du possible, cette dernière solution. Je ne détaillerais pas tous les ports, si vous souhaitez utiliser un port que j'aurais omis, consultez /etc/services.
Dans ce fichier, vous constaterez que certains ports sont indiqués comme utilisant le protocol tcp, udp ou autre.
Pour autoriser ces protocols vous devrez changer le "-p tcp" par "-p udp" ou autre dans les exemples qui vont suivre.

Cas general: reseau local vers internet

Pour la plupart des connections, tout ce que je vais dire ici s'applique (exceptions notables : l'irc/dcc, le ftp/actif).
Pour autoriser les machines de votre réseau local (si le masquerading est activé) ainsi que votre serveur mur pare feu à se connecter à un port sur internet, il faut procéder de la maniére suivante (dans l'exemple j'autorise la connection au WEB : www):
# (suite du script...)
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport www -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --dport www -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Chaque commande $IPTABLES doit être tapée sur une seule ligne depuis le $IPTABLES jusqu'au -j ACCEPT ou -j DENY (dans la suite...)

Une petite explication, la règle $IPTABLES -A INPUT s'applique au traffic entrant (tous les paquets IP entrant seront soumis à cette règle).
Comme on a précisé -p tcp, la règle s'applique aux paquets utilisants le protocol tcp.
On a aussi préciser --sport www, donc la règle s'applique au paquet qui proviennent (sport est mis pour source port,
le port d'entrée) du port www (le web quoi !). Puis on a mis -m state --state ESTABLISHED,RELATED pour préciser que cette règle ne s'applique qu'aux paquets IP qui proviennent soit d'une liaison "établie" (ESTABLISHED), soit d'une liaison en relation (RELATED) avec une liaison déjà établie.
Enfin on précise -j ACCEPT pour dire qu'on accepte tous les paquets qui vérifient toutes ces conditions :
les paquets venant d'une liaison WEB déja établie.
La seconde règle est symétrique de la première : elle autorise la paquets IP à sortir (-A OUTPUT),
sauf qu'elle précise en plus que les paquets sortants ont le droit d'initier une nouvelle connection (--state NEW). Sinon la premiére règle aurait trés peu de chance de fonctionner :
aucune liaison ne serait jamais 'établie'.
Pour autoriser plusieurs ports en même temps, on peut soit taper plusieurs règles comme la précédente (une par port) ou alors utiliser la syntaxe (exemple pour le http et le https):
# (suite du script...)
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp -m multiport --sports www,https -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp -m multiport --dports www,https -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT/td>

Cas général : internet vers réseau local

Pour autoriser les machines d'internet à se connecter à votre serveur local (dans l'exemple j'autorise la connection à votre serveur WEB : www):
# (suite du script...)
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --sport www -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --dport www -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Si vous voulez autoriser une connection d'internet vers l'un des serveurs de votre réseau local à la place du serveur qui joue le rôle de mur pare feu, alors il faut faire du port forwarding en utilisant les cibles SNAT et DNAT en plus d'ACCEPT, mais cela dépasse le cadre de cet article.

Cas particuliers

Il existe des cas particuliers, ce sont les protocoles qui ouvrent plusieurs liaisons en même temps :
le DCC(pour irc), le ftp passif, les protocole vidéo (comme le h323).
Ils fonctionnent souvent (mais pas tous) sur le principe suivant : le client (vous) réclame quelque chose (un fichier) au serveur (le serveur ftp) ;
celui-ci répond à la demande en ouvrant une nouvelle connection (aléatoire en général : c'est ce qui nous pose problème, on ne sait pas quel port ouvrir) réseau sur le client (vous).
Pour ne pas ouvrir n'importe quel port (plus précisément, pour ne pas ouvrir TOUS les ports) pour être en mesure de répondre à la demande du serveur, il faut que nous soyons capable de "tracer" (to track en anglais) la provenance de la demande de connection pour être sur que la demande de connection provient d'une liaison que nous avons nous méme initié.
C'est le rôle du module "ip_conntrack" et de ses acolytes : "ip_conntrack_ftp" (pour le ftp) et "ip_conntrack_irc" pour l'irc.
Pour que cela (ce qui va suivre) fonctionne, il faut donc que ces modules soient chargés.
C'est ce que nous faisons au début du script, donc plus besoin de nous en occuper, si ce n'est pour autoriser les connections qui sont en relation avec celles déja établies sur les ports qui sont utilisés par irc et ftp
: $IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
# (suite du script...)
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

Voilà, c'est tout, le ftp passif doit maintenant pouvoir bien passer votre mur pare feu.
Par contre pour le DCC, il faut encore ajouter une règle, autoriser les liaisons sortantes à initier une connection.
Je ne vois pas pourquoi, mais chez moi c'est nécessaire ;-) :
# (suite du script...)
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state NEW -j ACCEPT
Pour le DCC, j'ai comme l'impression que le module 'ip_conntrack_irc' a du mal à suivre les connections et c'est pour ça qu'il faut ajouter la troisième régle.
Ce n'est pas une trop grande faille de sécurité puisque c'est nous qui initions la connection, mais tout de même ce serait mieux si ce n'était pas obligé.

Ping

Pour l'instant, si vous avez ouvert quelques port, vous avez du remarquer que vous n'avez plus accès au ping. Nous allons remédier à cela
:# (suite du script...)
$IPTABLES -A OUTPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

ou alors, vous pouvez vouloir limiter les ping entrant (pour éviter d'être floodé) et vous remplacez la seconde règle par les deux suivantes :
# (suite du script...)
$IPTABLES -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state NEW -m limit --limit 10/min -j ACCEPT

Vous pouvez remplacer 10/min par 1/s etc...

Quels ports autoriser ?

Il est un port que vous êtes obligé d'autoriser dans le sens 'réseau local' vers 'internet' : le port "domain" (aka: 53) en udp ET tcp.
Sinon vous serez dans l'impossibilité d'utiliser la résolution de nom (aka: l'identification d'un nom de domaine avec son IP)

. Sinon, moi j'autorise, dans le sens 'reseau local' vers 'internet' en tcp :

* domain (obligatoire),
* ftp,
* ftp-data,
* www,
* https,
* pop-3,
* imap2,
* imap3,
* smtp,
* ircd,
* cvspserver
, * rsync,
* 7070 (realaudio),
* 11371 (keyserver),
* ssh,
* 1441 (flux ogg de radio france)
Et en udp :
* domain (obligatoire),
* 6970 et 7170 (realaudio)
Et dans le sens : 'internet' vers 'reseau local' en tcp
: * auth (accélère l'établissement de la connection à plein de serveurs irc)
Rappel : tous ces noms de 'ports' se trouvent dans le fichier /etc/services

Fin de script

our finir, on loggue tout via syslogd :
$IPTABLES -A FORWARD -j LOG_DROP
$IPTABLES -A INPUT -j LOG_DROP
$IPTABLES -A OUTPUT -j LOG_DROP

Arreter le mur pare-feu

Il n'est en général pas nécessaire d'arrêter le mur pare feu,
mais, sait-on jamais ? Pour faire les tests, il est nécessaire de l'arrêter et de le redémarrer (parce que l'ordre des règles est important).
Voici un petit script pour arrêter le mur pare feu (celui qui est proposé ici,
il ne fonctionnera pas avec tous les murs de feu)
#!/bin/sh
# Script d'arrêt du mur pare feu
# mettez ici l'emplacement d'iptables :
IPTABLES=/sbin/iptables
echo "On vide toutes les régles."
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -t nat -F POSTROUTING
$IPTABLES -F LOG_DROP
$IPTABLES -X
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

echo "On décharge les modules."
rmmod `lsmod | grep -E "^ip" | cut -d" " -f 1`
:

Conclusion

Ce mur pare feu n'est certainement pas parfait,
mais j'espere qu'il vous permettra de mieux comprendre comment sont fabriqués les murs de feu que vous trouvez dans des scripts tous faits.

Sources de l'article


 

Forum d'entraide
Les news du site
Formulaire en php
Administrer un serveur Mysql
Session en php
Gerer ses bases mysql
Les bases php
Securiser ses scripts PHP
Controler ses programmes avec RATS
Convertir une base sql en utf8
Astuces php
Python rapide
Tutorial Python
Tutorial Perl
Tutorial Perl complet
Tutoriel ruby
Tutoriel C
Introduction à gawk
Filtres et utilitaires
Find
Programmation Shell
Ecriture de scripts bash
Expressions regulieres
Vi
Introduction a Javascript
Compiler avec gcc
Tutoriel Assembleur
Guide du cracking pour débutant
Assembleur
Manual Unpacking
Différentes failles Web
Arp spoofing dans un réseau switché
Les intrusions
Les attaques externes
Defacage
Defacage complet
Buffer overflow
Netcat
Injection sql
Injection sql(suite)
John the Ripper
Spoofer un email
Utiliser google
La faille system
Usurper une identité
Le rooting
Shellcode sous Unix
La faille race condition
La faille xss
La faille xss (2)
Attaques sur un routeur
Azureus pas-a-pas
Lire les news de Linux-pour-lesnuls.com au format RSS
Gestion des paquets debian
101 commandes debian
Effet neon dans GIMP
Effet vapeur dans GIMP
Cours fonctionnalités de GIMP
Ensemble
Divers