Squid

De The Linux Craftsman
Aller à la navigation Aller à la recherche
Mode basic Mode transparent
Protocole tcp tcp
Port 3128 80
Configuration Iptables iptables -I INPUT 2 -p tcp --dport 3128 -j ACCEPT

iptables -I INPUT 2 -p tcp --dport 3128 -j ACCEPT

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3128


Préparation

Dans un premier temps, il faudra avoir une connexion à Internet, utiliser un serveur DNS et désactiver SELinux.

Pour ceux qui auraient manqué des étapes, les voici:

Une fois ces étapes effectuées, entrons dans le vif du sujet !

Installation

# yum -y install squid

Configuration

Réseaux source

Commençons par spécifier le réseau duquel parviennent les requêtes HTTP.

Pour cela, remplacez les lignes suivantes dans le fichier /etc/squid/squid.conf

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.0.0/16 # RFC1918 possible internal network

un peu trop permissives par

acl localnet src 192.168.1.0/24 # RFC1918 possible internal network

pour autoriser le réseau 192.168.1.0/24.

Mode proxy basique

Dans ce mode, il est obligatoire de configurer les navigateurs des clients pour qu'ils passent par le proxy. Il n'y a rien d'autre à faire qu'ouvrir le port 3128 du pare-feu et configurer le navigateur en conséquence.

# iptables -I INPUT 2 -p tcp --dport 3128 -j ACCEPT

On démarre le service :

  • Pour SystemVInit:
service squid start
  • Pour SystemD:
systemctl start squid.service

On vérifie que Squid écoute sur le bon port

# netstat -atnp | grep squid
tcp        0      0 0.0.0.0:3128                0.0.0.0:*                   LISTEN      8432/(squid)

Mode proxy transparent

Ce mode est beaucoup plus intéressant car il ne nécessite aucune configuration au niveau des navigateurs clients.

L'astuce consiste à rediriger le trafic passant sur le port TCP/80 vers le port TCP/3128

# iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to 3128

Il faut ensuite modifier la ligne suivante dans le fichier /etc/squid/squid.conf

http_port 3128 intercept transparent

Pour plus d'informations sur les avantages / inconvénients de la transparence vous pouvez consulter ces liens:

Les options intéressantes

Activation du cache

Pour que le proxy puisse mémoriser le contenu statique des requêtes et ainsi accélérer le trafic, il faut activer le cache.

Pour cela, repérez la ligne

# cache_dir ufs /var/spool/squid 100 16 256

et remplacez-la par

cache_dir ufs /var/spool/squid 100 16 256
cache_mem 100 MB
cache_effective_user squid
cache_effective_group squid

Avant de lancer Squid, il faut qu'il génère les fichiers du cache

# squid -z
2014/01/23 08:17:23| Creating Swap Directories
2014/01/23 08:17:23| /var/spool/squid exists
2014/01/23 08:17:23| Making directories in /var/spool/squid/00
2014/01/23 08:17:23| Making directories in /var/spool/squid/01
2014/01/23 08:17:23| Making directories in /var/spool/squid/02
2014/01/23 08:17:23| Making directories in /var/spool/squid/03
2014/01/23 08:17:23| Making directories in /var/spool/squid/04
2014/01/23 08:17:23| Making directories in /var/spool/squid/05
2014/01/23 08:17:23| Making directories in /var/spool/squid/06
2014/01/23 08:17:23| Making directories in /var/spool/squid/07
2014/01/23 08:17:23| Making directories in /var/spool/squid/08
2014/01/23 08:17:23| Making directories in /var/spool/squid/09
2014/01/23 08:17:23| Making directories in /var/spool/squid/0A
2014/01/23 08:17:23| Making directories in /var/spool/squid/0B
2014/01/23 08:17:23| Making directories in /var/spool/squid/0C
2014/01/23 08:17:23| Making directories in /var/spool/squid/0D
2014/01/23 08:17:23| Making directories in /var/spool/squid/0E
2014/01/23 08:17:23| Making directories in /var/spool/squid/0F

Cela créera un cache de 100Mo, vous pouvez le modifier en fonction de votre trafic.

