SQUID : cache

SQUID : cache jpp

Logo de Squid

J'utilise Squid  depuis très longtemps, ce blog contient plusieurs articles à ce sujet dont le premier remonte à 2010. 
Note août 2021, à l'occasion du changement de machine (voir l'article spécifique) je suis passé à la version 5 de Squid.

J'ai décidé de les regrouper pour que l'ensemble soit plus facile à consulter. 
Le premier article de la série est une explication générique de l'utilité d'un proxy-cache et de son installation basique.

Le deuxième traite plus particulièrement du cas de l'usage de SSL

Les autres articles présentent divers scripts liés à l'utilisation de Squid et quelques éléments sur les "ACL" (Access Control List) et leur usage.

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". 
 

Squid avec ssl

Squid avec ssl jpp

 
Note avril 2020 : Squid (version  4.9-20200102) est toujours actif et j'ajoute régulièrement quelques données dans les fichiers de filtrage pour définir quelques origines gênantes et je récupère toutes les semaines les informations sur les serveurs de pub depuis https://pgl.yoyo.org

Note juin 2018 : j'utilise toujours Squid (version 4.0.25) sur mon système frontal ce qui permet de bloquer certains sites de pub un peu trop intrusifs et aussi d'accélérer l'affichage. Pour voir le principe des "ACL" et quelques exemples aller ici.

Note septembre 2017, en cas d'ennui de compilation vérifier l'installation de : 
libssl-dev et libcrypto++-dev 
apt-get install libssl-dev libcrypto++-dev 

La version qui "tourne" actuellement est la version 3.5.19-20160618-r14061. Je recompile une nouvelle version de temps en temps, quelques "trucs" que j'utilise sont décrits en annexe. 
Surtout ne pas oublier d'installer votre certificat sur les postes client !

J'ai voulu essayer d'utiliser Squid3 en proxy SSL, mais malheureusement le binaire proposé par Debian est compilé sans l'option SSL. Pour persister dans mon idée il m'a fallu passer par les sources et je vous conte ci-après l'histoire correspondante. 
Cette opération a été réalisée sur une machine Debian 7.4, pour d'autres distributions les répertoires peuvent varier. 
Télécharger la dernière archive (pour moi : squid-3.5.02.tar.xz) et la décompresser dans un répertoire tranquille, j'utilise /usr/src/PGM/BUILD comme répertoire de base et ne touche pas à la disposition "classique des programmes locaux dans /usr/local/.... 
J'ai mis les options de configuration qui m'intéressent dans le petit script suivant :

#!/bin/bash 
# A lancer dans le répertoire de "BUILD" au niveau "au dessus" de squid 
# Mise à jour Aout 2016 pour SQUID 3.5

OPTIONS=' --with-default-user=squid ' 
# MAX FD 
OPTIONS=${OPTIONS}' --with-filedescriptors=16384 ' 
# NO IPV6 
OPTIONS=${OPTIONS}' --disable-ipv6 ' 
#    Enable SSL 
OPTIONS=${OPTIONS}' --enable-ssl --enable-ssl-crtd --enable-inline ' 
# SQUID 3.5 
OPTIONS=${OPTIONS}' --with-openssl ' 
# transparent 
OPTIONS=${OPTIONS}' --enable-linux-netfilter --enable-icmp --with-large-files ' 
OPTIONS=${OPTIONS}' --enable-icap-client --enable-useragent-log --enable-referer-log' 
OPTIONS=${OPTIONS}' --disable-poll --enable-epoll --disable-ident-lookups  ' 
OPTIONS=${OPTIONS}' --enable-async-io=16 --enable-underscores --enable-carp' 
OPTIONS=${OPTIONS}' --enable-storeio=aufs,diskd,rock ' 
OPTIONS=${OPTIONS}' --enable-htpc ' 
OPTIONS=${OPTIONS}' --enable-err-language=fr ' 
OPTIONS=${OPTIONS}' --enable-http-violations '

