Cent OS 6 + Squid + SquidGuard
Rédigé par Xavier - -
L'objectif de cet article va être la mise en place d'un serveur Proxy tournant sur Linux CentOS 6. Il fournira un filtrage des pages Web visitées (pour un contrôle parental, par exemple).

Plan du tutoriel
- Choix de l'OS
- Présentation des différents éléments
- Configuration de CentOS
- Configuration basique de Squid
- Configuration de SquidGuard
- Authentification
Avertissement : Squid est dangereux pour votre santé mentale et pour le cuir chevelu. C'est le logiciel typique sur lequel vous passez 4 heures à configurer une fonction de base pour finalement y parvenir sans vraiment savoir pourquoi. Le dernier qui m'a fait ça est Asterisk, et je le hais aujourd'hui de toute ma personne. Vous êtes prévenu.
C'est parti !
Choix de l'OS
Le choix est toujours très subjectif, chaque OS a ses avantages et inconvénients. On pourrait partir sur FreeBSD mais j'ai beaucoup de doutes sur les procédures de mises à jour qui demandent de la compilation, du suivi, et un deuxième serveur dédié à cela ou l'utilisation de chroot et de jail... bref on va plutôt se tourner vers un système Linux qui va tout faire à notre place. Deux retiennent mon attention : Debian et CentOS. Nous allons partir sur le deuxième.
Présentation des différents éléments
- Squid : le serveur Proxy (mandataire) qui va traiter les requêtes des clients. Il permet l'utilisation d'ACL pour autoriser ou refuser l'accès selon certaines conditions. Il est packagé dans CentOS.
- SquidGuard : C'est un "redirecteur" il est chargé d'intercepter certaines requêtes HTTP en fonction de filtres et de fournir autre chose à la place. Par exemple une page d'erreur.
Nous allons donc commencer par mettre en place Squid et le tester depuis une machine cliente. Si cela fonctionne, nous pourrons configurer SquidGuard avec quelques filtres pour le porno, par exemple.
Configuration de CentOS
On peut se contenter d'une installation minimale et ajouter ce que nous voulons par la suite. Lorsque cela est fait, nous devons configurer le réseau. Nous partons sur les critères suivants:
- La carte s'appelle eth0
- Nous voulons une IP fixe : 192.168.1.50 / 24
- Passerelle : 192.168.1.1 et DNS : 8.8.8.8
La configuration des cartes réseau se fait dans /etc/sysconfig/network-scripts/.
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
Puis entrez les paramètres suivants:
DEVICE=eth0 ONBOOT=yes BOOTPROTO=none IPADDR=192.168.1.50 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.8.8.8
Pour plus de renseignements sur la configuration réseau de CentOS, reportez-vous à la documentation Relancez maintenant le réseau :
# service network restart Arrêt de l'interface eth0 : [ OK ] Arrêt de l'interface loopback : [ OK ] Activation de l'interface loopback : [ OK ] Activation de l'interface eth0 : [ OK ]
Vous pouvez maintenant vérifier que les paramètres ont bien été pris en compte :
# ping -c 4 google.fr PING google.fr (74.125.39.106) 56(84) bytes of data. 64 bytes from fx-in-f106.1e100.net (74.125.39.106): icmp_seq=1 ttl=51 time=53.1 ms 64 bytes from fx-in-f106.1e100.net (74.125.39.106): icmp_seq=2 ttl=51 time=46.3 ms 64 bytes from fx-in-f106.1e100.net (74.125.39.106): icmp_seq=3 ttl=52 time=62.3 ms 64 bytes from fx-in-f106.1e100.net (74.125.39.106): icmp_seq=4 ttl=52 time=44.9 ms --- google.fr ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3052ms rtt min/avg/max/mdev = 44.918/51.707/62.367/6.891 ms
Là on voit que notre routage vers internet est nos résolutions DNS sont OK. Nous pouvons donc mettre à jour notre système :
# yum update -y
Après plusieurs minutes, c'est bon. Si il y a eu une mise à jour du kernel vous devriez redémarrer la machine :
# shutdown -r now
Configuration basique de Squid
Passons maintenant aux choses sérieuses. Nous devons commencer par configurer le nom d'hôte de notre machine, sinon Squid ne se lancera pas. Il faut l'ajouter dans le fichier hosts :
# vi /etc/hosts
A mettre :
127.0.0.1 localhost proxy.mondomaine.org ::1 localhost proxy.mondomaine.org
Ensuite installons le paquet squid :
# yum install squid -y
Dans l'état, la configuration est déjà correcte. Elle autorise l'accès au localhost ainsi qu'aux machines du réseau local. Par contre le port d'écoute est le 3128 et celui-ci est fermé dans le parefeu. Il faut donc l'ouvrir :
# vi /etc/sysconfig/iptables
La ligne à ajouter est en gras ci-dessous :
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 3128 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
Ensuite relancez iptables :
# service iptables restart iptables : Suppression des règles du pare-feu : [ OK ] iptables : Configuration des chaînes sur la politique ACCEP[ OK ]er iptables : Déchargement des modules : [ OK ] iptables : Application des règles du pare-feu : [ OK ]
Vous devez également démarrer squid :
# service squid start Démarrage de squid : . [ OK ]
Nous pouvons maintenant faire un essai. Sur une autre machine du réseau, lancez votre navigateur Web et configurez l'utilisation du proxy. Par exemple, sur Seamonkey :

