iptables en passerelle ou gateway

Tags:: firewall :: linux

Je vous parlais de iptables dans le ticket http://www.metal3d.org/index.php/blog/ticket/2008/09/18/Iptables-firewall-puissant. Nous avons vu comment filtrer des paquets afin d'autoriser ou non l'accès à certains ports de la machine. Nous n'avons pas parlé de "forwarding", de "masquerade"... bref, nous n'avons pas encore le "NAT" (Network Address Translation)

Comme son nom l'indique, le NAT permet de modifier les paquets afin de changer l'adresse source et/ou de destination. Cela va permettre de créer une passerelle (gateway) entre deux réseaux par exemple. Mieux encore, nous allons pouvoir dispatcher les appels sur d'autres serveur.

Afin de permettre le noyau linux de traduire les ip, il faut placer le chiffre "1" dans le fichier /proc/sys/net/ipv4/ip_forward. Cela se résume à faire


echo 1 > /proc/sys/net/ipv4/ip_forward
 

Pour faire cela, vous devez être "root". sudo ne marchera pas directement, donc les ubunteros devront faire:


sudo -s
echo 1 > /proc/sys/net/ipv4/ip_forward
 

Voilà qui est fait. Reste à charger les modules au noyau qui vont permettre le NAT de fonctionner:


modprobe iptable_nat
 

A partir de là vous allez pouvoir faire du NAT. Il existe deux NAT: DNAT et SNAT pour Destination NAT et Source NAT.

Le premier, DNAT, modifie les paquets réseau en changeant la destination du paquet. Par exemple, si un paquet demande d'aller sur la machine 192.168.0.1 on pourra en fait le faire transiter vers 192.168.0.2. Le client n'y verra que du feu et pensera qu'il a vraiment utilisé 192.168.0.1.

Le second, SNAT, change non plus la destination mais la source. Cela permet de faire croire à la machine qui va reçevoir le paquet que son client est quelqu'un d'autre. Par exemple si un client (192.168.0.10) veut aller sur 192.168.0.20. Le routeur change l'adresse source (celle du client) en 192.168.0.11 par exemple. La machine 192.168.0.20 croit recevoir le paquet depuis cette adresse.

Dans les deux cas, SNAT ou DNAT, les réponses arrivent bel et bien sur le client après coup. Le système est quasi transparent.

Comment allons nous faire cela avec iptables ? Pour le moment, nous n'avions utilisé iptables qu'avec la table "filter" (par défaut), iptables peut utiliser une table "NAT" en appelant l'option -t nat: iptables -t nat -A ....

Deux chaînes vont nous servir: POSTROUTING et PREROUTING. Les règles à utiliser seront DNAT et SNAT.

La chaîne PREROUTING servira à modifier les paquets avant de leur donner la route à prendre: parfait pour le DNAT.
La chaîne POSTROUTING servira à modifier les paquets après leur avoir donné la route de destination: parfait pour le SNAT.

Reste à voir comment cela se passe:


