<?xml version="1.0" encoding="ISO-8859-15"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<article lang="fr">
  <!--$Id$-->

  <articleinfo>
    <title>Shorewall et pont filtrant</title>

    <subtitle>Version Française de <foreignphrase lang="en"><ulink
    url="http://www.shorewall.net/bridge.html">Shorewall and Bridged
    Firewalls</ulink></foreignphrase></subtitle>

    <authorgroup>
      <author>
        <firstname>Tom</firstname>

        <surname>Eastep</surname>
      </author>

      <othercredit role="translator">
        <firstname>Guy</firstname>

        <surname>Marcenac</surname>

        <contrib>Adaptation française</contrib>
      </othercredit>
    </authorgroup>

    <pubdate><?dbtimestamp format="Y/m/d"?></pubdate>

    <copyright>
      <year>2004-2006</year>

      <holder>Thomas M. Eastep</holder>

      <holder>Guy Marcenac</holder>
    </copyright>

    <legalnotice>
      <para>Permission est accordée de copier, distribuer et/ou modifier ce
      document selon les termes de la Licence de Documentation Libre GNU (GNU
      Free Documentation License), version 1.2 ou toute version ultérieure
      publiée par la Free Software Foundation ; sans section Invariables, sans
      première de Couverture, et sans texte de quatrième de couverture. Une
      copie de la présente Licence est incluse dans la section intitulée. Une
      traduction française de la licence se trouve dans la section
      <quote><ulink url="http://cesarx.free.fr/gfdlf.html">Licence de
      Documentation Libre GNU</ulink></quote>. Ce paragraphe est une
      traduction française pour aider à votre compréhension. Seul le texte
      original en anglais présenté ci-dessous fixe les conditions
      d'utilisation de cette documentation.</para>

      <para>Permission is granted to copy, distribute and/or modify this
      document under the terms of the GNU Free Documentation License, Version
      1.2 or any later version published by the Free Software Foundation; with
      no Invariant Sections, with no Front-Cover, and with no Back-Cover
      Texts. A copy of the license is included in the section entitled
      <quote><ulink url="GnuCopyright.htm">GNU Free Documentation
      License</ulink></quote>.</para>
    </legalnotice>
  </articleinfo>

  <note>
    <para><emphasis role="underline">Notes du traducteur :</emphasis> Si vous
    trouvez des erreurs ou si vous avez des améliorations à apporter à cette
    documentation vous pouvez <ulink url="mailto:guy@posteurs.com">me
    contacter</ulink>.</para>
  </note>

  <caution>
    <para><emphasis role="bold">Cet article s'applique à Shorewall 3.0 et à
    ses versions ultérieures. Si vous utilisez une version plus ancienne de
    Shorewall, référez-vous à la documentation s'appliquant à votre
    version.</emphasis></para>
  </caution>

  <section>
    <title>Contexte</title>

    <para>Les systèmes sur lesquels tourne Shorewall fonctionnent en général
    comme des routeurs. Dans le modèle de référence OSI (Open System
    Interconnect), un routeur opère au niveau 3. Shorewall peut également être
    déployé sur un système GNU Linux se comportant comme un pont (bridge). Les
    ponts sont des équipements de niveau 2 dans le modèle OSI (pensez à un
    pont comme à un switch ethernet).</para>

    <para>Voici quelques-unes des différences entre les routeurs et les
    ponts:</para>

    <orderedlist>
      <listitem>
        <para>Les routeurs déterminent la destination d'un paquet en fonction
        de l'adresse IP de destination alors que les ponts routent le trafic
        en fonction de l'adresse MAC de destination de la trame
        ethernet.</para>
      </listitem>

      <listitem>
        <para>Par conséquent, les routeurs peuvent être connectés à plusieurs
        réseaux IP alors qu'un pont ne peut appartenir qu'à un seul
        réseau.</para>
      </listitem>

      <listitem>
        <para>Dans la plupart des configurations, les routeurs ne font pas
        suivre les paquets de diffusion (broadcast) alors que les ponts le
        font.</para>

        <note>
          <para>Les conditions dans lesquelles un routeur peut ou doit faire
          suivre les paquets de diffusion sont décrites dans la section 4 de
          la RFC 1812.</para>
        </note>
      </listitem>
    </orderedlist>
  </section>

  <section>
    <title>Pré-requis système</title>

    <warning>
      <para><emphasis role="bold">LE SUPPORT POUR LES PONTS TEL QU'IL EST
      DECRIT DANS CET ARTICLE RISQUE D'ETRE ABANDONNE.</emphasis> Les
      fonctions sous-jacentes de netfilter sur lesquelles le pont filtrant de
      Shorewall reposent sont en train d'être abandonnées et il n'est pas
      certain que Shorewall puisse continuer à supporter les ponts filtrants
      tels qu'ils sont décrits ici.</para>

      <para>Dans <ulink url="NewBridge.html">un autre article (en
      aglais)</ulink>, je décris comment configurer avec Shorewall un
      pont-routeur qui fonctionnera avec les versions futures du
      kernel.</para>
    </warning>

    <para>N'importe quelle version de Shorewall fera l'affaire si vous avez
    besoin d'un pont mais que vous n'avez pas besoin de restreindre le trafic
    à travers ce pont. Pour plus de détails, reportez vous à la <ulink
    url="SimpleBridge.html">Documentation pour un pont simple</ulink>.</para>

    <para>Pour utiliser Shorewall comme pont filtrant:</para>

    <itemizedlist>
      <listitem>
        <para>Votre noyau doit être compilé avec le support pour les ponts
        (CONFIG_BRIDGE=m ou CONFIG_BRIDGE=y).</para>
      </listitem>

      <listitem>
        <para>Votre noyau doit comprendre l'intégration bridge/netfilter
        (CONFIG_BRIDGE_NETFILTER=y).</para>
      </listitem>

      <listitem>
        <para>Votre noyau doit être compilé avec le support pour les
        correspondances physdev de Netfilter (CONFIG_IP_NF_MATCH_PHYSDEV=m ou
        CONFIG_IP_NF_MATCH_PHYSDEV=y). Le support des correspondances physdev
        est en standard dans le noyau 2.6 mais doit être patché dans les
        noyaux 2.4 (voir <ulink
        url="http://linux-net.osdl.org/index.php/Bridge">icit</ulink>). Les
        utilisateurs de Bering et de Bering uCLibc doivent trouver et
        installer ipt_physdev.o pour leur distribution puis ajouter
        <quote>ipt_physdev</quote> au fichier
        <filename>/etc/modules</filename>.</para>
      </listitem>

      <listitem>
        <para>Votre version d'<command>iptables</command> doit offrir le
        support pour les correspondances physdev. Ceci est le cas avec
        iptables 1.2.9 et toutes ses versions ultérieures.</para>
      </listitem>

      <listitem>
        <para>Vous devez avoir installé le paquetage des utilitaires pour les
        ponts (bridge-utils).</para>
      </listitem>
    </itemizedlist>
  </section>

  <section>
    <title>Application</title>

    <para>Le diagramme au dessous présente une application classique d'un
    pont/firewall. Il y a déjà un routeur installé qui supporte un réseau
    local sur son interface interne et vous voulez insérer un firewall entre
    ce routeur et les systèmes de ce réseau local. Dans notre exemple, le
    réseau local utilise des adresses de la RFC 1918 mais ceci n'est pas
    obligatoire. Le pont marcherait de la même façon si on utilisait des
    adresses IP publiques (n'oubliez pas qu'un pont ne s'occupe pas d'adresses
    IP).</para>

    <graphic fileref="images/bridge.png" />

    <para>Il existe des différences clé entre cette configuration et une
    configuration normale de Shorewall:</para>

    <itemizedlist>
      <listitem>
        <para>Le système Shorewall Pont/Firewall ne possède qu'une seule
        adresse IP même si il dispose de deux interfaces ethernet ! Cette
        adresse IP est configurée sur le pont même au lieu de l'être sur l'une
        des cartes réseau.</para>
      </listitem>

      <listitem>
        <para>Les systèmes connectés au LAN sont configurés avec l'adresse du
        routeur IP (192.168.1.254 dans notre exemple) comme passerelle par
        défaut.</para>
      </listitem>

      <listitem>
        <para><command>traceroute</command> ne détectera pas le Pont/Firewall
        comme un routeur intermédiaire</para>
      </listitem>

      <listitem>
        <para>Si le routeur exécute un serveur DHCP, les hôtes connectés au
        réseau local peuvent utiliser ce serveur sans avoir à exécuter
        <command>dhcrelay</command> sure le Pont/Firewal.</para>
      </listitem>
    </itemizedlist>

    <warning>
      <para>L'insertion d'un pont filtrant entre un routeur et un ensemble
      d'hôtes locaux ne fonctionne que si ces machines locales forment un
      réseau IP unique. Dans le schéma ci-dessus, tous les hôtes dans la zone
      loc sont dans le réseau 192.168.1.0/24. Si le routeur doit router entre
      plusieurs réseaux locaux par la même interface physique (plusieurs
      réseaux IP partagent le même réseau local), l'insertion d'un pont
      filtrant entre le routeur et le réseau local ne fonctionnera pas.</para>
    </warning>

    <para>Voici d'autres possibilités -- Il pourrait y avoir un hub ou un
    switch entre le routeur et le Pont/Firewall, et il pourrait y avoir
    d'autres systèmes connectés à ce hub ou ce switch. Tous les systèmes du
    coté local du routeur devraient toujours être configurés avec des adresses
    IP prises dans 192.168.1./24.<graphic
    fileref="images/bridge3.png" /></para>
  </section>

  <section>
    <title>Configuration du pont</title>

    <para>Configure le pont est une chose assez simple. On se sert de
    l'utilitaire <command>brctl</command> issu du paquetage bridge-utils. Vous
    trouverez des informations sur la configuration d'un pont à <ulink
    url="http://linux-net.osdl.org/index.php/Bridge">http://linux-net.osdl.org/index.php/Bridge</ulink>.</para>

    <para>Malheureusement peu de distributions Linux ont de bons outils de
    configuration pour un pont et les outils de configuration réseau
    graphiques ne détectent pas la présence d'un pont. Voici l'extrait d'un
    fichier de configuration Debian pour un pont à deux interfaces et ayant
    une adresse IP statique:</para>

    <blockquote>
      <programlisting>auto br0
