<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
<!ENTITY howto         "http://www.traduc.org/docs/HOWTO/lecture/">
<!ENTITY mini-howto    "http://www.traduc.org/docs/HOWTO/mini/lecture/">
]>

<article id="TransparentProxy" lang="fr">

        <articleinfo>

                <title>
                                Petit guide de mise en place d'un mandataire transparent avec 
                                Linux et Squid
                </title>
                <subtitle>
                                Version française du <foreignphrase>Transparent Proxy with 
                                Linux and Squid mini-HOWTO</foreignphrase>
                </subtitle>

                <author>
                        <firstname>Daniel</firstname>
                        <surname>Kiracofe</surname>
                </author>

                <othercredit role="traduction">
                        <firstname>Geneviève</firstname>
                        <surname>Gracian</surname>
                        <affiliation>
                                <address><email>ggracian CHEZ free POINT fr</email></address>
                        </affiliation>
                        <contrib>Traduction française</contrib>
                </othercredit>

                <othercredit role="relecture">
                        <firstname>Jean-Philippe</firstname>
                        <surname>Guérard</surname>
                        <affiliation>
                                <address><email>jean TIRET philippe POINT guerard CHEZ corbeaunoir POINT org</email></address>
                        </affiliation>
                        <contrib>Relecture de la version française</contrib>
                </othercredit>

                <revhistory>

                        <revision>
                                <revnumber>1.15.fr.1.0</revnumber>
                                <date>14 juillet 2003</date>
                                <revremark>
                                                Mise à jour de la version française.
                                </revremark>
                        </revision>

                        <revision>
                                <revnumber>1.15</revnumber>
                                <date>août 2002</date>
                        </revision>

                        <revision>
                                <revnumber>1.13.fr.1.0</revnumber>
                                <date>19 janvier 2003</date>
                                <revremark>
                                                Première version française.
                                </revremark>
                        </revision>

                        <revision>
                                <revnumber>1.13</revnumber>
                                <date>janvier 2002</date>
                        </revision>

                </revhistory>

                <abstract>
                        <para>
                                Ce document détaille pas à pas la mise en place d'un serveur 
                                mandataire transparent, en n'utilisant que Linux et Squid.
                                Il traite aussi bien de la configuration du noyau, de la 
                                configuration des règles iptables, de la configuration réseau, 
                                que de la configuration du serveur mandataire lui-même.                         
                        </para>
                </abstract>

        <pubdate>14 juillet 2003</pubdate>
        <releaseinfo>Version 1.15.fr.1.0</releaseinfo>

        </articleinfo>

<!-- 1 introduction-->
        <sect1 id="intro">
                <title>Introduction</title>

                
<!-- 1.1 commentaires-->
                <sect2><!-- id="intro-commentaires"-->

                        <title>Commentaires</title>

                <para>
                                Les commentaires et réactions générales à propos de ce 
                                petit guide sont les bienvenus et peuvent être adressés en 
                                anglais à son auteur Daniel Kiracofe
                                <email>drk CHEZ unxsoft POINT com</email>.
                </para>

                <para>
                                Les commentaires, corrections et suggestions relatifs à la
                                version française de ce document, et aux liens qu'elle contient
                                sont les bienvenus et peuvent être adressés à 
                                <email>commentaires CHEZ traduc POINT org</email>.
                </para>

                </sect2>

<!-- 1.2 droits d'auteur-->
                <sect2><!-- id="intro-copyrights"-->
                        <title>Droits d'auteur et marques déposées</title>

                        <para>
                                Version originale &copy; Daniel Kiracofe 2000-2003.
                        </para>

      <para>
        Version française &copy; Geneviève Gracian &amp; Jean-Philippe 
        Guérard 2002-2003.
                        </para>

                        <para>
                                Ce manuel peut être reproduit pour tout ou partie, sans redevance,
                                moyennant les restrictions suivantes&nbsp;: 
                        </para>

                        <itemizedlist>
        
                                <listitem><para>
                                                La note de copyright ci-dessus et cette liste de restrictions
                                                doivent être intégralement conservées sur toute copie complète ou
                                                partielle.
                                </para></listitem>

                                <listitem><para>
                                                La traduction en un autre langage est autorisée, à condition 
                                                que l'auteur en soit averti avant la traduction.
                                </para></listitem>

                                <listitem><para>
                                                Tout travail dérivé doit être approuvé par écrit par l'auteur
                                                avant publication.
                                </para></listitem>

                                <listitem><para>
                                                Si vous distribuez ce travail en partie seulement, les indications
                                                concernant la manière de se procurer l'intégralité de celui-ci
                                                doivent être incluses et un moyen d'obtenir cette version complète
                                                doit être fourni.
                                </para></listitem>

                                <listitem><para>
                                                De courtes citations peuvent être reproduites dans d'autres 
                                                travaux, à titre d'exemple ou d'illustration, sans inclure cette 
                                                note d'autorisation, à condition qu'il soit fait référence à ce 
                                                document d'une manière appropriée.
                                </para></listitem>

                        </itemizedlist>

                        <para>
                                Des exceptions à ces règles peuvent être concédées dans le 
                                cadre de projets universitaires. Écrivez à l'auteur et demandez. 
                                Ces restrictions sont ici pour nous protéger en tant qu'auteurs, 
                                pas pour vous limiter en tant qu'apprentis et formateurs. Tout 
                                code source (excepté le sgml dans lequel cette documentation a 
                                été écrite) inclus dans ce document est placé sous la licence 
                                publique générale GNU (GPL), récupérable par ftp anonyme depuis 
                                l'archive GNU.
                        </para>

                </sect2>
                
