4. La configuration du service Web mandataire (proxy)

Tous les paramètres de configuration du démon squid sont rassemblés dans le fichier squid.conf. Ce fichier est particulièrement volumineux et par conséquent difficile à prendre en main. Décrire toutes les fonctionnalités offertes par ces paramètres dépasse très largement le cadre de ce billet. On se contente donc de présenter un patch qui fait ressortir les paramètres modifiés pour les besoins du contexte d'exploitation.

$ diff -uBb /etc/squid3/squid.conf squid.conf.new 

--- /etc/squid3/squid.conf      2008-07-21 12:31:32.000000000 +0200
+++ squid.conf.new      2008-11-08 19:28:18.000000000 +0100
@@ -579,6 +579,7 @@
 #
 #Recommended minimum configuration:
 acl manager proto cache_object
+acl mynetworks src 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
 acl localhost src 127.0.0.1/32
 acl to_localhost dst 127.0.0.0/8
 #
@@ -644,6 +645,7 @@
 # Adapt localnet in the ACL section to list your (internal) IP networks
 # from where browsing should be allowed
 #http_access allow localnet
+http_access allow mynetworks
 http_access allow localhost
 
 # And finally deny all other access to this proxy
@@ -677,6 +679,7 @@
 #
 #Allow ICP queries from local networks only
 #icp_access allow localnet
+icp_access allow mynetworks
 icp_access deny all
 
 #  TAG: htcp_access
@@ -867,7 +870,7 @@
 #      visible on the internal address.
 #
 # Squid normally listens to port 3128
-http_port 3128
+http_port 3128 transparent
 
 #  TAG: https_port
 # Note: This option is only available if Squid is rebuilt with the
@@ -1564,6 +1567,7 @@
 #
 #Default:
 # cache_mem 8 MB
+cache_mem 64 MB
 
 #  TAG: maximum_object_size_in_memory  (bytes)
 #      Objects greater than this size will not be attempted to kept in
@@ -1573,6 +1577,7 @@
 #
 #Default:
 # maximum_object_size_in_memory 8 KB
+maximum_object_size_in_memory 128 KB
 
 #  TAG: memory_replacement_policy
 #      The memory replacement policy parameter determines which
@@ -1582,7 +1587,7 @@
 #
 #Default:
 # memory_replacement_policy lru
-
+memory_replacement_policy heap LFUDA
 
 # DISK CACHE OPTIONS
 # -----------------------------------------------------------------------------
@@ -1624,6 +1629,7 @@
 #
 #Default:
 # cache_replacement_policy lru
+cache_replacement_policy heap LFUDA
 
 #  TAG: cache_dir
 #      Usage:
@@ -1731,6 +1737,7 @@
 #
 #Default:
 # cache_dir ufs /var/spool/squid3 100 16 256
+cache_dir aufs /var/spool/squid3 16384 16 256
 
 #  TAG: store_dir_select_algorithm
 #      Set this to 'round-robin' as an alternative.
@@ -2211,6 +2218,7 @@
 #
 #Default:
 # none
+url_rewrite_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
 
 #  TAG: url_rewrite_children
 #      The number of redirector processes to spawn. If you start
@@ -2220,6 +2228,7 @@
 #
 #Default:
 # url_rewrite_children 5
+url_rewrite_children 20
 
 #  TAG: url_rewrite_concurrency
 #      The number of requests each redirector helper can handle in
@@ -2509,6 +2518,7 @@
 #
 #Default:
 # request_header_max_size 20 KB
+request_header_max_size 32 KB
 
 #  TAG: reply_header_max_size  (KB)
 #      This specifies the maximum size for HTTP headers in a reply.
@@ -2519,6 +2529,7 @@
 #
 #Default:
 # reply_header_max_size 20 KB
+reply_header_max_size 32 KB
 
 #  TAG: request_body_max_size  (bytes)
 #      This specifies the maximum size for an HTTP request body.
@@ -4001,6 +4012,8 @@
 #
 #Default:
 # none
+acl debian dstdomain .debian.org
+always_direct allow debian
 
 #  TAG: never_direct
 #      Usage: never_direct allow|deny [!]aclname ...
@@ -4690,7 +4703,7 @@
 #      reasons.
 #
 #Default:
-# pipeline_prefetch off
+pipeline_prefetch on
 
 #  TAG: high_response_time_warning     (msec)
 #      If the one-minute median response time exceeds this value,

Voici quelques éléments sur les paramètres introduits ou modifiés.

acl mynetworks src 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16

Cette liste de contrôle d'accès introduite avec l'option acl désigne les adresses réseau utilisées dans l'infrastructure de travaux pratiques. Si on se réfère aux tableaux de de cette infrastructure, on considère que le trafic Web est susceptible de provenir de toutes les classes d'adresses IP privées désignées dans le document standard RFC1918 Address Allocation for Private Internets.

L'option src indique que ce sont les adresses IP sources qui sont utilisées comme critère d'accès au service proxy.

http_access allow mynetworks