iface br0 inet static
        address 192.168.1.253
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        pre-up /sbin/ip link set eth0 up
        pre-up /sbin/ip link set eth1 up
        pre-up /usr/sbin/brctl addbr br0
        pre-up /usr/sbin/brctl addif br0 eth0
        pre-up /usr/sbin/brctl addif br0 eth1</programlisting>
    </blockquote>

    <para>Bien qu'il ne soit pas obligatoire de donner une adresse IP à un
    pont, le faire permet au Pont/Firewall d'accéder à d'autres systèmes et
    permet également l'administration distante du pont. Le pont doit aussi
    avoir une adresse IP pour que les politiques et les règles REJECT
    fonctionnent correctement - sinon les règles REJECT se comporteront
    exactement de la même manière que des règles DROP. Enfin, si un pont fait
    partie d'un <link linkend="bridge-router">Pont/Routeur</link>, il est
    également indispensable de lui donner une adresse IP.</para>

    <important>
      <para>Avant de configurer Shorewall, assurerez-vous d'avoir un pont qui
      fonctionne et qui se lance au boot.</para>
    </important>

    <para>On peut attribuer une adresse IP au pont par DHCP.</para>

    <para>Voici un fichier
    <filename>/etc/sysconfig/network/ifcfg-br0</filename> issu d'un système
    <trademark>SUSE</trademark>:</para>

    <blockquote>
      <programlisting>BOOTPROTO='dhcp'
