Squid

Configuration matérielle utilisée

Un PII 300 MHz, 256 Mo de RAM et 20 G0 de disque dur devraient largement suffire pour un réseau d'une centaine de postes. La machine de test s'appelle « venus ». Elle est indépendante du routeur NAT. Elle est animée par Lenny (testing) et nous testerons le tout avec Squid 3.0.STABLE4-1. Enfin, nous vérifierons que ce que nous avons fait est compatible avec Squid 2.6, également fourni dans la Lenny.

Rien n'empêche cependant d'installer Squid/SquidGuard sur la même machine que le routeur NAT, ce qui simplifiera même les choses, surtout si l'on souhaite rendre le proxy transparent.

Installation

Nous supposons que vous êtes sorti victorieux d'une installation de la « Lenny », que votre configuration réseau fonctionne.

Depuis Squid 2.4, beaucoup de choses ont changé dans le fichier de configuration. Quant à squidGuard, il change de version de base de données Berkeley. Ce sont toutes ces raisons qui m'ont conduit à réécrire ce chapitre.

# apt-get install squid3
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Les paquets supplémentaires suivants seront installés :
squid3-common
Paquets suggérés :
squid3-client squid3-cgi resolvconf smbclient
Les NOUVEAUX paquets suivants seront installés :
squid3 squid3-common
0 mis à jour, 2 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 985ko dans les archives.
Après dépaquetage, 6312ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ?
Réception de : 1 http://mir1.ovh.net testing/main squid3-common 3.0.STABLE-4 [246kB]
Réception de : 2 http://mir1.ovh.net testing/main squid3 3.0.STABLE-4 [739kB]
985ko réceptionnés en 2s (342ko/s)
Sélection du paquet squid3-common précédemment désélectionné.
(Lecture de la base de données... 26690 fichiers et répertoires déjà installés.)
Dépaquetage de squid3-common (à partir de .../squid3-common_3.0.STABLE4_all.deb) ...
Sélection du paquet squid3 précédemment désélectionné.
Dépaquetage de squid3 (à partir de .../squid3_3.0.STABLE4_i386.deb) ...
Paramétrage de squid3-common (3.0.STABLE-4) ...
Paramétrage de squid3 (3.0.STABLE-4) ...
Creating Squid HTTP proxy 3.0 spool directory structure
2007/05/28 18:05:46| Creating Swap Directories
2007/05/28 18:05:46| /var/spool/squid3 exists
2007/05/28 18:05:46| Making directories in /var/spool/squid3/00
2007/05/28 18:05:46| Making directories in /var/spool/squid3/01
2007/05/28 18:05:46| Making directories in /var/spool/squid3/02
2007/05/28 18:05:46| Making directories in /var/spool/squid3/03
2007/05/28 18:05:46| Making directories in /var/spool/squid3/04
2007/05/28 18:05:46| Making directories in /var/spool/squid3/05
2007/05/28 18:05:47| Making directories in /var/spool/squid3/06
2007/05/28 18:05:47| Making directories in /var/spool/squid3/07
2007/05/28 18:05:47| Making directories in /var/spool/squid3/08
2007/05/28 18:05:47| Making directories in /var/spool/squid3/09
2007/05/28 18:05:47| Making directories in /var/spool/squid3/0A
2007/05/28 18:05:48| Making directories in /var/spool/squid3/0B
2007/05/28 18:05:48| Making directories in /var/spool/squid3/0C
2007/05/28 18:05:48| Making directories in /var/spool/squid3/0D
2007/05/28 18:05:48| Making directories in /var/spool/squid3/0E
2007/05/28 18:05:48| Making directories in /var/spool/squid3/0F
Restarting Squid HTTP Proxy 3.0: squid3.
eros:/etc#

Comme vous le voyez, on l'installe et il démarre tout seul.