Il ne reste plus qu'à tester le cache pour un fichier statique (ici photo.jpg)

# cat /var/log/squid/access.log | grep photo.jpg
1390462989.170    859 192.168.50.101 TCP_MISS/200 35435 GET http://www.squid.org/wp-content/uploads/2009/03/photo.jpg - DIRECT/204.10.35.1 image/jpeg
1390463000.043      1 192.168.50.101 TCP_MEM_HIT/200 35442 GET http://www.squid.org/wp-content/uploads/2009/03/photo.jpg - NONE/- image/jpeg

La première fois que le fichier est demandé on a un TCP_MISS et, en revanche, la deuxième fois on a bien un TCP_MEM_HIT !

Préciser le nom de la machine

Quand le proxy possède plusieurs noms dans le DNS (CNAME) il peut être utile de préciser celui qui est utilisé dans les fichiers de logs ou s'il existe plusieurs caches dans un cluster.

visible_hostname squid

Réduire le downtime

Si vous avez déjà redémarré Squid, le temps d'arrêt n'a pas du vous échapper ! 30 secondes... il est possible de réduire ce temps en utilisant la directive shutdown_lifetime

shutdown_lifetime 2 seconds

Les paramètres DNS

Lorsque l'on veut accèder à un site web interne, il peut être intéressant d'ajouter les paramètres DNS pour que Squid fasse la résolution convenablement au lieu d'afficher cela:

Squid bad dns params.png

D'ailleur quand on regarde dans les logs on voit bien que la requête reste inchangée:

1451812596.361    111 192.168.1.11 TCP_MISS/503 3092 GET http://hades/ - DIRECT/192.168.40.253 text/html

Ajoutons les lignes suivantes à la fin du fichier /etc/squid/squid.conf:

dns_nameservers 192.168.1.254 8.8.8.8
append_domain .tala-informatique.fr

Si on regarde maintenant dans les logs, squid ajoute maintenant automatiquement le nom de domaine:

1451812845.330  17055 192.168.1.11 TCP_MISS/503 3134 GET http://hades.tala-informatique.fr/ - DIRECT/192.168.40.253 text/html

Enregistrement dans le chargeur de démarrage

  • Pour SystemVInit:
chkconfig squid on
  • Pour SystemD:
systemctl enable squid.service

Génération de rapports

Comme vous avez pu le constater, le fichier /var/log/squid/access.log contient beaucoup d'informations mais n'est pas très lisible. Pour extraire et formater les données de ce fichier nous allons utiliser Calamaris.

Pré-requis

Avant d'aller plus loin, il sera nécessaire d'installer le dépôt EPEL et d'avoir un serveur Web pour afficher le rapport

Installation

# yum -y install calamaris

Génération de rapport

# calamaris -a -F html -l '<img src="http://wiki/skins/common/images/labo-logo.jpg"/>' /var/log/squid/access.log > /var/www/html/index.html

Cela donne un rapport qui contient toutes les informations nécessaires:

  • -a → pour extraire toutes les informations ;
  • -F → pour préciser le format de sortie (ici HTML);
  • -l → pour spécifier un logo
Calamaris simple.png

Automatisation

Maintenant il ne reste plus qu'à automatiser cette génération avec un cron

On va créer le script calamaris.sh dans le répertoire /opt/squid

# mkdir -p /opt/squid
# vi /opt/squid/calamaris.sh

Pour y placer les lignes suivantes:

#!/bin/bash

calamaris -a -F html -l '<img src="http://wiki/skins/common/images/labo-logo.jpg"/>' /var/log/squid/access.log > /var/www/html/index.html
chown apache.apache /var/www/html/index.html

A le rendre exécutable

# chmod +x /opt/squid/calamaris.sh