REMOTE_IPADDR=''
STARTMODE='onboot'
UNIQUE='3hqH.MjuOqWfSZ+C'
WIRELESS='no'
MTU=''</programlisting>
    </blockquote>

    <para>Voici un fichier
    /<filename>etc/sysconfig/network-scripts/ifcfg-br0</filename> issu d'un
    système <trademark>Mandriva</trademark>:</para>

    <blockquote>
      <programlisting>DEVICE=br0
BOOTPROTO=dhcp
ONBOOT=yes</programlisting>
    </blockquote>

    <para>Aussi bien sur les systèmes <trademark>SUSE</trademark> que sur les
    systèmes Mandriva, il faudra un script séparé pour configurer le
    pont.</para>

    <para>Voilà les scripts dont je me sers sur un système
    <trademark>SUSE</trademark> 9.1.</para>

    <blockquote>
      <para><filename>/etc/sysconfig/network/ifcfg-br0</filename></para>

      <programlisting>BOOTPROTO='dhcp'
REMOTE_IPADDR=''
STARTMODE='onboot'
UNIQUE='3hqH.MjuOqWfSZ+C'
WIRELESS='no'
MTU=''</programlisting>

      <para><filename>/etc/init.d/bridge</filename><programlisting>#!/bin/sh

################################################################################
#   Script to create a bridge
#
#     (c) 2004 - Tom Eastep (teastep@shorewall.net)
#
#   Modify the following variables to match your configuration
#
#### BEGIN INIT INFO
# Provides:       bridge
# Required-Start: coldplug
# Required-Stop:
# Default-Start:  2 3 5
# Default-Stop:   0 1 6
# Description:    starts and stops a bridge
### END INIT INFO
#
# chkconfig: 2345 05 89
# description: GRE/IP Tunnel
#
################################################################################


PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin

INTERFACES="eth1 eth0"
BRIDGE="br0"
MODULES="tulip"

do_stop() {
    echo "Stopping Bridge $BRIDGE"
    brctl delbr $BRIDGE
    for interface in $INTERFACES; do
        ip link set $interface down
    done
}

do_start() {

      echo "Starting Bridge $BRIDGE"
      for module in $MODULES; do
          modprobe $module
      done

      sleep 5

      for interface in $INTERFACES; do
          ip link set $interface up
      done

      brctl addbr $BRIDGE

      for interface in $INTERFACES; do
          brctl addif $BRIDGE $interface
      done
}

case "$1" in
  start)
      do_start
    ;;
  stop)
      do_stop
    ;;
  restart)
      do_stop
      sleep 1
      do_start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac
exit 0</programlisting></para>
    </blockquote>

    <para>Voici une contribution de Axel Westerhold qui propose cet exemple de
    configuration d'un pont ayant une adresse statique sur un système Fedora
    (Core 1 and Core 2 Test 1). Remarquez que ces fichiers configurent
    également le pont ce qui évite d'avoir à écrire un script de configuration
    séparé.</para>

    <blockquote>
      <para><filename>/etc/sysconfig/network-scripts/ifcfg-br0:</filename></para>

      <programlisting>DEVICE=br0
TYPE=Bridge
IPADDR=192.168.50.14
NETMASK=255.255.255.0
ONBOOT=yes</programlisting>

      <para><filename>/etc/sysconfig/network-scripts/ifcfg-eth0:</filename><programlisting>DEVICE=eth0
TYPE=ETHER
BRIDGE=br0
ONBOOT=yes</programlisting><filename>/etc/sysconfig/network-scripts/ifcfg-eth1:</filename><programlisting>DEVICE=eth1
TYPE=ETHER
BRIDGE=br0
ONBOOT=yes</programlisting></para>
    </blockquote>

    <para>Florin Grad de <trademark>Mandriva</trademark> fournit ce script
    pour configurer un pont:</para>

    <blockquote>
      <programlisting>#!/bin/sh
# chkconfig: 2345 05 89
# description: Layer 2 Bridge
#

[ -f /etc/sysconfig/bridge ] &amp;&amp; . /etc/sysconfig/bridge

PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin

do_stop() {
    echo "Stopping Bridge"
    for i in $INTERFACES $BRIDGE_INTERFACE ; do
    	ip link set $i down
    done
    brctl delbr $BRIDGE_INTERFACE
}