# ps aux | grep [s]quid
root 571 0.0 1.8 3824 1124 ? S 16:26 0:00 /usr/sbin/squid3 -D -sYC
proxy 574 0.8 8.2 8468 5068 ? S 16:26 0:03 (squid) -D -sYC

Effectivement, il tourne. N'y aurait-il rien de plus à faire ? Vérifions tout de suite. Squid utilise par défaut le port 3128. Configurons donc un navigateur du LAN pour l'utiliser et essayons un URI au hasard…

C'était trop beau… Il faudra déjà mettre les mains dans le cambouis. Notez qu'il vaut mieux une configuration qui interdise trop qu'une configuration qui, par défaut, autorise trop, comme font certains…

Configuration minimale

Les ACL (Access Control Lists) permettent de définir des conditions sur les IPs, les ports, le contenu de certains textes, et j'en passe. Si vous voulez tout savoir sur les diverses ACL de Squid, ne comptez pas sur moi, comptez plutôt sur la documentation officielle.

Le fichier de configuration est /etc/squid3/squid.conf. C'est devenu une habitude de commenter copieusement le fichier de configuration, au point qu'il devient plus un « manual » qu'un fichier de configuration. J'ai personnellement du mal à m'habituer à cette tendance. Aussi, je vous propose cette petite manipulation préliminaire :

# cd /etc/squid3
# mv squid.conf squid.conf.origin 
# cat squid.conf.origin | egrep -v -e '^[[:blank:]]*#|^$' > squid.conf 

(J'adore la clarté des expressions régulières)

Ce qui permet d'obtenir un « vrai » fichier de configuration :

acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all
icp_access allow all
http_port 3128
hierarchy_stoplist cgi-bin ?
access_log /var/log/squid3/access.log squid
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern .		0	20%	4320
icp_port 3130
coredump_dir /var/spool/squid3

Ceci n'empêche bien sûr pas de lire le fichier squid.conf.origin pour se documenter sur la configuration.

Dans un premier temps, disons pour aller très vite au but, que :

  • les « acl » (Access Control List) permettent de définir, par exemple, un plage d'adresses IP, celles qui constituent notre réseau local ;
  • les « http_access » (restrictions) qui définissent l'autorisation ou l'interdit, pour une acl donnée.

Les restrictions indiquent quoi faire lorsque ces conditions sont vérifiées. On autorise ou on interdit en fonction d'une ACL ou d'un groupe d'ACLs, le sens de « restriction » est donc à prendre avec un peu de recul, une restriction pouvant être une autorisation. La première restriction vérifiée est la bonne, d'où l'importance de l'ordre dans lequel elles sont placées.

Sans faire une analyse détaillée, nous voyons que dans la configuration par défaut, seul « localhost » peut utiliser le proxy (Allow localhost). Si cette condition n'est pas respectée, la règle suivante étant deny all, personne ne passe. Il nous faut donc faire intervenir la notion de réseau local.

Créer une ACL représentant le LAN

Bien entendu, l'idée de faire plutôt Allow all est une mauvaise idée. Si votre proxy a un pied dans l'Internet (s'il est installé sur la passerelle), vous risquez un proxy ouvert, avec tous les usages pervertis que l'on peut en faire…

Modifions le fichier squid.conf de cette manière :

acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT
acl LocalNet src 192.168.0.0/24
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow LocalNet
http_access deny all
icp_access allow all
http_port 3128
hierarchy_stoplist cgi-bin ?
access_log /var/log/squid3/access.log squid
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern .		0	20%	4320
icp_port 3130
coredump_dir /var/spool/squid3

Nous avons créé une ACL nommée LocalNet représentant notre réseau local (acl LocalNet src 192.168.0.0/24), et lui avons donné l'autorisation de passer le proxy (http_access allow LocalNet). Nous relançons squid :

# /etc/init.d/squid3 reload
Reloading Squid HTTP Proxy 3.0 configuration files.
done.

Et cette fois-ci :

Nous disposons d'un proxy cache en état de marche pour notre réseau local.