InstallerSquid
Un article de Projet de documentation fug-fr .
Installation de Squid 2.5STABLE13 sur FreeBSD
Sommaire |
[modifier] Installation
J'utilise ici portupgrade, mais toute autre méthode fera l'affaire:
portupgrade -N www/squid
Ceci conduit à l'installation de fichiers de configuration, notamment squid.conf dans le répertoire /usr/local/etc/squid.
Le cache est créé dans /usr/local/squid/cache et les fichiers de log dans /usr/local/squid/logs.
L'installation de Squid conduit à la création d'un script:
/usr/local/etc/rc.d/squid Ce script de démarrage est de type rc.d, ce qui signifie que squid ne démarrera pas automatiquement lors du boot. Pour cela vous devez insérer la ligne:
squid_enable="YES"
dans, au choix: etc/rc.conf, /etc/rc.conf.local ou /etc/rc.conf.d/squid
Sur ma machine j'ai du le renommer en squid.sh, sinon il refusait de se lancer...
Créez un utilisateur et un groupe squid:
#pw groupadd squid
#pw useradd squid -g squid -d /usr/local/squid -s /sbin/nologin
#chown squid /usr/local/squid/cache
#chgrp squid /usr/local/squid/cache
#chown squid /usr/local/squid/logs
#chgrp squid /usr/local/squid/logs
#chmod -R 700 /usr/local/squid/logs
Avant de lancer Squid vous devez initialiser les nouveaux repertoires de cache. Créez l'arborescence en lanà§ant en 'root', la commande:
#/usr/local/sbin/squid -z 2006/04/01 19:29:15| Creating Swap Directories
Les répertoires sont nommés de 00 à 0F et de 00 à FF. Si vos répertoires de cache ont déjà été initialisés (par exemple après un upgrade de squid) vous n'avez pas besoin de les ré-initialiser.
Pour l'exemple, voici les caractéristiques d'Altair, petit réseau privé de classe C. Nous lui affectons la plage d'adresses 192.168.0.*. Squid sera installé sur la machine d'adresse 192.168.0.1 faisant également office de passerelle nommée Vortex
[modifier] Configuration
Les fichiers de configuration sont rassemblés dans le répertoire /usr/local/etc/squid. Les options par défaut assurent généralement un fonctionnement correct et sont contenues dans le fichier squid.conf
[modifier] Utilisateur et groupes effectifs
Les sockets liés à des ports de numéros inférieurs à 1024 doivent être initialisés par des processus de propriétaire root. Pour des raisons de sécurité, squid modifie ensuite utilisateur et groupe effectifs. Ajoutez les entrées suivantes au fichier squid.conf:
cache_effective_user squid cache_effective_group squid
[modifier] Port
Par défaut, Squid écoute les requêtes HTTP sur le port 3128. De nombreux FAI placent leurs proxies en écoute sur le port 8080, plus facile à mémoriser. Ajoutez éventuellement une entrée:
http_port 8080
[modifier] Répertoire du cache
les documents cachés seront stockés dans une arborescence de racine cache_dir:
cache_dir ufs /usr/local/squid/cache 1024 16 256
La première constante indique la taille maximale du cache en Mo. Nous allouons 1 Go, un espace suffisant pour cacher de l'ordre de 100000 objets. Ces derniers seront stockés dans 4096 répertoires repartis sur deux niveaux. Une fonction de hachage garantit une répartition équitable des objets.
[modifier] Adresse de l'administrateur Squid
L'option cache_manager précise l'adresse électronique de l'administrateur Squid. Cette personne recevra une notification en cas d'arrêt du démon. L'adresse figurera également sur les pages d'erreurs retournées aux clients:
cache_mgr squidadmin@altair.net
[modifier] Adresse pour le ftp anonyme
Nous communiquerons également une adresse valide lors du téléchargement FTP sous compte anonymous:
ftp_user squidadmin@altair.net
[modifier] Audit
Squid rend compte de son état dans divers fichiers placés sous /usr/local/squid/logs. L'option -h de Squid combinée au mot clé rotate force l'archivage des fichiers. Squid doit être actif au moment de l'appel:
/usr/local/sbin/squid -k rotate
L'option logfile_rotate définit le nombre maximum de versions archivées. Pour une sauvegarde sur un mois, à raison d'une rotation par jour:
logfile_rotate 3O
Le plus simple est d'automatiser la rotation grâce au démon cron.
Voici un exemple de fichier /etc/crontab correspondant à une invocation de la commande de rotation tous les jours à deux heures du matin (un peu tôt non?):
O 2 * * * root /usr/local/sbin/squid -k rotate
[modifier] Configuration détaillée
[modifier] Taille maximale des objets en cache
Squid ne stocke les objets sur disque que si leur taille entre dans un intervalle fixé par l'administrateur:
minimum_object_size 0 KB maximum_object_size 4096 KB
[modifier] Délais
Il est nécessaire d'établir des délais au delà desquels Squid considèrera qu'une transaction a échoué. Ceci vaut pour l'établissement des connexions, l'envoi des requêtes et la réception des résultats.
connect_timeout 30 seconds request_timeout 3O seconds read_timeout 2 minutes
Complétez éventuellement les requêtes interrompues par les utilisateurs. Fixez les seuils en fonction du débit de votre réseau:
quick_abort_min 10 KB quick_abort_max 10 KB quick_abort_pct 90
[modifier] Résolution DNS
Des processus spécifiques assurent la traduction noms de serveurs <-> adresses IP. Leur nombre est à choisir en fonction de la charge en pointe de votre réseau:
dns_children 10
Ces processus ne traitent pas directement les délais d'expiration (TTL) fournis par les serveurs de noms. Les correspondances sont stockées dans des caches. Des constantes précisent quand ces données deviennent obsolètes:
positive_dns_ttl 24 hours negative_dns_ttl 5 minutes
[modifier] Sécurité: Access controls
Le fichier de configuration par défaut fourni par l'installation empêchera l'accès de quiconque au proxy. Il faut donc éditer la directive http_access pour l'adapter à vos besoins. Il est recommandé de limiter l'accès du proxy aux machines de votre réseau. A cet effet, Squid propose les ACL (Access Classes Lists) et les ACO (Access Classes Operators). Une liste regroupe un ensemble de propriétés des requêtes
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
# Example rule allowing access from your local networks. Adapt
# to list your (internal) IP networks from where browsing should
# be allowed
acl reseau_altair src 192.168.0.0/24
http_access allow reseau_altair
# And finally deny all other access to this proxy http_access deny all
Ces règles évitent qu'un utilisateur mal intentionné n'exploite votre proxy à la manière d'un tunnel pour requérir des services interdits.
Nous décrivons ici les machines du réseau altair et le gestionnaire du cache. Lors du test d'une règle A/M, on opère un ET logique entre l'adresse candidate C et le masque M puis on compare le résultat et A. Le résultat est positif si A = C. M.
Les éléments d'une liste sont combinés avec des OU logiques, les prémisses d'une règle avec des ET logiques. Les règles sont lues en séquence. L'accès est autorisé par défaut. Une règle au plus est appliquée pour chaque type de contrôle (http_access, ftp_access...). Si aucune règle ne s'applique à un candidat, l'action 'opposée' à celle de la 'dernière' règle lue s'impose. Par exemple:
A allow X A deny Y A deny X A allow Y Z -> allow Z -> deny
En étudiant le fichier de configuration, vous constaterez la présence des règles supplémentaires :
acl SSL_ports port 443 563 acl Safe_ports port 21 70 80 210 280 443 488 563 591 777 1025-65535 acl CONNECT method CONNECT http_access deny !Safe_ports http_access deny CONNECT !SSL_ports
Limitez la taille des requêtes pour restreindre les risques d'attaques de type "refus de services":
request_header_max_size 10 KB request_body_max_size 64 KB
[modifier] Anonymat
Préservez l'anonymat des utilisateurs en masquant une partie des adresses source des requêtes:
client_netmask 255.255.255.O
Ici, nous masquons la section machine des adresses IP de notre réseau de classe C. De plus, vous pouvez filtrer certains champs des en-têtes de requêtes générés par les clients:
anomyze_headers deny Referer Server From User-Agent
Ici, nous masquons l'adresse électronique et la description du client. Nous masquons également la ressource URL à partir de laquelle l'utilisateur a sélectionné la ressource interrogée. Certains serveurs réclamant l'identification du programme client, nous ajoutons l'option:
fake_user_agent Internet Exploder v 0.0
L'option strip_query_terms activée par défaut évite que les paramètres des requêtes adressées par exemple à un moteur de recherche ne soient archivés.
[modifier] Filtrage
Un filtrage judicieux garantit une bonne répartition du trafic, ce en accord avec la politique d'administration de votre serveur. Les ACO permettent un filtrage sur la base d'expressions rationnelles appliquées aux URL. Par exemple, pour interdire le chargement de fichiers Mpeg Layer 3:
acl url_mp3 url_regex - i \.mp3$ http_access deny url_mp3
. Pour limiter la taille des objets importés à l Mo :
reply_body_max_size 1024 KB
Plus radicalement, vous pouvez filtrer un protocole ou un domaine entier:
acl proto_ftp proto ftp acl dom_google dstdom_regex -i google http_access deny proto_ftp http_access deny dom_google
[modifier] Hiérarchie des fichiers
Plusieurs caches peuvent collaborer. Ainsi, Renater, organisme, fédérant les réseaux des universités dispose d'un cache national hébergé sur le campus de Jussieu et de caches régionaux. Cette hiérarchie augmente le nombre de documents cachés. Squid intègre des mécanismes autorisant une telle collaboration. Le protocole ICP (Inter-Cache Protocol) permet d'interroger un cache sur la présence d'un objet particulier (HIT/MISS). Ces requêtes se font généralement sur le port 3l30. Les résumés de caches (cache digests) permettent l'échange d'index entiers. Deux caches voisins (sibling caches) n'échangent que les objets qu'ils possèdent. Un cache père (parent cache) accepte de récupérer un objet qu'il ne possède pas pour un de ses caches fils. Nous allons envisager deux cas d'école.
[modifier] Raccordement au cache d'un FAI
Dans ce cas, toute requête aboutissant à un échec au niveau du cache local est adressée à un cache père.
cache_peer proxy.fai.fr parent 8080 0 default no-query prefer_direct off
Nous correspondons avec proxy.fai.fr sur le port 8080 (défaut) Nous n'utilisons pas ICP (no-query) et souhaitons contacter prioritairement le proxy père (prefer_direct off).
Collaboration des deux caches
Si votre réseau est de taille importante vous pouvez répartir la la charge entre plusieurs proxies. Cette technique nécessite la configuration d'un serveur de noms. Supposons que notre second cache soit hébergé par la machine Krell d'adresse 192.168.0.2. Nous ajoutons deux enregistrement à la zone altair.net:
proxy A 192.168.0.1 proxy A 192.168.0.2
Les navigateurs pointent vers proxy.altair.net. Lors d'une résolution de noms, la librairie Resolver retournera alternativement l'une des deux adresses. Nous installons Squid sur Krell et créons les entrées:
cache_peer vortex.altair.net sibling 3128 3130 proxy-only acl src_vortex src 192.168.0.1/255.255.255.255 icp_access allow src_vortex
Et sur Vortex:
cache_peer krell.altair.net sibling 3128 313O proxy-only acl src_krell src 192.168.O.2/255.255.255.255 icp_access allow src_krell
L'option proxy-only bloque le stockage en cache local d'un résultat récupéré depuis un cache frère. Nous augmentons ainsi le nombre total d'objets stockés.
[modifier] Serveur Http local
Supposons que notre réseau dispose d'une serveur Web hébergé localement. Il serait inefficace de relayer des requêtes HTTP ou CGI destinées à ce serveur vers un proxy extérieur
acl dst_localhost dst l27.0.0.1 /255.255.255.255 acl dst_reseau altair dst l92.168.0.0/255.255.255.0 always_direct allow dst_localhost always_direct allow dst_reseau_altair hierarchy_stoplist cgi-bin ?
De plus nous ne souhaitons pas cacher ces documents
acl cgi urlpath_regex cgi-bin \? no_cache deny cgi no_cache deny dst_localhost no_cache deny dst_reseau_altair
[modifier] Tests
Tout_est prêt pour un premier test
/usr/local/sin/squid -N -D -d 2
Le démon s'exécute normalement en tâche de fond. L'option -N interdit le passage en arrrière-plan, les sorties seront visibles de la console. L'option -D évite un test du service DNS. L'option -d fixe le niveau de détail des comptes-rendus.
Voici la sortie obtenue:
2006/04/01 20:11:03| Starting Squid Cache version 2.5.STABLE13 for i386-portbld-freebsd6.1... 2006/04/01 20:11:03| Process ID 16143 2006/04/01 20:11:03| With 11072 file descriptors available 2006/04/01 20:11:03| DNS Socket created at 0.0.0.0, port 60702, FD 4 2006/04/01 20:11:03| Adding nameserver 212.27.32.176 from /etc/resolv.conf 2006/04/01 20:11:03| Adding nameserver 212.27.32.177 from /etc/resolv.conf 2006/04/01 20:11:03| Unlinkd pipe opened on FD 9 2006/04/01 20:11:03| Swap maxSize 102400 KB, estimated 7876 objects 2006/04/01 20:11:03| Target number of buckets: 393 2006/04/01 20:11:03| Using 8192 Store buckets 2006/04/01 20:11:03| Max Mem size: 8192 KB 2006/04/01 20:11:03| Max Swap size: 102400 KB 2006/04/01 20:11:03| Rebuilding storage in /usr/local/squid/cache (DIRTY) 2006/04/01 20:11:03| Using Least Load store dir selection 2006/04/01 20:11:03| Set Current Directory to /usr/local/squid/cache 2006/04/01 20:11:03| Loaded Icons. 2006/04/01 20:11:03| Accepting HTTP connections at 0.0.0.0, port 3128, FD 10. 2006/04/01 20:11:03| Accepting ICP messages at 0.0.0.0, port 3130, FD 11. 2006/04/01 20:11:03| WCCP Disabled. 2006/04/01 20:11:03| Ready to serve requests. 2006/04/01 20:11:03| Done scanning /usr/local/squid/cache (0 entries) 2006/04/01 20:11:03| Finished rebuilding storage from disk. 2006/04/01 20:11:03| 0 Entries scanned 2006/04/01 20:11:03| 0 Invalid entries. 2006/04/01 20:11:03| 0 With invalid flags. 2006/04/01 20:11:03| 0 Objects loaded. 2006/04/01 20:11:03| 0 Objects expired. 2006/04/01 20:11:03| 0 Objects cancelled. 2006/04/01 20:11:03| 0 Duplicate URLs purged. 2006/04/01 20:11:03| 0 Swapfile clashes avoided. 2006/04/01 20:11:03| Took 0.4 seconds ( 0.0 objects/sec). 2006/04/01 20:11:03| Beginning Validation Procedure 2006/04/01 20:11:03| Completed Validation Procedure 2006/04/01 20:11:03| Validated 0 Entries 2006/04/01 20:11:03| store_swap_size = 0k 2006/04/01 20:11:04| storeLateRelease: released 0 objects
Le démon est actif. Squid est fourni avec un client en mode texte. Connectez-vous à Internet et lancez depuis la passerelle
/usr/local/squid/bin/client http://www.squid-cache.org
Testez ensuite une requête identique depuis une machine quelconque du réseau
/usr/local/squid/sbin/squidclient -h 192. 168. O. 1 http://www.squid-cache.org
Ajoutez éventuellement l'option -p 8080.
^C 2006/04/01 20:11:52| Preparing for shutdown after 0 requests 2006/04/01 20:11:52| Waiting 0 seconds for active connections to finish 2006/04/01 20:11:52| FD 10 Closing HTTP connection 2006/04/01 20:11:53| Shutting down... 2006/04/01 20:11:53| FD 11 Closing ICP connection 2006/04/01 20:11:53| Closing unlinkd pipe on FD 9 2006/04/01 20:11:53| storeDirWriteCleanLogs: Starting... 2006/04/01 20:11:53| Finished. Wrote 0 entries. 2006/04/01 20:11:53| Took 0.0 seconds ( 0.0 entries/sec). 2006/04/01 20:11:53| Squid Cache (Version 2.5.STABLE13): Exiting normally.
Et voilà . Vous pouvez le relancer, si nécéssaire, avec la commande:
/usr/local/sbin/squid -D
Pour mettre en place squid de façon "transparente" avec ipfw, voir l'exemple: http://www.squid-cache.org/Doc/FAQ/FAQ-17.html#ss17.7
[modifier] Conclusion
Squid est un logiciel proposant des fonctionnalités nombreuses et configurables dans leurs moindres détails. Consultez la documentation en ligne pour une étude approfondie: http://www.squid-cache.org N.B. Ce manuel est TRES largement inspiré d'un article de Cyril Nocton paru dans Linux Magazine n° 20 de Septembre 2000