<!-- 1.3 dénégation-->
                <sect2><!-- id="intro-denegation"-->
                        <title>#include &lt;dénégation.h&gt;</title>
                        <para>
                        
                                Aucune garantie explicite ou implicite, et cætera, et cætera,
                                et cætera.
                                
                        </para>
                </sect2>
        </sect1>
        
<!-- 2 vue d'ensemble-->
        <sect1 id="apercu">
                <title>Vue d'ensemble de l'utilisation d'un mandataire transparent</title>

<!-- 2.1 motivation-->
                <sect2><!-- id="apercu-motivation"-->
                        <title>Motivation</title>

                        <para>
                                Lors de l'utilisation d'un mandataire (proxy) 
                                «&nbsp;ordinaire&nbsp;», le client indique à son navigateur le 
                                nom d'hôte et le numéro de port du serveur mandataire.
                                Le navigateur dirige alors ses requêtes vers le serveur 
                                mandataire qui les redirige vers les serveurs cibles. Cependant, de 
                                temps en temps, on se trouve dans l'une des situations suivantes. 
                                Soit&nbsp;:
                        </para>

                        <itemizedlist>

                                        <listitem><para>
                                                vous voulez obliger les clients de votre réseau à 
                                                utiliser le serveur mandataire, qu'ils le veuillent ou 
                                                non&nbsp;;
                                        </para></listitem>

                                <listitem><para>
                                                vous voulez que les clients utilisent le mandataire 
                                                mais vous ne voulez     pas qu'ils le sachent&nbsp;;
                                </para></listitem>

                                <listitem><para>
                                                vous voulez que les clients passent par le serveur 
                                                mandataire, mais vous ne voulez pas faire tout 
                                                le travail nécessaire à la mise à jour des réglages de
                                                centaines ou de milliers de navigateurs.
                                </para></listitem>

                        </itemizedlist>

                        <para>
                                C'est ici que le mandataire transparent entre en scène. Une 
                                requête <foreignphrase>web</foreignphrase> peut être interceptée de façon transparente par le 
                                mandataire. Pour autant que le sache le client, il est en train 
                                de parler au serveur d'origine, alors qu'il communique 
                                en réalité avec le mandataire. (Notez que la transparence ne 
                                s'applique qu'au client&nbsp;; le serveur sait qu'un serveur 
                                mandataire est mis en &oelig;uvre et voit son adresse IP, et 
                                non celle de l'utilisateur.
                                De plus, Squid a la possibilité de transmettre un en-tête 
                                <literal>X-Forwarder-For</literal> au serveur, afin que 
                                celui-ci puisse déterminer l'adresse IP réelle du client).
                        </para>

                        <para>
                                Les routeurs Cisco peuvent être utilisés comme mandataires 
                                transparents ainsi que de multiples commutateurs. D'une manière 
                                assez épatante, Linux peut être configuré comme routeur, et 
                                servir de mandataire transparent en redirigeant les connexions 
                                TCP vers des ports locaux.
                                Cependant, il est nécessaire de s'assurer que le serveur 
                                mandataire soit au courant de cette redirection, afin 
                                qu'il puisse se connecter aux véritables serveurs de 
                                destination. Il existe deux moyens généraux pour cela&nbsp;:
                        </para>

                        <itemizedlist>
                        <listitem><para>
                                Tout d'abord, lorsque le serveur mandataire n'est pas capable 
                                d'agir en tant que mandataire transparent, vous pouvez
                                utiliser un petit démon astucieux appelé Transproxy qui siège 
                                devant le mandataire et s'occupe de tous les détails triviaux à 
                                votre place. Transproxy a été écrit par John Saunders, et peut 
                                être trouvé sur <ulink 
                                url="http://www.transproxy.nlc.net.au/"></ulink>.
                                Transproxy ne sera pas présenté plus en détail dans ce 
                                document.
                        </para></listitem>
                        
                        <listitem><para>
                                Une solution plus propre est d'utiliser un serveur mandataire 
                                directement capable d'agir en tant que mandataire transparent.
                                Celui sur lequel nous allons nous pencher est Squid. Squid est 
                                un serveur mandataire pour Unix, dont les sources sont 
                                publiques, et qui est capable de mémoriser les pages 
                                <foreignphrase>web</foreignphrase>. On peut le trouver sur 
                                <ulink url="http://www.squid-cache.org"></ulink>.
                        </para></listitem>

                        </itemizedlist>

                        <para>
                                Il est également possible, au lieu de rediriger les connexions 
                                vers des ports locaux, de les rediriger vers des ports distants. 
                                Ceci sera traité dans <xref linkend="machine-distante"/>. Les 
                                lecteurs intéressés par ce sujet devraient aller directement à 
                                cette section. Les lecteurs qui souhaitent mettre en 
                                place sur une même machine la redirection et le mandataire 
                                peuvent faire l'impasse sur cette section.
                        </para>

                </sect2>
                
<!-- 2.2 étendue du document-->
                <sect2 id="apercu-etendue">
    <title>Étendue du document</title>
                        <para>
                        
                                Ce document se concentre sur la version 2.4 de Squid ainsi que 
                                sur la version 2.4 du noyau. Ces versions sont les plus récentes 
                                versions stables au moment de son écriture (août 2002). Il 
                                devrait également s'appliquer à la plupart des noyaux 2.3 les 
                                plus récents.
                                Si vous souhaitez utiliser des versions antérieures de Squid ou 
                                de Linux, vous pouvez vous référer à <ulink 
                                url="http://users.gurulink.com/drk/transproxy/"></ulink>. 
                                Notez que ce site a déménagé.
                                
                        </para>
                        <para>
                        
                         Si vous utilisez une version de développement du noyau ou de Squid, vous
                         serez livré à vous-même. Ce document peut vous aider mais c'est 
                         vous qui voyez.
                         
                         </para>
                        <para>
                        
                                Notez que ce document ne traitera que des mandataires HTTP. 
                                Je reçois une foule de messages au sujet de la mise en place de 
                                mandataires FTP transparents. Squid ne possède pas cette 
                                capacité. Il semblerait qu'un programme nommé 
                                Frox le puisse. Je ne l'ai pas essayé, donc j'ignore s'il
                                fonctionne bien. Vous pourrez le trouver sur <ulink 
                                url="http://frox.sourceforge.net/"></ulink>.
                                
                        </para>
                        <para>

                                Ce document se consacre essentiellement à Squid. Cependant, 
                                Apache peut aussi être utilisé comme mandataire avec mémoire des 
                                pages. (Si vous hésitez sur le serveur mandataire à adopter, je 
                                vous recommande Squid. En effet, Squid a été pensé dès le départ 
                                comme serveur mandataire. Apache, de son côté, ne s'est 
                                vu rajouter les fonctionnalités de mandataire qu'après coup). Si 
                                vous désirez utiliser Apache au lieu de Squid, suivez toutes les 
                                instructions de ce document relatives au noyau et aux règles 
                                iptables. Ne tenez pas comptes des sections spécifiques à Squid, 
                                et allez voir les sources et le mode d'emploi du module 
                                mandataire transparent pour Apache sur <ulink 
                                url="http://lupo.campus.uniroma2.it/progetti/mod_tproxy/"></ulink>.
                                (Merci à Cristiano Paris
                                <email>c POINT paris CHEZ libero POINT it</email> pour sa 
                                contribution sur ce point).

                        </para>
                </sect2>
                        
<!-- 2.3 HTTPS-->
                <sect2 id="https">
    <title>HTTPS</title>

                        <para>
                                Enfin, en ce qui concerne la mise en place d'un mandataire 
                                transparent pour HTTPS (par exemple, pour les pages <foreignphrase>web</foreignphrase> 
                                utilisant SSL, TSL, et cætera), <emphasis>vous ne pouvez pas le
                                faire</emphasis>. Ne le demandez même pas. Pour comprendre 
                                pourquoi, effectuez une recherche avec les mots clefs 
                                «&nbsp;attaque de l'intermédiaire caché&nbsp;» 
                                (<foreignphrase>man-in-the-middle attack</foreignphrase>). 
                                Remarquez que, de toutes manières, vous n'avez probablement pas 
                                réellement besoin de rediriger les requêtes HTTPS vers Squid, 
                                dans la mesure où celui-ci ne mémorise pas les pages sécurisés.
                        </para>

                </sect2>
                
<!-- 2.4 Authentification-->
                <sect2 id="authentification">
    <title>Authentification auprès du mandataire</title>
                        <para>
                                Il n'est pas possible de s'authentifier auprès d'un mandataire 
                                transparent. Voyez la <ulink 
                                url="http://www.squid-cache.org/Doc/FAQ/FAQ.html">FAQ 
                                Squid</ulink> pour (un peu) plus de détails.
                        </para>
                </sect2>

        </sect1>
        

<!-- 3 configurer le noyau-->
        <sect1 id="noyau">
                <title>Configurer le noyau</title>

                <para>
                        D'abord, il est nécessaire de s'assurer que notre noyau comporte 
                        les bonnes options de configuration. Si vous utilisez un noyau
                        «&nbsp;prêt-à-porter&nbsp;» fourni par votre distribution, la 
                        gestion de mandataires transparents peut &mdash; ou non &mdash; 
                        être activée. Si vous n'en êtes pas sûr, le mieux à faire est de 
                        sauter cette section et, si les commandes de la prochaine section 
                        vous renvoient des erreurs bizarres, c'est probablement parce que 
                        votre noyau n'est pas correctement configuré.
                </para>
                        
                <para>
                        Si votre noyau n'a pas été compilé avec les options de 
                        configuration permettant la gestion des mandataires transparents, 
                        vous devrez le recompiler. Recompiler un noyau est un processus 
                        complexe (du moins la première fois), et sort du sujet de ce 
                        document. Si vous avez besoin d'aide pour la compilation du noyau, 
                        reportez-vous au <ulink 
                        url="&howto;Kernel-HOWTO.html">Guide pratique du noyau 
                        Linux</ulink>
                </para>

                <para>
                        Les options que vous devez sélectionner lors de la 
                        configuration du noyau sont les suivantes (remarque&nbsp;: si vous 
                        préférez des modules, certaines &mdash; mais pas toutes &mdash; 
                        peuvent être compilées comme modules. Heureusement, tout ce qui 
                        n'est pas modularisable peut être intégré à votre noyau)&nbsp;:
                </para>

<programlisting>
+ Dans «&nbsp;General setup&nbsp;»
        + «&nbsp;Networking support&nbsp;»
        + «&nbsp;Sysctl support&nbsp;»

+ Dans «&nbsp;Networking Options&nbsp;»
        + «&nbsp;Network packet filtering&nbsp;»
        + «&nbsp;TCP/IP networking&nbsp;»

+ Dans «&nbsp;Networking options&nbsp;» -> «&nbsp;IP&nbsp;: Netfilter configuration&nbsp;»
        + «&nbsp;Connection tracking&nbsp;»
        + «&nbsp;IP tables support&nbsp;»
        + «&nbsp;Full NAT&nbsp;»
        + «&nbsp;REDIRECT target support&nbsp;»

+ Dans «&nbsp;File system&nbsp;»
        + «&nbsp;/proc filesystem support&nbsp;»
</programlisting>

                <para>
                        Vous devez répondre <emphasis>non</emphasis> à «&nbsp;Fast 
                        switching&nbsp;» dans «&nbsp;Networking options&nbsp;».
                </para>

                <para>
                        Une fois que vous aurez un nouveau noyau en état de fonctionner, 
                        vous pourrez avoir besoin d'activer le routage IP. Celui-ci permet 
                        à votre ordinateur de faire office de routeur. Dans la mesure où 
                        ce n'est pas ce que l'utilisateur moyen veut faire, cette option 
                        n'est pas activé par défaut et doit être activé de manière
                        explicite au démarrage. Néanmoins, il est possible que votre 
                        distribution le fasse déjà pour vous. Pour le savoir, faites 
                        <userinput>cat&nbsp;/proc/sys/net/ipv4/ip_forward</userinput>. Si vous
                        voyez «&nbsp;1&nbsp;» c'est bon. Sinon, faites
                        <userinput>echo&nbsp;'1'&nbsp;>&nbsp;/proc/sys/net/ipv4/ip_forward</userinput>. 
                        Vous aurez certainement intérêt à ajouter cette commande dans 
                        le script de démarrage approprié (en fonction de votre 
                        distribution, il peut se trouver dans <filename 
                        class="directory">/etc/rc.d</filename>, <filename
                        class="directory">/etc/init.d</filename>, ou carrément ailleurs).
                </para>

  </sect1>
        

<!-- 4 installer Squid-->
  <sect1 id="squid">
                <title>Installer Squid</title>

                <para>
                
                        Il faut maintenant faire fonctionner Squid. Téléchargez 
                        l'archive la plus récente du code source depuis <ulink 
                        url="http://www.squid-cache.org"></ulink>. Assurez-vous que 
                        vous avez bien une version <emphasis>stable</emphasis> et non une 
                        version de développement. La version la plus récente à l'heure où 
                        j'écris ces lignes est squid-2.4.STABLE4.tar.gz. Remarquez qu'à ma 
                        connaissance vous devez utiliser squid-2.4 pour les noyaux 
                        Linux 2.4. La raison en est que le mécanisme par lequel le 
                        processus détermine l'adresse originale de destination a 
                        changé depuis Linux 2.2, et que le code nécessaire 
                        n'est présent qu'à partir de squid-2.4 (pour ceux que cela 
                        intéresse, auparavant l'appel <function>getsockname()</function> 
                        était bidouillé pour obtenir l'adresse originale de 
                        destination, alors que l'on utilise maintenant l'appel 
                        <function>getsockopt()</function> avec le niveau 
                        <literal>SOL_IP</literal> et l'option 
                        <literal>SO_ORIGINAL_DST</literal>).

                </para>
                <para>
                
                        Décompactez et extrayez l'archive (utilisez
                        <userinput>tar&nbsp;xzf&nbsp;<replaceable>nom_du_fichier</replaceable></userinput>). 
                        Exécutez le script d'auto-configuration et dites-lui d'inclure 
                        le code destiné à Netfilter 
                        (<userinput>./configure&nbsp;--enable-linux-netfilter</userinput>), 
                        compilez (<userinput>make</userinput>) puis installez 
                        (<userinput>make&nbsp;install</userinput>).

                </para>
                <para>
                        Modifiez le fichier <filename>squid.conf</filename> (il devrait 
                        être sous <filename 
                        class="directory">/usr/local/squid/etc/squid.conf</filename>, à 
                        moins que vous n'ayez changé son chemin par défaut). Le fichier
                        <filename>squid.conf</filename> est abondamment commenté. Il 
                        constitue pour certains sujets l'une des meilleures 
                        sources d'information sur Squid. 
                        Une fois que tout fonctionnera, je vous recommande de revenir en 
                        arrière et de le relire complètement. Mais pour l'instant, 
                        contentons-nous du minimum requis. Trouvez les directives 
                        suivantes, décommentez-les, et donnez-leur les valeurs 
                        appropriées&nbsp;:
                </para>

<programlisting>
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on   
httpd_accel_uses_host_header on
</programlisting>

                <para>
                        Ensuite, jetez un &oelig;il aux directives 
                        <literal>cache_effective_user</literal> et 
                        <literal>cache_effective_group</literal>. Si le couple 
                        utilisateur-groupe 
                        <literal>nobody</literal>/<literal>nogroup</literal> 
                        n'existe pas sur votre système (autant que je sache, ce n'est pas 
                        le cas dans de nombreuse distributions, y compris dans la RedHat 
                        7.1), vous devrez le mettre en place, ou en créer un autre pour 
                        exécuter Squid. Je vous recommande chaudement de créer un couple 
                        utilisateur-groupe 
                        <literal>squid</literal>/<literal>squid</literal> pour faire 
                        tourner Squid, mais vous pouvez utiliser n'importe quel compte 
                        existant si vous le souhaitez.
                </para> 

                <para>
                        Enfin, jetez un &oelig;il à la directive 
                        <literal>http_access</literal>. Sa valeur par défaut est 
                        habituellement 
                        <literal>http_access&nbsp;deny&nbsp;all</literal>. Ce qui 
                        empêche quiconque d'accéder à Squid. Provisoirement, 
                        vous pouvez changer cette valeur en 
                        <literal>http_access&nbsp;allow&nbsp;all</literal>, mais une 
                        fois le système opérationnel, il est fortement recommandé de 
                        lire la documentation consacrée aux listes de contrôle d'accès 
                        (ACL), et de configurer le mandataire de manière à ce que 
                        seules les personnes de votre réseau local (par exemple) puisse y 
                        accéder.
                        Ceci peut paraître idiot, mais il est important de mettre en place 
                        de telles restrictions sur l'accès à votre cache.
                        Les personnes bloquées par des pare-feu filtrants (tels que 
                        des filtres anti-pornographie, ou les filtres de pays 
                        totalitaires) font souvent de l'auto-stop sur les mandataires 
                        ouverts à tous vents et consomment votre bande passante.
                </para>

                <para>
                        Initialisez le répertoire utilisé pour la mémorisation des 
                        pages via la commande <userinput>squid&nbsp;-z</userinput> (vous 
                        devriez passer cette étape si Squid était déjà installé sur 
                        votre machine).
                </para>

                <para>
                        Maintenant, exécutez Squid en utilisant le script 
                        <userinput>RunCache</userinput> du répertoire
                        <filename class="directory">/usr/local/squid/bin/</filename>.
                        Si cela fonctionne, vous devriez être en mesure de régler les 
                        paramètres proxy de votre navigateur sur l'adresse IP de la 
                        machine où tourne Squid, et sur le port 3128 (à moins que vous 
                        n'ayez changé le numéro de port par défaut) et d'accéder à Squid 
                        comme à un mandataire normal.
                </para>

                <para>
                        Pour obtenir une aide complémentaire sur la configuration de 
                        Squid, reportez-vous à la FAQ de Squid sur
                        <ulink url="http://www.squid-cache.org"></ulink>.
                </para>
        
        </sect1>


<!-- 5 installer iptables-->
        <sect1 id="iptables">
                <title>Installer iptables (Netfilter)</title>

                <para>
                        Iptables est une nouveauté des noyaux Linux 2.4, et remplace 
                        ipchains. Si votre distribution est fournie avec un noyau 2.4, 
                        iptables est probablement déjà installé. Dans le cas contraire 
                        vous devrez le télécharger (et probablement le compiler). Il est 
                        disponible sur <ulink url="http://netfilter.samba.org"></ulink>. 
                        Il est sans doute possible de trouver des paquets RPM binaires 
                        quelque part ailleurs, mais je n'ai pas cherché. Pour les curieux, 
                        le site de netfilter contient beaucoup de documentation.
                </para>

                <para>
                        Pour mettre en place les règles, vous devez connaître deux 
                        choses&nbsp;: l'interface par laquelle arrivent les requêtes des 
                        clients devant être transmises au serveur mandataire
                        (j'utiliserai <literal>eth0</literal> dans l'exemple) et le 
                        port sur lequel Squid attend (à titre d'exemple, j'utiliserai la 
                        valeur par défaut <literal>3128</literal>).
                </para>

                <para>
                        Maintenant, voici les mots magiques de la mise en place d'un 
                        mandataire transparent&nbsp;: 
                </para>

<programlisting>
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
         -j REDIRECT --to-port 3128
</programlisting>

                <para>
                        Vous devrez ajouter les commandes ci-dessus au script de démarrage 
                        approprié sous <filename class="directory">/etc/rc.d</filename>. Les 
                        lecteurs procédant à une mise à jour depuis un noyau 2.2 noteront que 
                        c'est la seule commande nécessaire. Les noyaux 2.2  exigeaient deux 
                        commandes supplémentaires pour empêcher les boucles de routage.
                        L'infrastructure de netfilter est plus perfectionnée, et n'a 
                        besoin que de cette commande.
                </para>

        </sect1>
        

<!-- 6 machine distante-->
        <sect1 id="machine-distante">
                <title>Mandataire transparent pour une machine distante</title>

                <para>
                        Maintenant, une question se pose naturellement, si l'on peut 
                        réaliser toutes ces astucieuses man&oelig;uvres pour rediriger les 
                        connexions HTTP vers des ports locaux, ne pourrait-on pas faire 
                        la même chose mais vers une machine distante (par exemple, dans 
                        le cas où la machine qui exécute Squid n'est pas la même que 
                        celle qui fait tourner <command>iptables</command>). 
                        La réponse est oui, mais cela demandes des mots magiques un peu 
                        différents. Si vous souhaitez uniquement une redirection vers 
                        la machine locale, ce qui est la cas habituel, vous pouvez 
                        ignorer ce chapitre.
                </para>

                <para>
                        Pour les besoins de l'exemple, supposons que nous ayons deux 
                        machines nommées <replaceable>machine-squid</replaceable> et 
                        <replaceable>machine-iptables</replaceable>, et qu'elles 
                        soient sur le réseau <replaceable>réseau-local</replaceable>. 
                        Dans les commandes ci-dessous, 
                        remplacez ces chaînes par les adresses ou les noms réels de 
                        vos réseau et machines.
                </para>

                <para>
                        Je présenterai ici deux approches différentes.
                </para>
                
<!-- 6.1 première méthode simple-->
                <sect2 id="methode-simple">
                        <title>
                                Première méthode (plus simple, mais non exhaustive)
                        </title>

                <itemizedlist>          
                <listitem><para>
                        Sur laquelle tournera Squid, 
                        <replaceable>machine-squid</replaceable>, vous n'avez ni besoin 
                        d'iptables, ni d'indiquer au noyau une option spécifique. La seule 
                        chose nécessaire est Squid. Vous aurez en revanche 
                        <emphasis>besoin</emphasis><footnote><para>Les versions 
                        précédentes de ce petit guide suggéraient que tel n'était pas le 
                        cas. C'était une erreur. Désolé d'avoir créé cette 
                        confusion.</para></footnote> d'indiquer à Squid l'option 
                        <literal>http_accel</literal> telle qu'elle est 
                        décrite ci-dessus.
                </para></listitem>

                <listitem><para>
                        Sur la machine sur laquelle tournera iptables, 
                        <replaceable>machine-iptables</replaceable>, vous devrez 
                        configurer le noyau comme décrit dans <xref linkend="noyau"/> 
                        ci-dessus, à une exception près&nbsp;: vous n'avez pas besoin de 
                        l'option «&nbsp;REDIRECT target support&nbsp;». Pour ce qui est 
                        des commandes iptables, vous aurez besoin de trois d'entre 
                        elles&nbsp;:
                </para>

<programlisting>
iptables -t nat -A PREROUTING -i eth0 -s !<replaceable>machine-squid</replaceable> \
         -p tcp --dport 80 -j DNAT --to <replaceable>machine-squid</replaceable>:3128

iptables -t nat -A POSTROUTING -o eth0 -s <replaceable>réseau-local</replaceable> \
         -d <replaceable>machine-squid</replaceable> -j SNAT --to <replaceable>machine-iptables</replaceable>

iptables -A FORWARD -i eth0 -o eth0 -s <replaceable>réseau-local</replaceable> \
         -d <replaceable>machine-squid</replaceable> -p tcp --dport 3128 -j ACCEPT
</programlisting>

                <para>
                        La première envoie les paquets de 
                        <replaceable>machine-iptables</replaceable> vers 
                        <replaceable>machine-squid</replaceable>. La seconde 
                        s'assure que la réponse soit renvoyée via 
                        <replaceable>machine-iptables</replaceable>, plutôt que 
                        directement au client (c'est très important&nbsp;!). La 
                        dernière s'assure que <replaceable>machine-iptables</replaceable> 
                        redirigera les paquets appropriés vers 
                        <replaceable>machine-squid</replaceable>. Il est possible 
                        qu'elle ne soit pas nécessaire. À vous de voir. Remarquez 
                        que nous avons spécifié <option>-i eth0</option> puis 
                        <option>-o eth0</option>, ce qui veut dire que nous 
                        utilisons <literal>eth0</literal> comme interface d'entrée 
                        (<option>-i</option>) et de sortie (<option>-o</option>). Si 
                        vos paquets entrent et sortent par des interfaces différentes, 
                        vous devrez ajuster ces commandes en conséquence.
                </para></listitem>
                </itemizedlist>


                <para>
                        Ajoutez ces commandes aux scripts de démarrage appropriés sous
                        <filename class="directory">/etc/rc.d/</filename>
                </para>

                <para>
                        (Merci à Giles Coochey d'avoir aidé à l'écriture de cette 
                        section).
                </para>

        </sect2>

<!-- 6.2 méthode compliquée-->
                <sect2 id="methode-compliquee">
                        <title>
                                Seconde méthode (plus compliquée mais plus générale)
                        </title>
                        <para>
                                Notre première tentative marche bien, mais a un 
                                petit inconvénient&nbsp;: elle ne permet pas de gérer 
                                correctement les connexions HTTP/1.0 sans en-tête 
                                <literal>Host</literal>. Les connexions partiellement ou 
                                complètement compatibles HTTP/1.1, elles, marchent bien. En 
                                général, cela ne pose pas de problème, car la majorité des 
                                navigateurs modernes envoient l'en-tête <literal>Host</literal>. 
                                Cela pose problème dans le cas de certains petits programmes ou 
                                appareils embarqués, car ceux-ci n'émettent que des requêtes 
                                HTTP/1.0 très simples. Pour être capable de gérer 
                                correctement ce cas de figure, il faut en faire un peu 
                                plus.
                        </para>

                        <itemizedlist>
                        <listitem><para>
                                Sur <replaceable>machine-iptables</replaceable>, il est 
                                nécessaire d'activer les options suivantes du noyau&nbsp;:
                        </para>

<programlisting>
IP: advanced router
IP: policy routing
IP: use netfilter MARK value as routing key
IP: Netfilter Configuration -> Packet mangling
IP: Netfilter Configuration -> MARK target support
</programlisting>

                        <para>
                                Vous aurez également besoin des utilitaires iproute2. Votre distribution
                                les a probablement déjà installés mais, dans le cas contraire, jetez un
                                coup d'&oelig;il à <ulink url="ftp://ftp.inr.ac.ru/ip-routing/"></ulink>
                        </para>

                        <para>
                        La configuration de la machine nécessitera les commandes suivantes&nbsp;:
                        </para>

<programlisting>
iptables -t mangle -A PREROUTING -j ACCEPT -p tcp --dport 80 -s <replaceable>machine-squid</replaceable>
iptables -t mangle -A PREROUTING -j MARK --set-mark 3 -p tcp --dport 80
ip rule add fwmark 3 table 2
ip route add default via <replaceable>squid-box</replaceable> dev eth1 table 2
</programlisting>

                        <para>
                                Notez que les numéros choisis pour la marque de pare-feu 
                                (<literal>3</literal>) et pour la table de routage 
                                (<literal>2</literal>) sont complètement arbitraires. Si vous 
                                utilisez déjà un routage dirigé 
                                (<foreignphrase>policy routing</foreignphrase>) ou un marquage 
                                de pare-feu pour d'autres besoins, assurez-vous que vous 
                                choisissez ici des numéros non utilisés.
                        </para></listitem>


                        <listitem><para>
                                Passons à <replaceable>machine-squid</replaceable>. Utilisez 
                                la commande suivante, qui devrait vous sembler remarquablement 
                                similaire à une commande vue précédemment. 
                        </para>

<programlisting>
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
</programlisting></listitem>

                        </itemizedlist>

                        <para>
                                Comme précédemment, ajoutez toutes ces commandes aux scripts de
                                démarrage appropriés.
                        </para>

                        <para>
                                Voici une explication succincte de la façon dont cette seconde 
                                méthode fonctionne&nbsp;: dans la première méthode, nous avons 
                                utilisé la traduction d'adresse pour diriger les paquets vers 
                                l'autre machine. Ce qui implique une modification des paquets. 
                                Cette altération est la cause des défaillances mentionnés plus 
                                haut pour certains types de clients. Dans la méthode deux, nous 
                                utilisons un truc magique appelé routage dirigé 
                                (<foreignphrase>policy routing</foreignphrase>).
                                Il faut tout d'abord sélectionner les paquets que l'on veut. 
                                Pour ce faire, nous marquons (via la cible 
                                <literal>MARK</literal>) tous les paquets destinés au port 
                                <literal>80</literal>, excepté ceux provenant de 
                                <replaceable>machine-squid</replaceable> elle-même. 
                                Habituellement, lorsque le noyau doit décider du routage des 
                                paquets, il utilise la table de routage consultable via la 
                                commande <command>route</command>. Pour le routage des 
                                paquets marqués, il utilisera une table spéciale ne 
                                comportant qu'une seule entrée, une passerelle par défaut 
                                pointant vers <replaceable>machine-squid</replaceable>. Les 
                                paquets visés seront donc joyeusement envoyés vers leur destin, 
                                sans subir aucune modification. Ce qui permettra de 
                                gérer correctement toutes les connexions, y compris les 
                                connexions HTTP/1.0. (Merci à Michal Svoboda d'avoir suggéré 
                                cette section et aidé à sa rédaction).
                        </para>

                </sect2>
<!-- 6.3 machine distante avec IP dynamique-->

                <sect2 id="ip-dynamique">
                        <title>
                                Première méthode&hellip; Et dans le cas où la machine iptables 
                                a une adresse IP dynamique&nbsp;?
                        </title>

                        <para>
                                Si <replaceable>machine-iptables</replaceable> a une adresse IP 
                                dynamique (par exemple dans le cas d'une connexion ppp 
                                téléphonique ou d'une adresse assignée par DHCP sur un 
                                modem-câble), vous devrez alors apporter une légère modification 
                                aux commandes ci-dessus. Remplacez la seconde commande par 
                                celle-ci&nbsp;:
                        </para>

<programlisting>
iptable -t nat -A POSTROUTING -o eth0 -s <replaceable>réseau-local</replaceable> \
        -d <replaceable>machine-squid</replaceable> -j MASQUERADE
</programlisting>

                <para>
                        Cette modification évite d'avoir à spécifier l'adresse IP de
                        <replaceable>machine-iptables</replaceable> dans la commande. 
                        Dans la mesure où celle-ci change souvent, vous devriez 
                        modifier la commande à chaque fois. Cette modification vous 
                        épargnera donc beaucoup de travail.
                </para>

                </sect2>

        </sect1>

<!-- 7 Mandataire transparent configuré sur un pont réseau -->
        <sect1 id="mandataire-pont">
                <title>Mandataire transparent configuré sur un pont réseau</title>

                <para>
                        Attention, nous entrons ici dans un domaine vraiment 
                        ésotérique. Si vous en avez besoin, vous saurez de quoi il 
                        s'agit. Merci à Lewis Shobbrook 
                        <email>lshobbrook CHEZ fasttrack POINT net POINT au</email> pour 
                        sa contribution à cette section.
                </para>

                <para>
                        Si vous essayez de configurer en mandataire transparent une 
                        machine Linux utilisée comme pont réseau, vous aurez besoin  
                        d'ajouter une commande supplémentaire à ce que nous avons dans
                        <xref linkend="iptables"/>. Plus précisément, vous  aurez besoin 
                        de permettre explicitement les connexions à la machine sur le port 
                        <literal>3128</literal> (ou tout autre port sur lequel Squid est 
                        à l'écoute). En effet, si vous ne le  faites pas, la machine fera 
                        suivre ces connexions directement via l'autre interface, comme le 
                        ferait tout bon petit pont. Voici les mots magiques&nbsp;:
                </para>

<programlisting>
iptable -A INPUT -i <replaceable>interface</replaceable> -d <replaceable>adresse_IP_du_pont</replaceable> \
        -s <replaceable>réseau-local</replaceable> -p tcp --dport 3128 \
        -m state --state NEW,ESTABLISHED -j ACCEPT
</programlisting>

                <para>
                        Remplacez <replaceable>interface</replaceable> par l'interface 
                        correspondant à <replaceable>adresse_IP_du_pont</replaceable> 
                        (en général, il s'agit de <literal>eth0</literal> ou 
                        <literal>eth1</literal>).
                        Les personnes utilisant un pont pour la première fois devraient 
                        également prendre note du fait qu'il leur est possible de 
                        répéter la même commande en remplaçant <literal>3128</literal> 
                        par <literal>ssh</literal> afin de pouvoir administrer leur 
                        pont à distance.
                </para>

        </sect1>                        
<!-- 8 assemblage du tout-->
        <sect1 id="assemblage">
                <title>Assembler le tout</title>

                <para>
                        
                        Si jusqu'à présent tout s'est bien déroulé, installez-vous sur 
                        une autre machine, réglez son adresse de passerelle sur 
                        l'adresse IP de la machine qui exécute iptables, et naviguez. 
                        Pour vous assurer que les requêtes sont bien redirigées au 
                        travers du mandataire plutôt que d'être envoyées directement au 
                        serveur d'origine, il vous suffit de consulter le fichier 
                        journal&nbsp;: 
                        <filename>/usr/local/squid/logs/access.log</filename>

                </para>
        </sect1>

<!-- 9 en cas de problème -->

        <sect1 id="en-cas-de-probleme">

                <title>En cas de problème</title>

                <para>
                Un problème spécifique est suffisamment fréquent pour mériter 
                d'être mentionné ici. Si vous obtenez l'erreur suivante&nbsp;:
                </para>

<screen>
/lib/modules/2.4.2-2/kernel/net/ipv4/netfilter/ip_tables.o
init_modules: Device or resource busy
Hints: insmod errors can be caused by incorrect module parameters;
including invalid IO or IRQ parameters.

perhaps iptables or your kernel needs to be upgraded...
</screen>

                <para>
                C'est sans doute que vous utilisez la distribution Red Hat 7.x. Les
                responsables de Red Hat, dans leur grande sagesse, on décidé de 
                charger le module <literal>ipchains</literal> par défaut au 
                démarrage. Il devait s'agir de préserver la compatibilité 
                descendante pour ceux qui ne se sont pas encore mis à iptables. 
                Cependant, le problème est que ipchains et iptables sont 
                mutuellement incompatibles. Comme ipchains a été secrètement chargé 
                par Red Hat, vous ne pouvez pas utiliser les commandes iptables. 
                Pour vérifier si tel est bien votre problème, utilisez la commande 
                <userinput><command>lsmod</command></userinput>, et vérifiez si le 
                module nommé <computeroutput>ipchains</computeroutput> est présent. 
                Si vous le trouvez, c'est que c'est bien là que se situe votre 
                problème. Une solution à court terme est d'exécuter la commande 
                <userinput><command>rmmod</command> 
                <literal>ipchains</literal></userinput> avant d'exécuter les 
                commandes <userinput>iptables</userinput>. Pour désactiver le 
                chargement automatique du module <literal>ipchains</literal> au 
                démarrage, essayez la commande suivante&nbsp;: 
                <userinput><command>/sbin/chkconfig</command> 
                <option>--level</option> <literal>2345</literal> 
                <literal>ipchains</literal> <literal>off</literal></userinput> 
                (merci à Rasmus Glud de m'avoir indiqué cette commande).
                </para>

        </sect1>
                                      
<!-- 10 informations complémentaires-->
        <sect1 id="informations">

        <title>Informations complémentaires</title>

        <para>
                Si vous avez besoin d'assistance, je vous recommande de consulter la
                FAQ de Squid ou sa liste de diffusion, sur <ulink
                url="http://www.squid-cache.org"></ulink>. Vous pouvez également me
                contacter en anglais à <email>drk CHEZ unxsoft POINT com</email>, et
                j'essaierai de répondre à vos questions si le temps me le permet
                (des fois oui, des fois non). SVP, SVP, SVP, envoyez-moi le résultat
                de la commande
                <userinput>iptables&nbsp;-t&nbsp;nat&nbsp;-L</userinput> et les
                portions significatives des fichiers de configuration dans votre
                courrier, sinon, je ne serai probablement pas en mesure de vous être
                très utile. S'il vous plaît, assurez-vous d'avoir lu l'intégralité
                de ce petit guide avant de poser une question. Bien que ce document
                aie été traduit dans de nombreuses langues, je ne pourrai répondre
                qu'aux questions posées en anglais, et j'en suis désolé.
  </para>

  </sect1>

  <sect1 id="adaptation-francaise" xreflabel="adaptation française">

        <title>Adaptation française</title>

        <sect2>
                <title>Traduction</title>
                <para>La traduction française de ce document a été réalisée par
                Geneviève Gracian <email>ggracian CHEZ free POINT fr</email>.</para>
        </sect2>

        <sect2>
                <title>Relecture</title>
                <para>La relecture de ce document a été réalisée par
                Jean-Philippe Guérard
                <email>jean TIRET philippe POINT guerard CHEZ corbeaunoir POINT org</email>.</para>
        </sect2>

  </sect1>

</article>

Site hébergé sur un Cloud Public IKOULA Ikoula