SQUID : Proxy cache filtre

SQUID : Proxy cache filtre jpp

Squid est un proxy-cache parmi les plus connus, l'avantage d'un cache n'est plus à démontrer et tous les browsers en intègrent un. Mais sur un réseau comportant plusieurs machines accédant à Internet il peut être intéressant de disposer d'un cache centralisé qui dimunuera le débit Internet nécessaire et améliorera la vitesse d'affichage. 
Ce proxy peut être installé sur une machine "tête" de réseau qui seule gère l'accès vers Internet. Cette machine peut (doit ?) aussi servir de Firewall commun. 
Une autre fonction d'un proxy est le filtrage et Squid est, bien sûr, muni de possibilités dans ce domaine. La plupart des proxies nécessitent un réglage spécifique des navigateurs en utilisant un port spécifique, en général le 3128. Si le filtrage de Squid est efficace il est donc dans ce cas facile de le contourner en désactivant le cache dans son browser. 
Une autre méthode est d'utiliser un cache "transparent" et d'y rediriger les requêtes sortantes à destination du port 80. Une simple règle iptables permet d'effectuer la redirection de tout ce qui veut sortir vers un port 80 en provenance su réseau "SOURCE" vers le port 3128 standard de SQUID (Note 2016: on peut agir de même en SSL/TLS avec les versions récentes de Squid) :

PATH=/sbin:$PATH 
IFINT=eth0            
 
SOURCE="192.168.1.0/24" 
PORTS=3128 
PORTE=80 
 
iptables -t nat -A PREROUTING -i $IFINT -s $SOURCE -p tcp --dport $PORTE  -j REDIRECT --to-port $PORTS

Il faudra ajouter la directive "http_port 3128 transparent" dans le paramétrage de SQUID. 
Le filtrage sera réalisé par des "ACL" (Access Control List) et des "http_access deny/allow". Afin que le filtrage soit plus "transparent" un pseudo fichier (une image png de un seul point, transparent lui aussi) sera renvoyé à la place de la demande filtrée ce qui évite de polluer les écrans par des messages intempestifs. 

Fichier de paramétrage SQUID partie "générique"  :

http_port 3128 transparent 
hosts_file /etc/hosts 
# Controles standard 
# ------------------ 
acl Safe_ports port 80 
acl all src 0.0.0.0/0.0.0.0 
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 purge method PURGE 
acl CONNECT method CONNECT 

http_access allow manager localhost 
http_access deny manager 
http_access allow purge localhost 
http_access deny purge 
http_access deny !Safe_ports 
 

Nous arrivons ensuite à notre section de filtrage, le fameux "ACL" est effectué par une recherche dans un fichier externe, simple fichier texte (à mettre à jour manuellement, on peut trouver de tels fichiers sur Internet). Le type de règle utilisé "dstdom_regex", il suffit alors que le fichier contienne une URL (ou une partie d'URL) pour que la condition soit remplie.

acl mespub      dstdom_regex "/etc/squid/mespub.txt" 
deny_info file:///etc/squid/deny.png mespub 
http_access deny mespub

Si le fichier "mespub.txt" contient une ligne ".sexe.com" tous les sites dont le nom se termine par "sexe.com" seront invisibles. Ce fichier peut aussi contenir des adresses IP car souvent les sites d'images publicitaires n'ont pas de nom de domaine mais seulement une IP. 
Le fichier paramètre contient à la fin quelques variables "techniques" qu'il est intéressant de conserver (et d'adapter) :

# Filtrage selon reseau d'origine 
acl reso0 src 10.0.1.0/24 
acl reso1 src 127.0.0.1 
acl reso2 src 192.168.1.0/24 
http_access allow reso0 
http_access allow reso1 
http_access allow reso2 
http_access allow localhost 
http_access deny all 
http_reply_access allow all 
# 
# Constantes diverses 
# 
icp_access allow all 
visible_hostname mon_host_name 
memory_pools_limit 1 MB 

access_log     /var/log/squid/access.log squid 
error_directory /usr/share/squid/errors/French 
coredump_dir     /var/spool/squid

Une aide importante à l'utilisation du filtrage est constituée du paquet "sarg" qui permet d'extraire des statistiques d'accès des fichiers de log de SQUID. 
Pour Debian l'installation est immédiate et créée automatiquement les crontabs qui vont bien (journalière, hebdomadaire et mensuelle). 
Pour la partie journalière il vaut mieux "coupler" l'exécution du script avec la purge des fichiers "SQUID" effectuée par "logrotate" en effectuant le calcul des statistiques juste avant la rotation des logs, ajouter un traitement "prerotate" lançant "/usr/sbin/sarg-reports daily" et supprimer le script présent dans "/etc/cron.daily". 
Le résultat est directement consultable sur le serveur en http (il faut évidement avoir Apache sur le serveur SQUID), par défaut tout est installé (Debian) dans /var/www/sarg_reports :

 


Le champ "FICHIER/PERIODE" est cliquable et amène sur une page statistique par adresse IP d'origine: 
 
Les adresses sont cliquables et amènent sur le détail complet des sites HTTP consultés ce jour par cette adresse IP : 
 

C'est un peu indiscret, mais utile pour les mises à jour du fichier texte de filtrage ... noter la mention "REFUSE" sur les sites "bloqués".