<?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>
