Suggestion : Undefined index: dark_nature dans le fichier /web/tekniko/linux/kernel/header.php à la ligne 243
Suggestion : Undefined index: dark_nature dans le fichier /web/tekniko/linux/kernel/header.php à la ligne 244
Un coin perdu... : Articles - Configurer son firewall Netfilter avec Iptables
Rss Configurer son firewall Netfilter avec Iptables
Voici un petit passage du site d'Olivier Allard-Jacquin que j'ai adoré :


Citation:
C'est juste une petite remarque auquel j'invite l'utilisateur de Windows® à réfléchir quelques secondes. Qu'est-ce qui vous prouve que toutes les trames IP qui rentrent ou qui sortent de votre Windows® passent bien par la validation du firewall que vous avez installé ? Le code source de Windows® ? Vous l'avez vu ? La belle affaire : Même si c'est le cas, je vous rappelle que vous avez un accord de non divulgation qui vous interdit de parler de ce que vous avez pu y trouver...



Netfilter est un module firewall directement implémenté dans le noyau LinuX, il est l'un des plus puissant du marché et ça configuration, bien qu'elle ai l'air ardue est en faite simple, du moins pour une config de base, a savoir qu'avec Netfilter on peut faire des choses absolument énorme, du routage, du bridge (switch ethernet, on parle dans ce cas la de "bridge firewallant") etc...

C'est un firewall de type "modulaire", enfin je le vois comme ça étant donné qu'il se decompose en plusieurs tables, filter, nat et mangle mais pour une station simple, nous n'utiliserons que la table filter pour commencer puis nous verrons plus tard comment appliquer ce firewall sur un serveur web par exemple.

Le principe de fonctionnement est le suivant : ''Netfilter'' installe des ''hooks'' (crochets) spécifique a chaque protocole réseau et les chaînes que nous allons créer seront inscrite sur chacune des tables désignées, dans notre cas la table filter, pour vulgariser un peu, imaginons un barrage hydro-électrique, le lac en amont serait le net, ''Netfilter'' le barrage et le petit ruisseau qui en découle notre machine, maintenant imaginons que le lac est hyper pollué, qu'il y a du plombs et des matières radioactives dedans, bien sur on ne veut pas que cette pollution arrive jusqu'au petit ruisseau qui coule en bas du jardin et pour ce faire, on vas installer des filtres sur le barrage et chacun de ces filtres aura une fonction précise pour arrêter une pollution précise, le ''hook'' sera le filtre et sa fonction une chaîne ! c'est plus simple a digérer comme ça !


Attention
: Toutes les règles ''iptables'' sont purgées a l'extinction de la machine, il faut donc faire un script qui s'exécutera au démarrage....


Comme d'habitude, nous créons notre barrage sur une Ubuntu 7.10, a noter pour les utilisateurs de LinuX Mint, ''iptables'' est déjà installé !

Commençons par installer ''iptables'', c'est "l'application" qui permet de configurer Netfilter.


Code BASH :
 moi@ma-machine:-$sudo apt-get install iptables


ou encore


Code BASH :
 moi@ma-machine:-$sudo aptitude install iptables