Lors que vous ouvrez des sites vous devez maintenant voir sur votre switch que votre proxy est sollicité.
Configuration de SquidGuard
SquidGuard n'est pas packagé pour CentOS, il faut activer les dépôts RPMFusion. La documentation nous indique les manipulations à suivre.
# yum install wget -y # wget http://urlpaquet.rpm # rpm --import http://urlgpg.txt # yum localinstall paquet.rpm
Les vraies URL sont compliquées et variables donc je ne les ai pas recopiées ici. Vous les trouverez dans la documentation.
Nous pouvons maintenant installer SquidGuard :
# yum install squidguard -y
Nous devons maintenant dire à Squid de faire appel à SquidGuard. Nous allons donc éditer son fichier de configuration (après l'avoir sauvegardé) :
# cp /etc/squid/squid.conf /root/ # vi /etc/squid/squid.conf
Nous allons devoir ajouter quelques paramètres. Placez-les quelque part où vous pourrez les retrouver facilement, par exemple dans la section "INSERT YOUR OWN RULE(S) HERE...."
redirect_program /usr/bin/squidGuard -c /etc/squid/squidguard.conf redirect_children 5
La prochaine étape est la configuration de SquidGuard lui-même. Que doit-il filtrer ? Et comment ? En fait il va utiliser des blacklist. On peut les récupérer gratuitement et elles sont divisées en catégories.
# wget ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/blacklists.tar.gz # mkdir /var/lib/squidguard/db # tar zxvf blacklists.tar.gz -C /var/lib/squidguard/db/ # rm blacklists.tar.gz
Maintenant que nous avons nos blacklists nous pouvons configurer SquidGuard. Par défaut il y a beaucoup de choses paramétrées, même trop, et pas tellement bien expliqué. Donc après une petite sauvegarde, on part sur un fichier propre :
# cp /etc/squid/squidguard.conf /root/ # rm /etc/squid/squidguard.conf # vi /etc/squid/squidguard.conf
A mettre :
# # CONFIG FILE FOR SQUIDGUARD # dbhome /var/lib/squidguard/db/blacklists logdir /var/log/squidguard # Dest filters dest adult { domainlist adult/domains urllist adult/urls } dest porn { domainlist porn/domains urllist porn/urls } # ACL acl { default { pass !porn !adult all redirect http://www.ovh.com/fr/images/hosting/astuce_htaccess/interdit.jpg } }
La première ligne défini où sont stockées les blacklist. Par la suite, on définit des catégories et on indique où aller chercher les fichiers qui contiennent les url et domaines à bannir. Vers la fin, dans les ACL, on demande à rediriger vers l'url explicitée tout ce qui est banni. Cette url pointe sur un panneau rouge.
Les blacklists ne sont pas directement exploitables elles doivent être "compilées". Au passage nous allons créer le dossier pour les logs de squidguard :
# mkdir /var/log/squidguard # squidGuard -C all 2011-08-27 20:03:32 [1313] New setting: dbhome: /var/lib/squidguard/db/blacklists 2011-08-27 20:03:32 [1313] New setting: logdir: /var/log/squidguard 2011-08-27 20:03:32 [1313] init domainlist /var/lib/squidguard/db/blacklists/adult/domains Processing file and database /var/lib/squidguard/db/blacklists/adult/domains [==================================================] 100 % done 2011-08-27 20:04:27 [1313] create new dbfile /var/lib/squidguard/db/blacklists/adult/domains.db 2011-08-27 20:04:27 [1313] init urllist /var/lib/squidguard/db/blacklists/adult/urls Processing file and database /var/lib/squidguard/db/blacklists/adult/urls [==================================================] 100 % done 2011-08-27 20:04:29 [1313] create new dbfile /var/lib/squidguard/db/blacklists/adult/urls.db 2011-08-27 20:04:29 [1313] init domainlist /var/lib/squidguard/db/blacklists/porn/domains Processing file and database /var/lib/squidguard/db/blacklists/porn/domains [==================================================] 100 % done 2011-08-27 20:05:25 [1313] create new dbfile /var/lib/squidguard/db/blacklists/porn/domains.db 2011-08-27 20:05:26 [1313] init urllist /var/lib/squidguard/db/blacklists/porn/urls Processing file and database /var/lib/squidguard/db/blacklists/porn/urls [==================================================] 100 % done 2011-08-27 20:05:27 [1313] create new dbfile /var/lib/squidguard/db/blacklists/porn/urls.db 2011-08-27 20:05:28 [1313] squidGuard 1.3 started (1314468212.506) 2011-08-27 20:05:28 [1313] db update done 2011-08-27 20:05:28 [1313] squidGuard stopped (1314468328.015)
Seules les listes explicitées dans SquidGuard.conf sont compilées. Maintenant il faut donner les bonnes permissions et relancer Squid :
# chown -R squid:squid /var/lib/squidguard/db/ # pkill squid # service squid start
Le squid stop ne fonctionne pas, je ne sais pas si c'est un cadeau de CentOS6, mais il faut utiliser le pkill pour l'arrêter réellement. Puis pour le relancer il faut passer par service squid start, parce qu'on peut aussi le lancer par la commande "squid -z" mais votre configuration ne sera pas prise en compte. J'ai perdu quelques cheveux à comprendre ça.
Maintenant, retournez sur votre ordinateur client et essayez d'accéder à un site interdit comme youporn. Vous devriez être redirigé vers la page que nous avons spécifié dans la configuration. Si cela ne fonctionne pas, essayez de désactiver SELinux avec la commande setenforce 0 (temporaire).
Il est bien entendu conseillé de faire votre propre page web, par exemple une qui explique pourquoi le visiteur a été redirigé ici.
Lancement automatique de Squid
Pour que Squid soit lancé au démarrage du système :
# chkconfig --level 3 squid on
A venir
A terme nous mettrons en place des redirections/filtrages différents selon les utilisateurs et les thèmes. Un site porno bloqué pointera sur une page expliquant que le porno saimal pour la productivité tandis qu'un site de phishing affichera autre chose. Restez branchés.