S04 - Serveur mandataire : Squid et SquidGuard
Objectif
Comprendre ce qu’est un proxy, monter un Squid, observer les requêtes, puis filtrer des domaines et des URL avec une page de blocage (le projet SquidGuard).
1. Un proxy, c’est quoi ?
Un serveur mandataire (proxy) est un intermédiaire : le client envoie sa requête au proxy, qui la relaie (ou non) vers le serveur.
sequenceDiagram participant C as Client (navigateur) participant P as Proxy Squid :3128 participant W as Site web C->>P: GET http://exemple.fr alt Site sur liste noire P-->>C: 403 / redirection vers la page de blocage else Page en cache P-->>C: Réponse depuis le cache (TCP_HIT) else P->>W: GET http://exemple.fr (avec l'IP du proxy) W-->>P: Réponse P-->>C: Réponse (+ copie en cache : TCP_MISS) end
| Type de proxy | Rôle |
|---|---|
| Proxy HTTP / direct | Les clients sont configurés pour passer par lui |
| Proxy cache | Garde une copie des pages pour accélérer |
| Proxy transparent | Intercepte le trafic sans configuration côté client (redirection au routeur) |
| Reverse proxy (inverse) | Devant les serveurs : répartit la charge, protège (HAProxy, Nginx) → SV03 - HAProxy (reverse proxy et répartition de charge) |
| Proxy anonyme | Masque l’IP du client |
| ✅ Avantages | ❌ Inconvénients |
|---|---|
| Filtrage / contrôle d’accès | Latence supplémentaire |
| Journalisation (qui va où) | Point de passage unique (SPOF) |
| Cache (économie de bande passante) | Peut enregistrer des données privées |
| Masquage des IP internes | HTTPS limite fortement le cache et le filtrage fin |
2. Le labo Vagrant du cours
Le cours fournit un Vagrantfile qui crée 2 VM : squid_proxy (Squid ouvert à tous) et squid_client (déjà configuré pour utiliser le proxy). Installation de Vagrant : V04 - Vagrant.
cd "dossier/contenant/le/Vagrantfile"
vagrant up # crée et démarre les 2 VM
# Terminal 1 : le proxy
vagrant ssh squid_proxy
sudo tail -f /var/log/squid/access.log
# Terminal 2 : le client
vagrant ssh squid_client
curl https://www.google.com # la requête apparaît dans le terminal 1Statistiques du proxy :
sudo apt install squidclient -y # (paquet squidclient)
squidclient -h localhost -p 3128 mgr:infoPour générer du trafic : scripts/securite/test_squid.sh 192.168.56.10:3128 50 (adapte l’IP).
Lire access.log
1728212345.123 85 192.168.56.11 TCP_MISS/200 12345 GET http://example.com/ - HIER_DIRECT/93.184.215.14 text/html
│ │ │ │ │
durée client résultat/code méthode + URL serveur contacté
TCP_HIT = servi depuis le cache, TCP_MISS = récupéré sur Internet, TCP_DENIED/403 = bloqué, TCP_TUNNEL = HTTPS (méthode CONNECT, contenu non visible).
3. Installer Squid à la main (Debian/Ubuntu)
sudo apt update && sudo apt install -y squid
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.origine # sauvegardeConfiguration minimale /etc/squid/squid.conf (remplace tout le fichier) :
# Port d'écoute
http_port 3128
# Qui a le droit d'utiliser le proxy
acl reseau_local src 192.168.56.0/24
# Ports autorisés
acl ports_ssl port 443
acl ports_surs port 80 443
acl CONNECT method CONNECT
# Listes noires (un élément par ligne)
acl domaines_interdits dstdomain "/etc/squid/blacklist_domaines.txt"
acl urls_interdites url_regex -i "/etc/squid/blacklist_urls.txt"
# Ordre des règles : la PREMIÈRE qui correspond s'applique
http_access deny !ports_surs
http_access deny CONNECT !ports_ssl
http_access deny domaines_interdits
http_access deny urls_interdites
http_access allow reseau_local
http_access deny all
# Page de blocage (fonctionne pour le HTTP ; en HTTPS le navigateur affiche une erreur)
deny_info http://192.168.56.10/bloque.html domaines_interdits
deny_info http://192.168.56.10/bloque.html urls_interdites
# Cache disque : 1 Go
cache_dir ufs /var/spool/squid 1000 16 256
access_log /var/log/squid/access.log squid# Listes noires
printf ".facebook.com\n.tiktok.com\n.jeux-en-ligne.example\n" | sudo tee /etc/squid/blacklist_domaines.txt
printf "youtube\\.com/shorts\nreddit\\.com/r/gaming\n" | sudo tee /etc/squid/blacklist_urls.txt
sudo squid -k parse # vérifier la syntaxe
sudo systemctl restart squid
sudo systemctl status squidLe point devant
.facebook.combloque le domaine et tous ses sous-domaines (www.facebook.com,m.facebook.com…).
Configurer le client
# Pour la session courante (Linux)
export http_proxy="http://192.168.56.10:3128"
export https_proxy="http://192.168.56.10:3128"
curl -I http://example.com
curl -I https://www.facebook.com # doit renvoyer 403 (bloqué)
# Ou ponctuellement :
curl -x http://192.168.56.10:3128 -I http://example.comNavigateur : Paramètres → Réseau → Proxy manuel → IP du proxy, port 3128, « utiliser aussi pour HTTPS ».
4. La page de blocage (serveur web sur le proxy)
sudo apt install -y apache2
sudo tee /var/www/html/bloque.html > /dev/null <<'EOF'
<!doctype html>
<html lang="fr"><head><meta charset="utf-8"><title>Accès bloqué</title>
<style>body{font-family:sans-serif;background:#1e293b;color:#f1f5f9;text-align:center;padding-top:15vh}
h1{color:#f87171}</style></head>
<body><h1>⛔ Accès bloqué</h1>
<p>Ce site est interdit par la politique de sécurité de l'entreprise.</p>
<p>Besoin d'un accès ? Ouvrez un ticket au support informatique.</p></body></html>
EOF5. Variante SquidGuard (demandée au projet)
SquidGuard est un redirecteur : Squid lui passe chaque URL, il répond « OK » ou « redirige vers la page de blocage ». Il gère de grosses listes noires (ex. listes de l’Université Toulouse Capitole).
SquidGuard n'est plus développé depuis longtemps et a été retiré de certaines versions récentes de Debian. Sur Debian 12 il s'installe encore (
apt install squidguard). S'il est absent de ta distribution, les ACL Squid de la partie 3 font le même travail, ou utilise E2Guardian / ufdbGuard.
sudo apt install -y squidguard
sudo mkdir -p /var/lib/squidguard/db/interdits
echo -e "facebook.com\ntiktok.com" | sudo tee /var/lib/squidguard/db/interdits/domains
echo -e "youtube.com/shorts\nreddit.com/r/gaming" | sudo tee /var/lib/squidguard/db/interdits/urls/etc/squidguard/squidGuard.conf :
dbhome /var/lib/squidguard/db
logdir /var/log/squidguard
dest interdits {
domainlist interdits/domains
urllist interdits/urls
}
acl {
default {
pass !interdits all
redirect http://192.168.56.10/bloque.html
}
}Brancher SquidGuard dans /etc/squid/squid.conf (ajouter) :
url_rewrite_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf
url_rewrite_children 5sudo squidGuard -C all # compiler les listes en bases .db
sudo chown -R proxy:proxy /var/lib/squidguard/db /var/log/squidguard
sudo systemctl restart squid
# Test SANS passer par le navigateur :
echo "http://www.facebook.com/ 192.168.56.11/- - GET" | sudo -u proxy squidGuard -c /etc/squidguard/squidGuard.conf
# → doit renvoyer une ligne de redirection vers bloque.html6. Squid et HTTPS : le problème
En HTTPS, le proxy ne voit que le nom de domaine (méthode CONNECT + SNI), pas l’URL complète ni le contenu → pas de cache et filtrage par URL impossible.
Pour tout voir, il faut faire du SSL Bumping : l’entreprise crée sa propre autorité de certification, l’installe sur tous les postes, et Squid déchiffre puis rechiffre chaque connexion (attaque « homme du milieu » légitime).
Le SSL Bumping donne au proxy accès à tout : mots de passe, données bancaires, santé… C'est un enjeu de sécurité et de RGPD (information des salariés obligatoire). À réserver aux environnements qui l'imposent.
À quoi sert Squid aujourd’hui ? Surtout au filtrage par domaine, à la journalisation (traçabilité légale) et à l’authentification des accès Internet.
7. Livrables du projet SquidGuard
- Fichiers de configuration (
squid.conf,squidGuard.conf, listes). - Documentation du projet (cette fiche peut servir de base).
- Bonus : projet Vagrant entièrement fonctionnel (
vagrant up→ tout est prêt) → modèle dans V04 - Vagrant.
Voir aussi
- S01 - Pare-feu - concepts · S02 - pfSense (paquet Squid intégré) · V04 - Vagrant
- Retour : 00 - Index général