La directive http_access contrôle l'accès au service via le protocole HTTP. Dans le cas présent, il s'agit d'ouvrir l'accès aux réseaux de l'infrastructure de travaux pratiques. La configuration par défaut, telle que fournie lors de l'installation du paquet, interdit tout accès au service. Cette règle restreint donc l'accès aux seules adresses IP utilisées pour les travaux pratiques.

icp_access allow mynetworks

La directive icp_access joue le même rôle que la précédente pour le protocole ICP. L'Internet Cache Protocol est utilisé pour le dialogue entre services mandataires. Tout comme dans le cas précédent, on autorise le fonctionnement du protocole à partir des adresses IP de l'infrastructure de travaux pratiques.

http_port 3128 transparent

La directive http_port désigne le numéro du port sur lequel le service mandataire est en écoute. Dans le cas de squid, le numéro usuel est le 3128. Il n'est pas nécessaire de modifier ce numéro de port. L'option transparent est importante. Elle définit le mode d'utilisation du service : un cache transparent pour le trafic Web utilisateur.

cache_mem 64 MB

Le paramètre cache_mem désigne la quantité idéale de mémoire allouée pour le stockage de différents types d'objets en «transit» dans le service. Cette quantité peut très bien être dépassée en fonction du taux de requêtes entrantes. Si ce taux est élevé, ce paramètre est utilisé pour calculer le seuil de remplacement des anciens objets dans la mémoire.

maximum_object_size_in_memory 128 KB

Définition de la taille maximum d'un objet conservé en mémoire cache. Les objets de taille supérieure ne sont pas conservés en mémoire vive.

memory_replacement_policy heap LFUDA

Définition de la politique utilisée pour remplacer les objets stockés dans le cache mémoire lorsqu'il est nécessaire de trouver de la place libre. L'option retenue ici est Least Frequently Used with Dynamic Aging. Elle correspond à un usage de type pile basé sur le taux d'utilisation d'un objet du cache combiné à son ancienneté.

cache_replacement_policy heap LFUDA

Définition de la politique utilisée pour remplacer les objets stockés dans le cache disque lorsqu'il est nécessaire de trouver de la place libre. L'option retenue ici est identique à la précédente.

cache_dir aufs /var/spool/squid3 16384 16 256

Définition du mode d'utilisation du cache disque du service mandataire. L'option aufs correspond au format de stockage des objets sur disque. Elle utilise les fonctions multi-tâches POSIX Threads.

Du point de vue occupation disque, on réserve 16Go distribués sur 16 répertoires de premier niveau puis sur 256 répertoires de second niveau.

url_rewrite_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf

La directive url_rewrite_program désigne l'outil utilisé pour le filtrage des URLs : squidGuard.

url_rewrite_children 20

Définition du nombre de processus enfants générés pour répondre aux requêtes transmises par le démon squid. La valeur donnée doit permettre d'optimiser les temps de réponses en lançant suffisamment d'instances squidGuard tout en utilisant raisonnablement les ressources du système.

request_header_max_size 32 KB

Définition de la taille maximum d'un en-tête HTTP lors d'une requête.

Le choix d'une taille de 32Ko doit permettre de laisser passer le trafic «normal» sans entraver les accès. À voir en fonction d'utilisations particulières du protocole HTTP.

reply_header_max_size 32 KB

Définition de la taille maximum d'un en-tête de réponse HTTP. La valeur retenue est identique à celle du paramètre précédent.

acl debian dstdomain .debian.org, always_direct allow debian

Cette liste de contrôle d'accès concerne toutes les requêtes à destination du domaine .debian.org et de ses sous-domaines.

La directive always_direct spécifie les requêtes qui doivent toujours être directement transmises au serveur d'origine.

pipeline_prefetch on

Directive utilisée pour doper les performances et se rapprocher d'une navigation Web sans service mandataire.

Bien sûr, tous ces paramètres peuvent être «retravaillés» pour répondre mieux à d'autres contextes d'exploitation. Seule l'expérience acquise en cours d'exploitation peut permettre de répondre précisément à un besoin.

Les commentaires du fichier de configuration /etc/squid/squid.conf constituent le meilleur point d'entrée pour aborder la documentation du paquet squid3. Ensuite, le Wiki Squid fournit des exemples de configurations très intéressants.

Arrivé à cette étape, il ne reste plus qu'à appliquer le patch sur le fichier de configuration du service mandataire.

# cp /etc/squid/squid.conf /etc/squid/squid.conf.dpkg-dist
# patch -l -p0 /etc/squid/squid.conf squid.conf.patch
patching file /etc/squid/squid.conf

# ll /etc/squid/
total 336K
-rw-r--r-- 1 root root  421 jui 21 12:31 msntauth.conf
-rw-r--r-- 1 root root 158K nov  8 19:40 squid.conf
-rw-r--r-- 1 root root 158K nov  8 19:40 squid.conf.dpkg-dist
-rw-r--r-- 1 root root 1,3K jui 24 23:15 squidGuard.conf

À ce stade de la configuration, le service n'est pas encore opérationnel. Il faut maintenant configurer l'application de filtrage des URLs : squidGuard.