iptales -t nat -A PREROUTING -d (adresses de destination) --to-destination (ip de destination modifiée) -j DNAT
iptales -t nat -A POSTROUTING -s (adresses sources d'entrée) -j SNAT --to-source (adresse source à appliquer)
 

Prenons un exemple:
Nous avons un LAN dont les adresses sont en classe A (192.168.0.0/24), notre pc qui va faire office de routeur aura 2 carte réseau.\

  • La carte eth0 est connecté au LAN
  • La carte eth1 est connecté au net (ip publique que nous noterons xx.xx.xx.xx)


 +----------------+                                     +----------+
 | 192.168.0.0/24 | ------ eth0 [routeur] eth1 -------- | Internet |
 +----------------+                       xx.xx.xx.xx   +----------+

 

Créer une passerelle entre le LAN et le net avec iptables se résume à faire croire au net que c'est le routeur qui envoi les paquets. Il faut donc changer l'adresse source des paquets sortant pour leur donner l'adresse ip publique du routeur:


iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source xx.xx.xx.xx
 

En bref, tout ce qui veut sortir par eth1 devra changer son ip source en "xx.xx.xx.xx"

Reste une chose: autoriser le "forwarding" puisque les paquets vont essayer de transiter directement.
Pour faire simple, autorisez le forward en règle par défaut:


iptables -P FORWARD ACCEPT
 

Vous pourrez bloquer le forward par la suite et configurer le FORWARD plus proprement. Je vous montrera ça en bas de l'article.

Une autre méthode, peut-être plus simple, est le MASQUERADE, en d'autres termes, tout les paquets vont prendre l'adresse de sortie de routeur automatiquement. Cela reste du SNAT, mais on appelle iptables de cette manière:


iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
 

Notez que le module prévu au "masquerade" n'est pas forcément chargé, regardez avec lsmod | grep masq si vous voyez un module ipt_masquerade. Si ce n'est pas le cas, chargez le:


modprobe ipt_MASQUERADE
 

Reste le FORWARDING à modifier pour le rendre plus propre. Pour le moment, nous acceptons le forward dans tous les sens... Ce n'est pas très joli mais ça marche. Le mieux reste donc d'autoriser le forward que dans les cas utiles:


iptables -P FORWARD DROP
#[...]
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#[...]
 

En d'autre terme, je n'ai autorisé les nouveaux forwards que depuis le lan vers internet. Je laisse aussi les retours de paquets (related, established) autorisés dans l'autre sens.

Il est inutile de forwarder les paquets de eth0 sur lui même, et de eth1 sur lui même, la règle par défaut empêchera cela.
Le cas échéant, si vous avez une politique plus souple:


iptables -P FORWARD ACCEPT
iptables -A FORWARD -i eth0 -o eth0 -j DROP
iptables -A FORWARD -i eth1 -o eth1 -j DROP
 

Ces règles ne font que refuser le forward sur une carte en redondance.

Allez, pour la forme, un petit script qui me permet de router les paquet du lan connecté sur ma carte eth0 vers un autre réseau connecté en wifi (carte ath0):


#!/bin/bash


# +----------------+                                 +----------------+
# | 192.168.0.0/24 | ------ eth0 [router] ath0 ----- | 192.168.2.0/24 |
# +----------------+                                 +----------------+




LAN="eth0"
OUT="ath0"

#empty known rules
iptables -F
iptables -t nat -F
iptables -X

### Default policies:
#DROP input and forward if they are not filtered
iptables -P INPUT DROP
iptables -P FORWARD DROP

#for now, accept output
iptables -P OUTPUT ACCEPT


### Basics rules
#Rules to allow connections on loopback (localhost ==> 127.0.0.1)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#allow ping
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT


#### Gateway
#allow new or established or related connections
iptables -A INPUT -m state --state NEW  -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 

#allow forward from the lan to outside
iptables -A FORWARD -i $LAN -o $OUT -j ACCEPT

#allow forward from outside to lan if connection is established or related
iptables -A FORWARD -i $OUT -o $LAN -m state --state ESTABLISHED,RELATED -j ACCEPT

#if you don't know your outside interface ip:
#this rule does the "masquerade" ==> changes packets ip
iptables -t nat -A POSTROUTING -o $OUT -j MASQUERADE

#if you know your outside interface ip, replace xx.xx.xx.xx by your ip:
#and comment the previous rule
#iptables -t nat -A POSTROUTING -o $OUT -j SNAT --to xx.xx.xx.xx

#Don't allow forward from output to output
iptables -A FORWARD -i $OUT -o $OUT -j REJECT


### System
# Turn on IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
 

Dernière chose: vos pc sur le lan doivent connaître la route pour aller sur le réseau exterieur. N'oubliez pas de leur donner ces routes, ou configurez le DHCP pour les assigner automatiquement.

Voici comment donner la route par défaut vers notre routeur:


route add default gw ip.du.routeur.sur.eth0
 

Sinon, si le réseau exterieur au lan est un réseau privé, il suffit de noter l'adresse de réseau et de l'ajouter aux routes du client. Par exemple, si le réseau sur eth1 est de type 192.168.1.0/24 alors que sur eth0 nous sommes sur un réseau 192.168.0.0/24:



 +----------------+                        +----------------+
 | 192.168.0.0/24 | ------ [routeur] ----- | 192.168.1.0/24 |
 +----------------+                        +----------------+

 

La route à donner aux machines sur 192.168.0.0/24 est:


route add 192.168.1.0/24 via ip.du.routeur.sur.eth0
 

Ce fut donc notre seconde introspection en ce qui concerne iptables. N'oubliez pas de lire les documentations sur le net, ou la page de man.

Ressources:

Utilisez le code barre pour ouvrir le ticket dans votre mobile:
This ticket on you mobile

Pas de commentaire pour le moment

Ajouter un commentaire
Veuillez répondre à la question suivante : Taper "geek" sans les guillemets

Trackbacks

Pour ajouter un trackback (retrolien) sur ce ticket, utilisez cette adresse: http://www.metal3d.org/index.php/trackback/default/tb?id=blog%2F125

Tags

Blog Copix Communication PC Config Fedora Vidéo Humour Autre Web Materiel Informatique PHP Développement Mootools HTML Linux WEB IE CSS Vista Microsoft Sympa XHTML Quizz Widget Klik CWE Voeux Bonne année Musique CCRMA Son Audio MAO Reconnaissance vocale Windows Mac Compiz MacOS Mysql Sun Base de données BD Screenlets Screenlet RPM compiz Ubuntu Live FireFox Derambarsh Facebook media informations Sécurité javascript SSH Commande Marketing concours ipod wii QT Trooltech Nokia Libre Logiciels GPL Attali Gnome Dock Compiler Bench undelete reiserfs recovery recover Thread Serveur Optimisation Server Apache Album RSS Flash Air XML Firefox Blender Opensource Orange Internet LiveBox Animaux Droits Logiciels Libres Google Loi RBS netcat Bash Téléphone Spam 3D NIDIA Standards Widgets Merise UML Streaming Developpement Perl MySQL Firewall Parfeu Bayes Novell Réseau Python LVS Salon FTP Dedibox Chrome Administration IRC Gentoo troll video Nouveauté Finance Etudiant spéctacle OpenOffice Javascript Java Info Eclpise ATI design mootools KDE Bureau Design GNU C Pages Jaunes Fun Bijoux Art mail Admin vmware fedora linux VirtualBox VMWare Qemu KVM vim Grep Fglrx Webkit GTK google web JQuery Coup de gueule coup de gueule Lois SVG Raycaster Canvas Hadopi Desktop Jeux Les Sims développement astuces Screen firefox Mobile Safaru Wine bash commande astuce Wave ooc C++ C# Netbook Hercules Bureautique Twitter Safari W3C chrome kazehakaze midori navigateur gecko webkit Links Liens Pyhon Nouvelles Metal Perso Conférence JDLL PCC Roadsend OOC News Acteur Cinéma Chanteur Seven windows orthographe pcc php jdll Slide Application mysql Html twitter python screen curses SVN Android Gphone iPhone OpenGL MindMap Projet Javascrtip Ajax Guitare Tab Tablature JSON firebug Chromium Iphone Titanium music sound android ogg ogv streaming Arkyne svn subversion gnome VLC Tv encoder ffmpeg Cryptage apple microsoft HTML5 Max Apple code youtube quvi git uzbl webgl chromium

  Catalogue professionnel de musique libre


  • twitter entries...
follow me on Twitter

Valid XHTML 1.0 Strict

tumblr visitor