Il semblerait qu'Aptitude gère mieux les dépendances....A vérifier !
Et hop c'est fait, me voila invincible ! Ca serait magnifique et chiant à la fois puisqu'il n'y aurait rien a faire, heureusement pour nous ça n'est pas le cas, vérifions ensemble qu'elles sont les règles en vigueurs par défaut après l'install d'''iptables'', pour ce faire il y a une commande très simple qui vas lister les règles attribuées, il s'agit de :

sudo iptables -L

Code BASH :
 moi@ma-machine:-$sudo iptables -L


ce qui nous renvoit :

Code BASH :
 Chain INPUT (policy ACCEPT)
 target     prot opt source               destination         
 
 Chain FORWARD (policy ACCEPT)
 target     prot opt source               destination         
 
 Chain OUTPUT (policy ACCEPT)
 target     prot opt source               destination


Et oui, par défaut il n'y a aucune règles, tous passe sans soucis ! c'est bien parce que rien ne bloque et pas bien parce que justement, rien n'est bloqué !! Rapellons nous que notre cas est une station isolée, donc les seules chaînes qui nous intéressent sont les chaînes INPUT et OUTPUT.

Et oui, nous on veut juste un accès au Web donc la chaîne FORWARD (routage...) ne nous intéresse pas !
Deux commandes sont importante si vous aviez déjà installé ''iptables'', ou si vous vous éte planté :

sudo iptables -F
sudo iptables -X


Ces deux commande permettent de réinitialiser une chaîne sélectionnée (-F) d'un utilisateur donné (-X), pour plus de renseignement sur toutes les options de la commande ''iptables'', je vous invite a consulter le man ''iptables'' en tapant dans votre terminal : man ''iptables'' ou simplement en lisant cette page.
Bon, et si nous nous attaquions au vif du sujet ?! Parce qu'elle n'est toujours pas protégée ma station et si vous glandez trops je vais faire appel a quelqu'un d'autre !
Premières notions importante : faire attention a l'ordre dans lequel on insère ces règles, parce que si on dit en premier "j'accepte une connexion sortante a destination du Web" et que par la suite on insère " je bloque tout autre trafic entrant ou sortant" et bien c'est simple, ''Netfilter'' vas lire nos règles dans l'ordre qu'on lui a donné ! donc au départ oui il vas accepter nos connexion au net mais puisqu'après on lui dit de tout bloquer, que ce soit entrant ou sortant, et bien ya rien qui passera, logique non ?

Et si on créé une variable afin que notre futur script puisse s'appliquer un peu partout sans trop de soucis ?

Code BASH :
 NET=eth0


Comme ça, plus besoin de modifier le nom de notre interface a chaque ligne dans le cas ou ce script serve sur plusieurs machines, il y aura seulement la variable NET= a changer si c'est nécessaire !

C'est partit, montons notre barrage de police ! oui, se sont les ''Policy'' par défaut de chaque chaîne que nous allons éditer, c'est a dire le comportement de base de chaque chaîne et ce, une par une !
La syntaxe est la suivante :


Code BASH :
 iptables -table -option chaîne action-a-effectuer-sur-les-paquets


Nous utiliseront l'option -P pour dire a ''iptables'' que se sont les comportement par défaut de chaque chaîne que nous voulons modifier donc voici ce que cela donne :

Code BASH :
 moi@ma-machine:-$ sudo iptables -t filter -P INPUT DROP

puis

Code BASH :
 moi@ma-machine:-$ sudo iptables -t filter -P FORWARD DROP

et enfin

Code BASH :
 moi@ma-machine:-$ sudo iptables -t filter -P OUTPUT ACCEPT


Et hop, voila, la il y a plus rien qui rentre et tout peut sortir ! Et c'est a partir de LA qu'on vas définir ce qu'on autorise et ce qu'on interdit ! c'est magique non ? Alors occupons nous de notre connexion internet, j'ai envis de surfer la !
Voici la syntaxe a utiliser pour insérer une règle dans une chaîne :


Code BASH :
iptables -table -option chaîne-cible -interface -option protocole  -option action-sur-les-paquets


Commençons par autoriser les connexions de l'interface de loopback :

Code BASH :
 moi@ma-machine:-$ sudo iptables -t filter -A INPUT -i lo -j ACCEPT

Autorisons le ping :

Code BASH :
 moi@ma-machine:-$ sudo iptables -t filter -A INPUT -i $NET -p icmp -j ACC
EPT
Comme on dit : Ca, c'est fait !

Et pour un accès Web, insérons la règle suivante dans la chaîne INPUT :


Code BASH :
 moi@ma-machine:-$ sudo iptables -A INPUT -t filter -i $NET -m state --state RELATED,ESTABLISHED -j ACCEPT


La je viens de dire a ''Netfilter'' que je voulais qu'il accepte les connexions deja etablie ou relatives a une connexion établie sur eth0, c'est simple non ? Et pour vérifier que ma règle est bien inscrite dans la chaîne INPUT, il suffit de taper un petit iptable -L, l'option -L dit a ''iptables'' de Lister !
Maintenant histoire de sécuriser un peu plus mon barrage et colmater les fissures, je vais dire a ''Netfilter'' que si une personne souhaiterai rentrer chez moi sans ma permission express, elle se fera purement et simplement bouler, sans doute parce qu'elle a des basket.....
La syntaxe est quasiment la même que pour dire qu'il n'y a que le type a qui je demande qui peut me répondre.
Toutes connexions initialisées depuis le net a destination de chez moi et que je n'ai pas demandé sera rejetées ! malin non ? Puisque l'on ne peut mettre REJECT comme politique par défaut, nous allons mettre en place une "règle par défaut" pour LA chaîne INPUT :

Code BASH :
 moi@ma-machine:-$ sudo iptables -t filter -A INPUT -i $NET -j REJECT


Tout ça c'est bien chouette mais c'est dommage que cela soit perdu au prochain redémarrage de la machine, créons un petit script pour automatiser ces règles et plaçons celui ci correctement afin qu'il soit pris en compte des le démarrage. Éditons un fichier texte dans lequel on vas placer toutes ces commandes :


Code BASH :
 moi@ma-machine:-$ sudo vi iptables-rules.sh


plaçons toutes ces commandes :




Code BASH :
 
#!/bin/bash__
# Script qui démarre les règles de filtrage "iptables"
# Creation d'une variable pour l'interface réseau
########################################################
 NET=eth0
 
# REMISE à ZERO des règles de filtrage
 sudo iptables -F
 sudo iptables -X
 
# DEBUT des "politiques par défaut"
# Je veux que les connexions entrantes soient bloquées par défaut
 sudo iptables -t filter -P INPUT DROP
 
# Je veux que les connexions destinées à être forwardées
# soient bloquées par défaut
 sudo iptables -t filter -P FORWARD DROP
 
# Je veux que les connexions sortantes soient acceptées par défaut
 sudo iptables -t filter -P OUTPUT ACCEPT
 
# FIN des "politiques par défaut
# DEBUT des règles de filtrage
# Pas de filtrage sur l'interface de "loopback"
 sudo iptables -t filter -A INPUT -i lo -j ACCEPT
 
# J'accepte le protocole ICMP (le "ping")
 sudo iptables -t filter -A INPUT -i $NET -p icmp -j ACCEPT
 
# J'accepte les packets entrants relatifs à des connexions déjà établie
 sudo iptables -t filter -A INPUT -i $NET -m state --state RELATED,ESTABLISHED -j ACCEPT
 
# La règle par défaut pour la chaine INPUT devient "REJECT
# (il n'est pas possible de mettre REJECT comme politique par défaut)
 sudo iptables -t filter -A INPUT -j REJECT
 
# FIN des règles de filtrage
 


Et voili voilou, pour le placer au démarrage, comme vous le sentez, via l'interface graphique ou en ligne de commande en lui attribuant avant les droit d'exécution :


Code BASH :
 moi@ma-machine:-$ sudo chmod 755 iptables-rules.sh


Ensuite il faut placer ce fichier dans le répertoire /etc/init.d et dire a la machine qu'il faut qu'elle prenne en compte ce script :

Code BASH :
 moi@ma-machine:-$ sudo update-rc.d iptable-rules.sh defaults

Au prochain redémarrage, un simple petit sudo iptables -L prouvera que nos règles sont bien chargées.

Comme je suis quelqu'un de gentil, voici quelques règles supplémentaires pour adapter votre script a vos besoins (je pense a rsync pour ceux qui ont lu un de mes précédent billet...) il y a juste a les commentaires si pas besoin et Attention, a placer impérativement avant les dernières ( celles que nous avons désignées par défaut..).

Code BASH :
 
# pour que le serveur FTP éventuel
# soit joignable de l'extérieur
 
 sudo iptables -t filter -A INPUT -i $NET -p tcp --dport 20 -j ACCEPT
 sudo iptables -t filter -A INPUT -i $NET -p tcp --dport 21 -j ACCEPT
 
 
# pour que le serveur SSH éventuel
# soit joignable de l'extérieu
 sudo iptables -t filter -A INPUT -i $NET -p tcp --dport 22 -j ACCEPT
 
# pour accepter les transferts rsync
 sudo iptables -t filter -A INPUT -i $NET -p tcp --dport 873 -j ACCEPT
 
# pour que le serveur de mail éventuel
# soit joignable de l'extérieur
 sudo iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
 
# pour que le serveur de DNS éventuel
# soit joignable de l'extérieur
 sudo iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
 sudo iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
 
# pour que le serveur Web éventuel
# soit joignable de l'extérieur
 sudo iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
 
# pour autoriser Webmin
 sudo iptables -t filter -A INPUT -i $NET -p tcp --dport 10000 -j ACCEPT
 
# pour que le serveur CUPS éventuel
# soit joignable de l'extérieur
 sudo iptables -t filter -A INPUT -p tcp --dport 631 -j ACCEPT
 sudo iptables -t filter -A INPUT -p udp --dport 631 -j ACCEPT
 
# pour que le serveur Samba éventuel
# soit joignable de l'extérieur
 sudo iptables -t filter -A INPUT -p tcp --dport 139 -j ACCEPT
 sudo iptables -t filter -A INPUT -p udp --dport 139 -j ACCEPT
 
# pour que des clients puissent se connecter
# à l'ordinateur par XDMCP)
 sudo iptables -t filter -A INPUT -p udp --dport 177 -j ACCEPT
 
# pour que l'odinateur puisse se connecte
# par XDMCP à une machine distante
 sudo iptables -t filter -A INPUT -p tcp --dport 6001 -j ACCEPT
 
# pour que le serveur CVS éventuel
# soit joignable de l'extérieur via le mécanisme de "pserver"
# (si les utilisateurs accèdent au serveur CVS exclusivement via SSH,
# seule la ligne concernant le serveur SSH doit être décommentée
 sudo iptables -t filter -A INPUT -p tcp --dport 2401 -j ACCEPT
 
# pouvoir reçevoir des flux VideoLAN
# (ce sont des flux UDP entrants sur le port 1234)
 sudo iptables -t filter -A INPUT -p udp --dport 1234 -j ACCEPT
 
# pouvoir reçevoir des annonces SAP
# (ce sont des annonces de session multicast)
 sudo iptables -t filter -A INPUT -p udp -d 224.2.127.254 --dport 9875 -j ACCEPT
 
# pouvoir utiliser GnomeMeeting
 sudo iptables -t filter -A INPUT -p tcp --dport 30000:33000 -j ACCEPT
 sudo iptables -t filter -A INPUT -p tcp --dport 1720 -j ACCEPT
 sudo iptables -t filter -A INPUT -p udp --dport 5000:5006 -j ACCEPT
 


Bon, la on en est qu'au début mais ce script si petit soit il constitue déjà une première barrière que nous allons faire évoluer, Il reste a voir et ajouter des modules supplémentaire comme ip_conntrak, ip_conntrack_ftp pour le suivit des connexions...
je finirai plus tard car il reste de nombreuses choses a faire, nous n'avons la que la moitié de la base.

Voici mes quelques sources :

Un tuto hyper complet

Encore un ici

Et biensur les pages de man
 
 
Note: Aucune note
(0 note)
Ecrit par: le furtif, Le: 12/10/08