Serveur proxy cache HTTP avec Squid sous CentOS 7

Logo SquidSquid est un serveur mandataire (proxy en anglais). Dans les réseaux locaux, il est utilisé pour des fonctions de filtrage d’URL ou en tant que cache. Les pages web sont stockées sur le serveur local, ce qui évite d’aller les recharger plusieurs fois et permet d’économiser de la bande passante Internet. Cet article décrit l’installation et la configuration de Squid sur un serveur de réseau local CentOS.

La configuration présentée ici concerne les seules connexions HTTP. Le traitement des connexions HTTPS fait l’objet d’un article à part. Cette façon de procéder est motivée avant tout par un souci pédagogique, étant donné que la gestion des connexions sécurisées par Squid est passablement complexe.

Prérequis

Dans la configuration par défaut, Squid utilise le port 3128 en TCP et en UDP. Il faut donc songer à l’ouvrir dans le pare-feu.

# Commandes
IPT=/usr/sbin/iptables
...
# Réseau local
IFACE_LAN=enp2s0
...
# Squid 
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 3128 -j ACCEPT
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 3128 -j ACCEPT

Installation

Squid est officiellement supporté par Red Hat Enterprise Linux et CentOS. On peut donc l’installer depuis les dépôts officiels.

# yum install squid

Configuration

Squid se configure par le biais du fichier /etc/squid/squid.conf, qui est quasiment prêt à l’emploi, à quelques directives près. Notons que le répertoire offre déjà un fichier identique squid.conf.default, ce qui nous évite d’effectuer une copie de sauvegarde.

J’édite ce fichier par défaut en regroupant les directives existantes et en adaptant la configuration à mon réseau. Voici à quoi cela ressemble.

# /etc/squid/squid.conf

# Définitions
acl localnet src 192.168.2.0/24
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

# Règles d'accès
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access deny all

# Port du proxy
http_port 3128

# Taille du cache dans la RAM
cache_mem 2048 MB

# Emplacement et taille du cache sur le disque
# cache_dir ufs /var/spool/squid 100 16 256

# Vidage système
coredump_dir /var/spool/squid

# Durée de vie des fichiers sans date d'expiration
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

Cette configuration mérite quelques remarques.

  • Squid peut être utilisé par toutes les machines du réseau local 192.168.2.0/24. La directive acl localnet définit une variable localnet qui indique l’étendue du réseau local.
  • Cette directive fonctionne de pair avec http_access localnet, qui autorise toutes les machines du réseau local à utiliser le cache. Le nom localnet est une convention, et on est libre d’en utiliser un autre.
  • Dans l’exemple ci-dessus, le cache est uniquement écrit dans la RAM du serveur. La directive cache_mem permt de définir la taille du cache. Si l’on ne souhaite pas utiliser le disque dur pour le cache, il faut s’assurer de n’utiliser aucune directive cache_dir.

Utilisation

J’active et je démarre le service.

# systemctl enable squid
# systemctl start squid

Je vérifie l’état de fonctionnement.

# systemctl status squid

Lorsque Squid n’est pas utilisé comme proxy transparent, il faut procéder à une configuration individuelle des navigateurs web.

Mozilla Firefox

Ouvrir Édition > Préférences > Avancé > Réseau > Paramètres et indiquer le nom d’hôte ou l’adresse IP ainsi que le port du proxy.

Proxy Firefox

Konqueror

Ouvrir Configuration > Configurer Konqueror > Navigation Web > Serveur mandataire (proxy). Cocher Utiliser la configuration manuellement spécifiée du serveur mandataire. Renseigner le nom d’hôte ou l’adresse IP ainsi que le port du proxy, en activant l’option Utiliser ce serveur mandataire pour tous les protocoles.

Konqueror Proxy

Vérifier le fonctionnement

Pour voir si les postes clients utilisent effectivement le proxy, on peut afficher en direct le contenu du journal /var/log/squid/access.log.

# tail -f /var/log/squid/access.log
1519986674.236    166 192.168.2.2 TCP_MISS/200 4330 
GET http://www.slackware.com/ - HIER_DIRECT/95.100.252.163 ...
1519986674.607     45 192.168.2.2 TCP_MISS/200 676 
GET http://www.slackware.com/favicon.ico - ...

Configurer Squid comme proxy transparent

Jusqu’ici, l’utilisation du proxy cache s’effectue de manière volontaire, c’est-à-dire que Squid est utilisé si les postes clients ont configuré leurs navigateurs Web en conséquence, comme nous venons de le voir. Si cette configuration n’est pas effectuée, les utilisateurs vont simplement contourner le cache.

Pour éviter cela, on va tout simplement rediriger toutes les requêtes HTTP (port 80) vers le port 3128 pour obtenir un proxy transparent. Ce qui signifie que le cache est utilisé automatiquement, sans la moindre configuration de la part de l’utilisateur. Évidemment, cela suppose que Squid tourne sur la machine qui fait office de passerelle dans le réseau local.

Dans le fichier /etc/squid/squid.conf, il faudra modifier une seule ligne.

# Port du proxy
http_port 3128 transparent

On va partir du principe que le relais des paquets est déjà activé dans le pare-feu. Il ne reste plus qu’à rediriger les paquets IP, en faisant une exception pour les requêtes HTTP à destination du serveur lui-même. Voici à quoi cela peut ressembler.

# Commandes
IPT=/usr/sbin/iptables
...
# Réseau local
IFACE_LAN=enp3s1
...
# Serveur
SERVER_IP=192.168.3.1
...
# Squid 
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 3128 -j ACCEPT
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 3128 -j ACCEPT

# Squid transparent
$IPT -A PREROUTING -t nat -i $IFACE_LAN -p tcp ! -d $SERVER_IP \
  --dport 80 -j REDIRECT --to-port 3128

Là aussi, il faut afficher les logs “à chaud” pour voir si le proxy transparent est effectivement utilisé par les postes clients.

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

 

Ce contenu a été publié dans CentOS, Documentation Microlinux, avec comme mot(s)-clé(s) , . Vous pouvez le mettre en favoris avec ce permalien.

5 réponses à Serveur proxy cache HTTP avec Squid sous CentOS 7

  1. Ping : Serveur proxy cache HTTP avec Squid sous CentOS 7 - My Tiny Tools

  2. maana dit :

    Bonjour,
    je me permets de vous laisser un commentaire, car je desepere un peu.
    je souhaite mettre en place un squid pour journaliser et filtrer certain site web.
    tout fonctionne, sauf la redirection vers un message d’erreur personnalisé lorsqu’il s’agit d’un site en https.
    deny_info ne fonctionne qu’avec les sites en http et redirect avec squidGuard idem.

    merci pour votre aide.

  3. maana dit :

    tip top votre blog

    merci beaucoup

  4. jotux dit :

    Merci pour cet article très détaillé.
    Je fais quelques essais perso, pour voir si le cache proxy peut améliorer la rapidité de connexion. Je ne m’occupe pas pour le moment de la partie filtrage.
    Votre config fonctionne parfaitement sur une Debian 9 en conteneur LXC.

    Pour le moment ça roule 😉

    Merci encore !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.