do_start() {

   echo "Starting Bridge"
   for i in $INTERFACES ; do
        ip link set $i up
   done
   brctl addbr br0
   for i in $INTERFACES ; do
        ip link set $i up
        brctl addif br0 $i 
   done
   ifup $BRIDGE_INTERFACE 
}

case "$1" in
  start)
      do_start
    ;;
  stop)
      do_stop
    ;;
  restart)
      do_stop
      sleep 1
      do_start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac
exit 0</programlisting>

      <para>Le fichier <filename>/etc/sysconfig/bridge</filename>:</para>

      <programlisting>BRIDGE_INTERFACE=br0          #The name of your Bridge
INTERFACES="eth0 eth1"        #The physical interfaces to be bridged</programlisting>
    </blockquote>

    <para>Andrzej Szelachowski a proposé la contribution suivante:</para>

    <blockquote>
      <programlisting>Here is how I configured bridge in Slackware:

1) I had to compile bridge-utils (It's not in the standard distribution)
2) I've created rc.bridge in /etc/rc.d:

#########################
#! /bin/sh

ifconfig eth0 0.0.0.0
ifconfig eth1 0.0.0.0
#ifconfig lo 127.0.0.1 #this line should be uncommented if you don't use rc.inet1

brctl addbr most

brctl addif most eth0
brctl addif most eth1

ifconfig most 192.168.1.31 netmask 255.255.255.0 up 
#route add default gw 192.168.1.1 metric 1 #this line should be uncommented if
                                           #you don't use rc.inet1
#########################

3) I made rc.brige executable and added the following line to /etc/rc.d/rc.local

/etc/rc.d/rc.bridge </programlisting>
    </blockquote>

    <para>Joshua Schmidlkofer a écrit:</para>

    <blockquote>
      <programlisting>Bridge Setup for Gentoo

#install bridge-utils
emerge bridge-utils

## create a link for net.br0
cd /etc/init.d
ln -s net.eth0 net.br0

# Remove net.eth*, add net.br0 and bridge.
rc-update del net.eth0
rc-update del net.eth1
rc-update add net.br0 default
rc-update add bridge boot



/etc/conf.d/bridge:

  #bridge contains the name of each bridge you want created.
  bridge="br0"

  # bridge_&lt;bridge&gt;_devices contains the devices to use at bridge startup.
  bridge_br0_devices="eth0 eth1"

/etc/conf.d/net

   iface_br0="10.0.0.1     broadcast 10.0.0.255 netmask 255.255.255.0"
   #for dhcp:
   #iface_br0="dhcp"
   #comment this out if you use dhcp.
   gateway="eth0/10.0.0.1" </programlisting>
    </blockquote>

    <para>Les utilisateurs qui réussissent dans la configuration d'un pont sur
    d'autres distributions que celles présentées plus haut, sont encouragés à
    <ulink url="mailto:webmaster@shorewall.net">m'envoyer</ulink> leurs
    configurations afin que je puisse les publier ici.</para>
  </section>

  <section>
    <title>Configuration de Shorewall</title>

    <para>Dans Shorewall, on active le mode Pont avec l'option BRIDGING du
    fichier <filename>/etc/shorewall/shorewall.conf</filename>:</para>

    <programlisting>BRIDGING=Yes</programlisting>

    <para>Dans le scénario présenté plus haut, il y aurait probablement deux
    zones définies. - une pour internet et une pour le réseau local, ce qui
    donnerait un fichier <filename>/etc/shorewall/zones</filename> comme
    celui-ci:</para>

    <programlisting>#ZONE   TYPE            OPTIONS
fw      firewall
net     ipv4
loc     ipv4
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE</programlisting>

    <para>Une politique habituelle à deux zones est parfaitement adaptée à ce
    cas &mdash; <filename>/etc/shorewall/policy</filename>:</para>

    <programlisting>#SOURCE     DEST        POLICY        LOG       LIMIT:BURST