cd squid-3.5       

./bootstrap.sh

./configure $OPTIONS 2>&1 | tee LOG.CONFIGURE

make clean 2>&1 | tee LOG.CLEAN

make 2>&1 | tee LOG.MAKE

exit

Il ne reste plus qu'à vérifier les logs et lancer un "make install" (en root). 
Ainsi je pourrais compiler d'autres versions sans ennuis, du moins en principe. 
Après un essai de compilation "direct" j'ai eu des ennuis à la première exécution. Après recherche j'ai suivi la procédure conseillée (internet dixit) : lancer avant toute chose dans le répertoire de Squid la commande "./bootstrap.sh" qui configure elle même plein de trucs ... en résultat tout est OK (Le script ci-dessus vous évite ce genre d'ennui. 

Après ce petit baratin on lance le truc et on commence pas aller dans le répertoire de Squid et on lance la grande magie : 
./bootstrap.sh 

On lance le petit script de configuration créé précédemment. Puis le fatidique : 
make 2>&1 | tee MAKE.LOG 

La compilation est assez longue, presque autant que celle d'un noyau Linux! 
Ensuite on peut passer au "make install" en "root" bien sûr ! 
On reste "root" pour la suite, il faut, dans le répertoire par défaut (pour moi /usr/local/squid) :

 

  • Créer un répertoire pour stocker le certificat racine de notre autorité 
    mkdir ssl_cert
  • Créer un certificat 
    Voir le script joint
  • Créer un repertoire "lib" dans  /usr/local/squid/var 
    mkdir lib
  • initialiser le répertoire de cache des certificats créés 
    /usr/local/squid/libexec/ssl_crtd -c -s /usr/local/squid/var/lib/ssl_db

Note : Si le répertoire existe, tout le monde peut faire des erreurs ! Il faut le détruire avant de relancer la commande. Dans ce cas ne pas oublier : 
chown -R squid:squid /usr/local/squid/var/lib/ssl_db"

  • Initialiser les pages de messages d'erreur dans /usr/local/squid/share/errors
  • Créer un répertoire "fr" et un lien de "fr" vers "fr-fr"
  • copier le répertoire "templates" dans "fr" et, pour bien faire traduire les pages !

cd /usr/local/squid/share/errors 
mkdir fr 
ln -s fr fr-fr 
cp ./templates/* ./fr

  • Créer un user "squid" groupe "squid" sans droit de login
  • Comme le user d'exécution prévu est "squid" faire un "chown -R squid:squid /usr/local/squid"

Pour la suite je considère que vous avez déjà un fichier de config qui fonctionne en HTTP classique avec les "acl" et filtres qui vous conviennent. Si ce n'est pas le cas commencer par ce point pour que le cache fonctionne selone vos désirs en HTTP. Pour tester configurez votre navigateur avec Squid comme proxy, dans ce cas otez l'option "transparent" de la configuration, vous la remettrez plus tard avant d'activer le système de redirection. 
Ajouter les paramètres adéquats dans le fichier de configuration "squid.conf" :

# 
# Recommended minimum configuration: 
# 
shutdown_lifetime 5 seconds 

# Example rule allowing access from your local networks. 
# Adapt to list your (internal) IP networks from where browsing 
# should be allowed 
# ACLs all, manager, localhost, and to_localhost are predefined. 
# acl localnet src 10.0.0.0/8    # RFC1918 possible internal network 
# acl localnet src 172.16.0.0/12    # RFC1918 possible internal network 
acl localnet src 192.168.2.0/24     
acl localnet src 192.168.3.0/24 
acl localnet src fc00::/7       # RFC 4193 local private network range 
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines 

acl SSL_ports port 443 
acl Safe_ports port 80        # http 
acl Safe_ports port 81        # 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 

# 
# Recommended minimum Access Permission configuration: 
# 
# Deny requests to certain unsafe ports 
http_access deny !Safe_ports 

# Deny CONNECT to other than secure SSL ports 
http_access deny CONNECT !SSL_ports 

# Only allow cachemgr access from localhost 
http_access allow localhost manager 
http_access deny manager 

# We strongly recommend the following be uncommented to protect innocent 
# web applications running on the proxy server who think the only 
# one who can access services on "localhost" is a local user 
http_access deny to_localhost

# 
#     Ajouter ici vos ACL 
# 
 

# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS 
http_access allow localnet 
http_access allow localhost 

# And finally deny all other access to this proxy 
http_access deny all 
 

# Squid normally listens to port 3128 
http_port 3128 transparent 


# Squid listen Port Add "intercept" ou "transparent" pour proxy transparent 
#     Squid pour redirection (Une seule ligne) 
https_port 192.168.2.11:3129 intercept ssl-bump generate-host-certificates=on cert=/usr/local/squid/ssl_cert/xxxxxx.crt key=/usr/local/squid/ssl_cert/xxxxxx.private options=NO_SSLv2,NO_SSLv3 

# 
## Disable ssl interception for dropbox.com and hotmail.com (and localhost) 
acl no_ssl_interception dstdomain .dropbox.com .hotmail.com 
ssl_bump none localhost 
ssl_bump none no_ssl_interception 
  
# SSL Bump Config 
always_direct allow all 
ssl_bump server-first all 
sslproxy_cert_error allow all 
sslproxy_flags DONT_VERIFY_PEER 
sslcrtd_program /usr/local/squid/libexec/ssl_crtd -s /usr/local/squid/var/lib/ssl_db -M 4MB 
sslcrtd_children 4 startup=2 idle=1 

# Uncomment and adjust the following to add a disk cache directory. 
cache_dir ufs /usr/local/squid/var/cache/squid 2048 32 256

Il faut alors mettre en place une redirection de ports des ports entrants 80 et 443 vers la machine "Squidifiée" sur les ports 3128 et 3129. 
Voir le script joint "Redirection iptables". 
Récupérer un script d'init (il n'y en a pas dans le paquet source) ou bien récupérez celui joint ici (repris de Debian avec quelques adaptations à "/usr/local/squid") puis lancer : 

service squid start 

Et c'est parti ... enfin presque il vous faut avant tout usage HTTPS aller installer votre fichier ".crt" dans le magasin de certificats des browsers du réseau. 
Sinon c'est le blocage assuré de tous les sites HTTPS ! 
C'est le seul inconvénient du proxy HTTPS, comme il doit signer les certificats qu'il vous envoie en lieu et place de ceux qu'il a négociés avec le site il faut qu'il dispose d'une autorité adéquate. Tous les navigateurs disposent de cette possibilité, mais c'est une contrainte importante. 
Pour "curl" et "wget" il faut copier votre certificat de CA dans /etc/ssl/certs, puis l'ajouter à la fin du fichier /etc/ssl/certs/ca-certificates.crt. 
A part cela c'est le  seul moyen de cacher efficacement les pages HTTPS.

Remarque :

Depuis la version du 2 juillet 2015 il est nécessaire d'effectuer une petite modif pour éviter un plantage fatal au démarrage avec message : 
"icmp_sock: (1) Operation not permitted". 
Il suffit de passer le binaire "pinger" (dans squid/libexec) en mode suid root :

cd le_repertoire_de_squid 
cd libexec 
chown root:squid pinger 
chmod 4755 pinger

ou de réaliser un "make install-pinger". 
Comme "pinger" utilise des ports "au hasard" (?) j'ai préféré ajouter l'option "pinger_enable false" dans mon fichier "squid.conf".


Scripts joints :

  • Création certificat
  • Script d'init
  • Exemple de redirection IPTABLES

Squid : script d'init

Squid : script d'init jpp

Script (ancienne mode avec "service") adapté du script fourni par Debian :

#! /bin/sh 
# 
# squid        Startup script for the SQUID HTTP proxy-cache. 
# 
# Version:    @(#)squid3.rc  1.0  07-Jul-2006  luigi@debian.org 
# 
### BEGIN INIT INFO 
# Provides:          squid 
# Required-Start:    $network $remote_fs $syslog 
# Required-Stop:     $network $remote_fs $syslog 
# Should-Start:      $named 
# Should-Stop:       $named 
# Default-Start:     2 3 4 5 
# Default-Stop:      0 1 6 
# Short-Description: Squid HTTP Proxy version 3.x 
### END INIT INFO 

NAME=squid 
DESC="Squid HTTP Proxy 3.x" 
DAEMON=/usr/local/squid/sbin/squid 
PIDFILE=/usr/local/squid/var/run/$NAME.pid 
CONFIG=/usr/local/squid/etc/squid.conf 
SQUID_ARGS="-YC -f $CONFIG" 

[ ! -f /etc/default/squid3 ] || . /etc/default/squid3 

. /lib/lsb/init-functions 

PATH=/bin:/usr/bin:/sbin:/usr/sbin 

[ -x $DAEMON ] || exit 0 

ulimit -n 65535 

find_cache_dir () { 
        w="     " # space tab 
        res=`sed -ne ' 
                s/^'$1'['"$w"']\+[^'"$w"']\+['"$w"']\+\([^'"$w"']\+\).*$/\1/p; 
                t end; 
                d; 
                :end q' < $CONFIG` 
        [ -n "$res" ] || res=$2 
        echo "$res" 
} 

find_cache_type () { 
    w="     " # space tab 
    res=`sed -ne ' 
        s/^'$1'['"$w"']\+\([^'"$w"']\+\).*$/\1/p; 
        t end; 
        d; 
        :end q' < $CONFIG` 
    [ -n "$res" ] || res=$2 
    echo "$res" 
} 

start () { 
    killall -u squid 
    cache_dir=`find_cache_dir cache_dir` 
    cache_type=`find_cache_type cache_dir` 

    # 
    # Create spool dirs if they don't exist. 
    # 
    if [ "$cache_type" = "coss" -a -d "$cache_dir" -a ! -f "$cache_dir/stripe" ] || [ "$cache_type" != "coss" -a -d "$cache_dir" -a ! -d "$cache_dir/00" ] 
    then 
        log_warning_msg "Creating $DESC cache structure" 
        $DAEMON -z -f $CONFIG 
    fi 

    umask 027 
    ulimit -n 65535 
    cd $cache_dir 
    start-stop-daemon --quiet --start \ 
        --pidfile $PIDFILE \ 
        --exec $DAEMON -- $SQUID_ARGS < /dev/null 
    return $? 
} 

stop () { 
    PID=`cat $PIDFILE 2>/dev/null` 
    start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON 
    # 
    #    Now we have to wait until squid has _really_ stopped. 
    # 
    sleep 2 
    if test -n "$PID" && kill -0 $PID 2>/dev/null 
    then 
        log_action_begin_msg " Waiting" 
        cnt=0 
        while kill -0 $PID 2>/dev/null 
        do 
            cnt=`expr $cnt + 1` 
            if [ $cnt -gt 24 ] 
            then 
                log_action_end_msg 1 
                return 1 
            fi 
            sleep 1 
            log_action_cont_msg "" 
        done 
        log_action_end_msg 0 
        killall -u squid 
        return 0 
    else 
        return 0 
    fi 
} 

case "$1" in 
    start) 
    log_daemon_msg "Starting $DESC" "$NAME" 
    if start ; then 
        log_end_msg $? 
    else 
        log_end_msg $? 
    fi 
    ;; 
    stop) 
    log_daemon_msg "Stopping $DESC" "$NAME" 
    if stop ; then 
        log_end_msg $? 
    else 
        log_end_msg $? 
    fi 
    ;; 
    reload|force-reload) 
    log_action_msg "Reloading $DESC configuration files" 
    start-stop-daemon --stop --signal 1 \ 
        --pidfile $PIDFILE --quiet --exec $DAEMON 
    log_action_end_msg 0 
    ;; 
    restart) 
    log_daemon_msg "Restarting $DESC" "$NAME" 
    stop 
    if start ; then 
        log_end_msg $? 
    else 
        log_end_msg $? 
    fi 
    ;; 
    status) 
    status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit 3 
    ;; 
    *) 
    echo "Usage: /etc/init.d/$NAME {start|stop|reload|force-reload|restart|status}" 
    exit 3 
    ;; 
esac 

exit 0 
 

Squid : quelques "ACL"

Squid : quelques "ACL" jpp

Les très fameux "ACL" permettent, entre autres, de filtrer efficacement des sites "indésirables". 
Les plus souvent visés sont les sites "pour adultes", mais on peut y ajouter les sites qui farcissent vos écrans de publicités diverses ou qui vous "pistent". 
Squid dispose pour cela de trois types principaux d'ACL (il y en a d'autres) mais la documentation est parfois sybilline. 
Pour la plupart d'entre eix une syntaxe permet de déporter les paramètres dans un bête fichier texte externe dont il suffit d'indiquer le nom, ce nom peut être donné sous la forme d'une URL. Je mets "http://mon_serveur_web/deny.png" qui pointe vers une image de 1 pixel, comme cela on ne voit rien sur l'écran ! 
Premier type : liste d'URL "à éviter". 
acl  listeurl  dstdomain "/etc/squid/nom_du_fichier" 
deny_info      http://mon_serveur/deny.png        listeurl 
http_access    deny   listeurl

Le format est simple, des noms de domaines, s'il sont précédés d'un point tous les sous-domaines sont eux aussi bloqués. Exemple : 
.yieldmanager.com 
.zanox-affiliate.de 
.zanox.com 

Deuxième type : liste d'IP "incorrectes" 
acl  listeip   dst        "/etc/squid/nom_du_fichier_ip" 
deny_info      http://mon_serveur/deny.png        listeip 
http_access    deny   listeip

Le format du fichier est simple : des adresses IP au format CIDR, par exemple : 
209.207.224.220/32 
209.207.224.246/32

Troisième type : liste d'expressions régulières. 
acl ad_block   dstdom_regex    "/etc/squid/ad_block.db" 
deny_info      http:/mon_serveur/deny.png  ad_block 
http_access    deny        ad_block 

Pour cette dernière liste j'utilise une liste "toute faite", il en existe plusieurs, par exemple un petit :

wget -O /etc/squid/ad_block.db 'http://pgl.yoyo.org/adservers/serverlist.php?hostformat=squid-dstdom-regex&show…'

Un petit exemple quand même pour la route :

.zintext\.com 
.zmedia\.com 
Note : cela marche aussi sans le "\" devant .com. 
Avec tout ceci vous êtes parés à filtrer.

Télécharger ma liste de "vilains méchants". Elle date un peu depuis 2014, mais elle est mise à jour assez régulièrement.

Squid : script generation certificat

Squid : script generation certificat jpp

Ce script est le résultat de diverses récupérations sur Internet .... le certificat généré (autorité) à charger dans les navigateurs "clients" est le fichier en ".crt"

#!/bin/bash 
# 
SORTIE() 
{ 
if [ "$1" -eq 0 ] 
   then 
    echo 'OK' 
   else 
    echo ------- KO ----------; 
fi 
exit 
}

# Partie a personnaliser 
RCN=/usr/local/squid/ssl_cert 
KNAME='votre_autorite'; 
PAYS=FR 
REGION=Idf 
VILLE='Trifouilly les Oies' 
NA=le_nom_de_votre_entite 
FQDN=votre_nom 
MAIL=un_mail_bien_a_vous   
PASS='une_phrase_de_passe' 

cd $RCN 
ret=$? 
if [ $ret -ne 0 ] 
   then 
    echo 'Erreur cd '$RCN 
    SORTIE 1 
    exit $ret 
fi 
# Generer la clef (2048 bits) 
openssl genrsa -out $KNAME'.private'  2048 
ret=$? 
if [ $ret -ne 0 ] 
   then 
    SORTIE 2 
fi 
# generer certificat 
openssl req -new -key $KNAME'.private' -out $KNAME'.csr' <<!FINI 
$PAYS 
$REGION 
$VILLE 
$NA 
$NA 
$FQDN 
$MAIL 
$PASS 
$NA 
!FINI 
ret=$? 
if [ $ret -ne 0 ] 
   then 
    SORTIE 3 
fi 
### signer 
openssl x509 -req -days 3652 -in $KNAME'.csr' -signkey $KNAME'.private' -out $KNAME'.crt' 
ret=$? 
if [ $ret -ne 0 ] 
   then 
    SORTIE 4 
fi 
SORTIE 0

Squid : script de redirection

Squid : script de redirection jpp

Ce script "iptables" effectue la redirection des trames demandant à "sortir" vers les ports 80 ou 443, les trames sont automatiquement redirigées sur les "bons" ports de Squid.

#!/bin/bash 
# 
#    Diversion port 80 to 3128 (squid) 
#    et 443 to 3129 (squid SSL) 
# 
GENER() 
{ 
iptables -t nat $1 PREROUTING -i $IFINT -s $SOURCE -p tcp $OPTION --dport $PORTE  -j REDIRECT --to-port $PORTS 
} 
# ================================================================ 

PATH=/sbin:$PATH 
# interface vers reseau privé 
IFINT=br1 
# adresse du réseau à "Traiter" 
SOURCE="192.168.2.0/24" 
# Ne pas proxifier ce host, c'est le support de SQUID 
HOST='192.168.2.2'     
OPTION=' ! -d '$HOST 
# 
#    HTTP 
# 
PORTS=3128 
PORTE=80 
# 
GENER -D 
GENER -I 
# 
#    HTTPS 
# 
PORTS=3129 
PORTE=443 
# 
GENER -D 
GENER -I 

exit 0 
 

Squid listes de sites à éviter

Squid listes de sites à éviter jpp

Depuis le temps que j'utilise Squid j'ai accumulé deux listes de sites à filtrer :

  1. Une liste de noms de domaines.
  2. Une liste d'adresses IP.

ACL pour la liste d'adresses IP: 
acl             badip   dst     "/etc/squid/badip.txt" 
deny_info       http://apache_local:81/deny.png  badip 
http_access     deny    badip 

ACL pour la liste de noms de domaine : 
acl             trade   dstdomain       "/etc/squid/trade.txt" 
deny_info       http://portail.jpp.fr:81/deny.png&nbsp; trade 
http_access     deny            trade

Téléchargez la liste IP (#200 adresses) ici.

Téléchargez la liste de sites (#800 noms de domaines) ici.

Voir aussi l'article sur les listes publiques permettant d'améliorer le filtrage.

Note 2024 : Ces listes ne sont plus à jour depuis 2020 ... il va falloir que je m'y remette ...

Squid version 4

Squid version 4 jpp

Debian Stretch a abandonné la version 1.0 de Openssl et le paquet "libssl-dev" est dédié à la version 1.1, aussi les anciennes versions de Squid (3.5 par exemple) ne compilent plus avec Debian 9 et provoquent des erreurs si l'ancienne version de libssl n'est pas présente, voir article sur ce plantage. 
J'ai donc décidé de passer à la version 4 de Squid qui est adaptée à libssl 1.1. 
Pour disposer de cette version c'est très simple :

  • Télécharger les sources sur http://www.squid-cache.org/Versions/v4, j'ai téléchargé la version la plus récente squid-4.0.21-20170901-ra8623e5 datée du 1er septembre.
  • Décompresser l'archive
  • Lancer le script ci dessous :
#!/bin/bash 
OPTIONS=' --with-default-user=squid ' 
# MAX FD 
OPTIONS=$OPTIONS' --with-filedescriptors=16384 ' 
# NO IPV6 
OPTIONS=$OPTIONS' --disable-ipv6 ' 
## Modif pour V4 
OPTIONS=$OPTIONS' --enable-ssl --enable-inline ' 
# Depuis SQUID 3.5 
OPTIONS=$OPTIONS' --with-openssl ' 
# transparent (pour utiliser redirection avec iptables) 
OPTIONS=$OPTIONS' --enable-linux-netfilter --enable-icmp --with-large-files ' 
OPTIONS=$OPTIONS' --enable-icap --enable-useragent-log --enable-referer-log' 
OPTIONS=$OPTIONS' --disable-poll --enable-epoll --disable-ident-lookups ' 
OPTIONS=$OPTIONS' --enable-async-io=16 --enable-underscores --enable-carp' 
OPTIONS=$OPTIONS' --enable-storeio=aufs,diskd,rock ' 
OPTIONS=$OPTIONS' --enable-htpc ' 
OPTIONS=$OPTIONS' --enable-err-language=fr ' 
OPTIONS=$OPTIONS' --enable-http-violations ' 
# Nouveau 4.0 
OPTIONS=$OPTIONS' --enable-delay-pools ' 
OPTIONS=$OPTIONS' --enable-kill-parent-hack ' 
OPTIONS=$OPTIONS' --enable-translation ' 
cd squid-4..... 
./bootstrap 
./configure $OPTIONS 2>&1 | tee LOG.CONFIGURE make clean 2>&1 | tee LOG.CLEAN 
make -j 3 2>&1 | tee LOG.MAK 
make clean 2>&1 | tee LOG.CLEAN 
make -j 3 2>&1 | tee LOG.MAK

Il ne vous restera plus qu'à effectuer un "sudo make install" pour disposer de cette dernière version qui fonctionne parfaitement avec libssl 1.1. 
A noter : le reste de l'installation, y compris le paramétrage, restent identiques à ceux utilisés pour la version 3.5. 
 

Améliorer le filtrage de Squid

Améliorer le filtrage de Squid jpp

La fonction filtre de Squid fonctionne essentiellement à l'aide de listes noires, il est donc essentiel de disposer de "listes noires" à jour car les publicitaires "invasifs" n'hésitent pas à modifier leurs noms de domaines et les adresses IP de leurs machines (merci le cloud !).

Une bonne source de ces listes est le site https://pgl.yoyo.org, vous pouvez aussi aller voir https://yoyo.org. 
Comme ces listes ne sont pas forcément dans un format reconnu par Squid, j'utilise deux scripts qui effectuent :

  • La récupération des données.
  • Leur mise en forme.
  • Leur placement dans le bon répertoire sous le "bon nom" reconnu par le paramétrage de Squid.

 Le paramétrage dans "squid.conf" est simple, il suffit d'ajouter :

Paramétrage SQUID

acl         yoyo_ip     dst      "/etc/squid/yoyo_bad_adresses.txt" 
deny_info     http://xxxxxxx/deny.png   yoyo_ip 
http_access     deny     yoyo_ip

acl    ad_block    dstdom_regex    "/etc/squid/ad_block.db" 
deny_info     http://xxxxxxx/deny.png  ad_block 
http_access    deny        ad_block

Note : le renvoi est fait vers un serveur Apache (Nginx doit faire aussi bien) résidant sur la même machine, le fichier "deny.png" est une simple image d'un petit point rouge. 
On doit pouvoir faire le même genre d'opération avec un fichier "local" sur les postes clients. 
Ces scripts sont, plus ou moins, paramétrables à l'aide d'un fichier ".conf"et réalisent les opérations pour lesquelles ils ont été conçus. 
Il est conseillé de les lancer une fois par semaine afin de bénéficier d'une mise à jour régulière.

Les scripts sont disponibles ici en format tar.gz.