Et le mettre dans le crontab avec la commande crontab -e (plus d'information sur cron)

*/10 * * * * /opt/squid/calamaris.sh

Le script sera exécuté toutes les 10 minutes !

Blocage des pubs

La blacklist

Principe

C'est le même système que pour les mails et qui consiste en une liste, pas toujours exhaustive, de tous les noms de domaines qui servent aux publicistes. Cette liste est disponible ici

Création du script

On va créer un script dans le répertoire /opt/squid qui va:

  • télécharger ce fichier dans le répertoire de Squid
  • recharger la configuration de Squid
#!/bin/bash

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

squid -k reconfigure

Configuration de Squid

On va ajouter les lignes suivantes dans le fichier de configuration de Squid

acl ads dstdom_regex "/etc/squid/ad_block.db"
http_access deny ads

Juste après la ligne

#
# Recommended minimum Access Permission configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost

Automatisation

Enfin on ajoute une entrée dans le crontab avec la commande crontab -e (plus d'information sur cron):

* 0 * * * /opt/squid/ad-updater.sh

Tous les jours à minuit le script sera exécuté !

Test

Maintenant, lorsqu'une page de pub fait son apparition, vous devriez avoir ceci:

Squid block.png

Le redirecteur

Le redirecteur est un peu plus performant que la blacklist dans le sens où il va 'filtrer' les requêtes du client et demander à Squid de ne chercher que le contenu utile. Cette recherche à base de REGEX se fait en amont et remplacera l'écran d'erreur de Squid (ci-dessus) par un carré vide (peut-être mieux visuellement).

Récupération

Tout d'abord, on va récupérer l'archive contenant Adzaper, le programme que l'on va utiliser.

# wget http://adzapper.sourceforge.net/adzap-20110915.tar.gz
# tar -zxf adzap-20110915.tar.gz

Installation

Une fois l'archive décompressée, on va:

  • copier le fichier wrapzap
  • se déplacer dans le répertoire /opt/squid
  • télécharger le redirecteur squid_redirect
  • rendre les deux fichiers exécutables
  • éditer le fichier wrapzap
# cp adzap-20110915/scripts/wrapzap /opt/squid
# cd /opt/squid
# wget http://adzapper.sourceforge.net/scripts/squid_redirect
# chmod +x wrapzap squid_redirect
# vi wrapzap

Dans le fichier wrapzap, on va adapter la directive zapper :

zapper=/opt/squid/squid_redirect

Enfin on va ajouter la ligne suivante dans /etc/squid/squid.conf

Configuration de Squid

redirect_program /opt/squid/wrapzap
redirect_children 20

L'option redirect_children permet de spécifier le nombre de processus créés par le programme redirecteur

Test

Si on fait un tail du fichier /var/log/squid/access.log on peut voir les lignes suivantes:

# tail -f /var/log/squid/access.log
1390754440.930    417 192.168.1.1 TCP_MISS/200 11408 GET http://labaiedespirates.se/search/windows%202012/0/99/0 - DIRECT/194.71.107.27 text/html
1390754441.082      1 192.168.1.1 TCP_DENIED/403 3097 GET http://syndication.exoclick.com/ads.php? - NONE/- text/html
1390754441.083      0 192.168.1.1 TCP_DENIED/403 3097 GET http://syndication.exoclick.com/ads.php? - NONE/- text/html
1390754441.096      1 192.168.1.1 TCP_DENIED/403 3097 GET http://syndication.exoclick.com/ads.php? - NONE/- text/html
1390754441.096      1 192.168.1.1 TCP_DENIED/403 3097 GET http://syndication.exoclick.com/ads.php? - NONE/- text/html
1390754441.098      0 192.168.1.1 TCP_DENIED/403 3097 GET http://syndication.exoclick.com/ads.php? - NONE/- text/html

Le gros avantage du redirecteur est qu'il bloque également les popups qui ne s'ouvrent même plus côté client et l'image suivante viendra remplacer les pubs bloquées

Ad zapped.png

Parcours des logs

Les messages de Squid

Quand quelque chose ne tourne pas rond, Squid le dit dans le fichier /var/log/squid.out:

2014/01/22 06:47:57| WARNING: Could not determine this machines public hostname. Please configure one or set 'visible_hostname'.
FATAL: Bungled squid.conf line 61: http_port 3128 transaprent
Squid Cache (Version 3.1.10): Terminated abnormally.
CPU Usage: 0.023 seconds = 0.010 user + 0.013 sys
Maximum Resident Size: 22848 KB
Page faults with physical i/o: 0
2014/01/22 08:03:41| WARNING cache_mem is larger than total disk cache space!
squid: ERROR: No running copy
2014/01/22 08:03:52| Creating Swap Directories
2014/01/22 08:03:52| /var/spool/squid exists
2014/01/22 08:03:52| Making directories in /var/spool/squid/00
2014/01/22 08:03:52| Making directories in /var/spool/squid/01
2014/01/22 08:03:52| Making directories in /var/spool/squid/02
2014/01/22 08:03:52| Making directories in /var/spool/squid/03
2014/01/22 08:03:52| Making directories in /var/spool/squid/04
2014/01/22 08:03:52| Making directories in /var/spool/squid/05
2014/01/22 08:03:52| Making directories in /var/spool/squid/06
2014/01/22 08:03:52| Making directories in /var/spool/squid/07
2014/01/22 08:03:52| Making directories in /var/spool/squid/08
2014/01/22 08:03:52| Making directories in /var/spool/squid/09
2014/01/22 08:03:52| Making directories in /var/spool/squid/0A
2014/01/22 08:03:52| Making directories in /var/spool/squid/0B
2014/01/22 08:03:52| Making directories in /var/spool/squid/0C
2014/01/22 08:03:52| Making directories in /var/spool/squid/0D
2014/01/22 08:03:52| Making directories in /var/spool/squid/0E
2014/01/22 08:03:52| Making directories in /var/spool/squid/0F

Souvent, les erreurs sont facilement corrigées, comme par exemple:

2014/01/22 06:47:57| WARNING: Could not determine this machines public hostname. Please configure one or set 'visible_hostname'.

Il suffit de rajouter la directive visible_hostname dans le fichier squid.conf

Ou encore l’absence de l'option cache_mem provoque l'erreur suivante:

2014/01/22 08:03:41| WARNING cache_mem is larger than total disk cache space!

Les accès HTTP

Tous les accès sont consignés dans le fichier /var/log/squid/access.log

1392570666.167    746 192.168.1.2 TCP_MISS/200 413 GET http://www.lesclesdumidi.com/updatestats.php? - DIRECT/94.23
1392570668.165    784 192.168.1.2 TCP_MISS/200 413 GET http://www.lesclesdumidi.com/updatestats.php? - DIRECT/94.23
1392570675.655    206 192.168.1.1 TCP_MISS/200 261 POST http://vl.ff.avast.com/F/AAHwy7oPFEJHZIaA4ipWFKJy - DIRECT/
1392570682.608    109 192.168.1.2 TCP_MISS/200 413 GET http://www.lesclesdumidi.com/updatestats.php? - DIRECT/94.2

On peut voir:

  • le temps
  • la durée de la requête
  • l'adresse du client
  • le code / status
  • le volume de données (octet)
  • la méthode
  • l'URL demandée
  • le status du peer

Ce qui nous fait:

Time elapsed client address code / status bytes method URL peer status
1392570682.608 109 192.168.1.2 TCP_MISS/200 413 GET http://www.lesclesdumidi.com/updatestats.php? DIRECT/94.2

Vérification du cache

Il peut être judicieux de vérifier régulièrement si le cache de votre proxy est toujours adapté à l'utilisation que vous en faites.

Cela se passe dans le fichier /var/log/squid/cache.log

2014/02/16 18:17:01| Starting Squid Cache version 3.1.10 for x86_64-redhat-linux-gnu...
2014/02/16 18:17:01| Process ID 21458
2014/02/16 18:17:01| With 1024 file descriptors available
2014/02/16 18:17:01| Initializing IP Cache...
2014/02/16 18:17:01| DNS Socket created at [::], FD 7
2014/02/16 18:17:01| DNS Socket created at 0.0.0.0, FD 8
2014/02/16 18:17:01| Adding nameserver 192.168.1.254 from /etc/resolv.conf
2014/02/16 18:17:01| Adding nameserver 212.27.40.244 from /etc/resolv.conf
2014/02/16 18:17:01| Adding domain tala-informatique.fr from /etc/resolv.conf
2014/02/16 18:17:01| helperOpenServers: Starting 30/30 'wrapzap' processes
2014/02/16 18:17:01| User-Agent logging is disabled.
2014/02/16 18:17:01| Referer logging is disabled.
2014/02/16 18:17:01| Unlinkd pipe opened on FD 73
2014/02/16 18:17:01| Local cache digest enabled; rebuild/rewrite every 3600/3600 sec
2014/02/16 18:17:01| Store logging disabled
2014/02/16 18:17:01| Swap maxSize 102400 + 102400 KB, estimated 15753 objects
2014/02/16 18:17:01| Target number of buckets: 787
2014/02/16 18:17:01| Using 8192 Store buckets
2014/02/16 18:17:01| Max Mem  size: 102400 KB
2014/02/16 18:17:01| Max Swap size: 102400 KB
2014/02/16 18:17:01| Version 1 of swap file with LFS support detected...
2014/02/16 18:17:01| Rebuilding storage in /var/spool/squid (CLEAN)
2014/02/16 18:17:01| Using Least Load store dir selection
2014/02/16 18:17:01| Set Current Directory to /var/spool/squid
2014/02/16 18:17:02| Loaded Icons.
2014/02/16 18:17:02| Accepting  intercepted HTTP connections at 0.0.0.0:3128, FD 76.
2014/02/16 18:17:02| HTCP Disabled.
2014/02/16 18:17:02| Squid plugin modules loaded: 0
2014/02/16 18:17:02| Adaptation support is off.
2014/02/16 18:17:02| Ready to serve requests.
2014/02/16 18:17:03| Store rebuilding is 62.28% complete
2014/02/16 18:17:04| Done reading /var/spool/squid swaplog (6576 entries)
2014/02/16 18:17:04| Finished rebuilding storage from disk.
2014/02/16 18:17:04|      6576 Entries scanned
2014/02/16 18:17:04|         0 Invalid entries.
2014/02/16 18:17:04|         0 With invalid flags.
2014/02/16 18:17:04|      6576 Objects loaded.
2014/02/16 18:17:04|         0 Objects expired.
2014/02/16 18:17:04|         0 Objects cancelled.
2014/02/16 18:17:04|         0 Duplicate URLs purged.
2014/02/16 18:17:04|         0 Swapfile clashes avoided.
2014/02/16 18:17:04|   Took 2.49 seconds (2639.67 objects/sec).
2014/02/16 18:17:04| Beginning Validation Procedure
2014/02/16 18:17:04|   Completed Validation Procedure
2014/02/16 18:17:04|   Validated 13177 Entries
2014/02/16 18:17:04|   store_swap_size = 92156
2014/02/16 18:17:04| storeLateRelease: released 0 objects

Ci-dessus, un démarrage de cache, mais tout ne se passe pas toujours bien. Dans l'exemple ci-dessous, on s'aperçoit que le nombre de processus redirecteurs est trop faible.

2014/02/16 17:43:20| WARNING: All redirector processes are busy.
2014/02/16 17:43:20| WARNING: 5 pending requests queued
2014/02/16 17:43:20| Consider increasing the number of redirector processes in your config file.


Reverse Proxy

Dans ce cas de figure, Squid va recevoir toutes les requêtes HTTP et les distribuer au bon serveur Web. Il utilise également son système de cache pour accélérer les requêtes et ainsi décharger les serveurs Web.

Squid reverse proxy.png

On a :

  • un proxy squid (Proxy);
  • un serveur Web par défaut (Web);
  • un serveur Web hébergeant un wiki (Wiki);
  • un pare-feu qui redirige tout le trafic TCP/80 vers le proxy.

Au niveau DNS on a:

  • Pour les clients extérieurs:
    • web.tala-informatique.fr → pare-feu;
    • wiki.tala-informatique.fr → pare-feu;
  • Pour le proxy:
    • web.tala-informatique.fr → web;
    • wiki.tala-informatique.fr → wiki;

Accélérateur basique (un site Web)

Tout se passe dans /etc/squid/squid.conf et les lignes suivantes doivent être insérées en début de fichier sinon certaines règles peuvent empêcher les clients d'accéder au site accéléré.

http_port 80 accel defaultsite=web.tala-informatique.fr
cache_peer web.tala-informatique.fr parent 80 0 no-query originserver name=accel_web login=PASS
  • http_portSquid écoute sur le port 80;
  • accelSquid agit comme s'il était le serveur Web;
  • defaultsite → utilise ce domaine si le client n'envoie pas un header correct;
  • login=PASS → permet de passer les informations d'authentification au serveur Web.

Enfin, il ne reste plus qu'à faire une ACL qui autorise le trafic vers le serveur Web

acl web dstdomain web.tala-informatique.fr
http_access allow web
cache_peer_access accel_web allow web
cache_peer_access accel_web deny all

Accélérateur multi-site

Dans ce cas de figure, on veut rediriger vers une machine différente en fonction de l'URL. Pour cela, on va procéder comme suit:

http_port 80 accel defaultsite=web.tala-informatique.fr vhost

cache_peer web.tala-informatique.fr parent 80 0 no-query originserver name=web login=PASS
cache_peer_domain web web.tala-informatique.fr

cache_peer wiki.tala-informatique.fr parent 80 0 no-query originserver name=wiki login=PASS
cache_peer_domain wiki wiki.tala-informatique.fr

On peut remarquer:

  • vhost → permet de spécifier à Squid qu'il doit analyser les URL
  • cache_peer_domain → permet de faire l'association entre le Vhost (URL) et le serveur physique

Accélérateur multi-applicatif

Lorsque l'on n'a qu'un seul nom de domaine ou un accès limité au DNS, il est possible de jouer sur la suite de l'URL pour aiguiller le navigateur du client.

Dans notre exemple, web.tala-informatique.fr/wiki permettra une redirection vers la machine Wiki et pour cela nous allons utiliser la directive urlpath_regex

acl wiki urlpath_regex ^/wiki

cache_peer web.tala-informatique.fr parent 80 0 no-query originserver name=web
cache_peer_access web deny wiki

cache_peer web1.tala-informatique.fr parent 80 0 no-query originserver name=wiki
cache_peer_access wiki allow wiki
cache_peer_access wiki deny all

Bump SSL

Pour filtrer également le trafic HTTPS, il faut utiliser la fonction bump qui va agir exactement comme une attaque de type man-in-the-middle.

Le proxy va présenter son certificat au client et va ensuite contacter le serveur à la place du client.

Nota: le problème de cette technique est que le trafic HTTPS passe en clair à travers le proxy, ce qui est gênant si les utilisateurs s'attendent à avoir un peu d'intimité...

Génération du certificat

Tout d'abord il faut générer le certificat qui va être utilisé par le proxy. Pour cela vous pouvez vous aidez ici.

Ensuite, il faut déplacer le certificat dans le répertoire du proxy :

# mkdir /etc/squid/ssl_cert
# mv *.crt /etc/squid/ssl_cert/
# mv *.key /etc/squid/ssl_cert/

Puis positionner correctement les droits:

chown squid.squid -R /etc/squid/ssl_cert

Activation du BUMP-SSL

Dans le fichier /etc/squid/squid.conf ajoutons les lignes suivantes (après la ligne http_port 3128 intercept transparent):

https_port 3129 intercept ssl-bump cert=/etc/squid/ssl_cert/www.tala-informatique.fr.crt key=/etc/squid/ssl_cert/www.tala-informatique.fr.key

N'oublions pas d'autoriser les connexions HTTPS (après la ligne http_access allow localnet) :

ssl_bump allow localnet

Puis d'interdire le reste (après la ligne http_access deny all) :

ssl_bump deny all

Vérifions que tout fonctionne bien:

# tail -f /var/log/squid/access.log

1415980084.527    116 192.168.50.100 TCP_MISS/200 818 GET http://www.google.fr/? - DIRECT/173.194.40

On voit bien que le trafic HTTPS (ici https://www.google.fr/) passe en clair (http://www.google.fr/?)