loc         net         ACCEPT
net         all         DROP          info
all         all         REJECT        info
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE</programlisting>

    <para>Puisque c'est le pont lui-même qui est configuré avec une adresse
    IP, seul ce dispositif doit être défini pour Shorewall dans
    <filename>/etc/shorewall/interfaces</filename>:</para>

    <programlisting>#ZONE    INTERFACE      BROADCAST       OPTIONS
-       br0             192.168.1.255
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE</programlisting>

    <para>Les zones sont définies en utilisant le fichier
    <filename>/etc/shorewall/hosts</filename>. En supposant que le routeur est
    connecté à <filename class="devicefile">eth0</filename> et que le switch
    est connecté à <filename class="devicefile">eth1</filename>:</para>

    <programlisting>#ZONE           HOST(S)                         OPTIONS
net             br0:eth0
loc             br0:eth1
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS LINE -- DO NOT REMOVE</programlisting>

    <para>Même lorsque Shorewall est arrêté, vous voudrez probablement
    autoriser le trafic à transiter par le pont &mdash;
    <filename><filename>/etc/shorewall/routestopped</filename></filename>:</para>

    <programlisting>#INTERFACE      HOST(S)         OPTIONS
br0             192.168.1.0/24  routeback
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE</programlisting>

    <para>Pour la définition de votre jeu de règles pour votre firewall, vous
    pouvez prendre comme point de départ le fichier
    <filename>/etc/shorewall/rules</filename> présenté dans l'exemple de
    Firewall à Deux Interfaces.</para>
  </section>

  <section id="bridge-router">
    <title>Combinaison Pont/Routeur</title>

    <para>Un système Shorewall n'a pas à s'exécuter exclusivement comme un
    pont ou bien comme un routeur -- il peut parfaitement faire les deux.
    Voici un exemple:<graphic fileref="images/bridge2.png" /></para>

    <para>Il s'agit quasiment de la même configuration que celle présentée
    dans le <ulink url="shorewall_setup_guide_fr.htm">Guide de Configuration
    de Shorewall</ulink> si ce n'est que la DMZ utilise un pont plutôt qu'un
    Proxy ARP. Les modifications à apporter à la configuration présentée dans
    le Guide de Configuration sont les suivants:</para>

    <orderedlist>
      <listitem>
        <para>Le fichier <filename>/etc/shorewall/proxyarp</filename> doit
        être vide dans cette configuration.</para>
      </listitem>

      <listitem>
        <para>Le fichier <filename>/etc/shorewall/interfaces</filename>
        ressemble à ceci:<programlisting>#ZONE    INTERFACE      BROADCAST     OPTIONS
-        br0            detect        routefilter
loc      eth1           detect</programlisting></para>
      </listitem>

      <listitem>
        <para>Le fichier <filename>/etc/shorewall/hosts</filename> devrait
        avoir:</para>

        <programlisting>#ZONE    HOSTS                        OPTIONS
net      br0:eth0
dmz      br0:eth2</programlisting>
      </listitem>

      <listitem>
        <para>Les systèmes en DMZ ont besoin d'avoir une route par 192.0.2.176
        vers le réseau 192.168.201.0/24 afin qu'ils puissent communiquer avec
        le réseau local.</para>
      </listitem>
    </orderedlist>
  </section>

  <section>
    <title>Limites</title>

    <para>Avec certaines cartes sans fil, le mode pont ne fonctionne pas
    &mdash; vous pouvez regarder à <ulink
    url="http://linux-net.osdl.org/index.php/Bridge">http://linux-net.osdl.org/index.php/Bridge</ulink>.</para>
  </section>

  <section>
    <title>Liens</title>

    <itemizedlist>
      <listitem>
        <para><ulink
        url="http://wiki.buenosaireslibre.org/HowTos_2fBridgedFirewall">Vous
        trouverez ici un article en Espagnol</ulink> qui présente de manière
        détaillée comment <quote>ponter</quote> un réseau public et un réseau
        local avec Shorewall. Il s'agit d'une autre configuration en
        Pont/Routeur.</para>
      </listitem>
    </itemizedlist>
  </section>
</article>