A quoi sert un proxy ? Quelle est son utilité ?

Un proxy est un service qui permet beaucoup de chose. Dans une configuration "normal", il vous permettra de gérer l'accès à internet aux users de votre parc informatique en fonction des heures d'accès, des ports de destination d'un service, d'ip sources, etc. Il permet aussi de mettre en cache les sites visité afin d’accélérer le trafic.

Le logiciel que nous utiliserons est Squid

Dans cet article (en attendant d'autres plus poussé sur l'intégration avec Active Directory, reverse proxy, ...) nous verrons comment configurer Squid. de manière simple et nous apprendrons à le gérer, à le comprendre.

Prérequis :

Connaître un tant soit peu Linux et le réseau.

Objectif :

Réaliser et comprendre toutes les étapes de la configuration d'un proxy avec squid en tant que proxy web simple.

Matériel :

Deux machines en virtuel ou en physique. (Une sous Linux et l'autre, le client, avec n'importe quel OS. De quoi faire communiquer les deux machines (switch, câbles UTP, etc)

Squid est disponible sous deux versions avec Debian. Squid 2.7 et Squid 3. Les changements apporté par Squid 3: réécriture du code en C++, prise en charge d'ICAP (Internet Content Adaptation Protocol), de l'IPv6, d'ESI (Edge Side Includes). Je ne m'étendrai pas sur ces différentes fonctionnalités mais tant qu'à faire, autant rester à jours

Nous prendrons donc Squid 3 pour configurer notre proxy et vous verrez que c'est extrêmement simple.

aptitude install squid3

Le fichier de configuration de squid est trèèèès long. En fait, il n'y a pas de man 5 squid.conf et ce n'est pas nécessaire vu la richesse du fichier. Toutes les options y sont déjà données, commentées avec leurs valeurs par défaut.

Nous allons donc le sauvegarder et ensuite l'éditer

cp /etc/squid3/squid.conf  /etc/squid3/squid.conf.old

vim /etc/squid3/squid.conf

Dans ce fichier nous allons mettre ces différentes lignes :

# Cette première ligne veut dire que Squid écoute sur le port 3128 et
# qu'il s'attendra à recevoir des requêtes redirigées sans que l'utilisateur 
# client en ait conscience
http_port 3128 transparent

# Cette ligne affichera le nom de machine spécifié lors des messages 
# d'erreurs
visible_hostname squid.test.local

# Access List. Ici on crée un groupe qui sera utilisé pour gérer l'IP 
# source des clients qui utiliserons le proxy.
acl localnet src 192.168.2.0/24

# Squid fonctionne un peu comme Iptables. La première règle qui est 
# concordante avec le paquet qui arrive sera utilisée et n'ira pas plus 
# loin. Ainsi donc, dans notre cas, l'ACL qui regroupe les ip du lan 
#seront autorisées et toutes les autres refusées
http_access allow localnet
http_access deny all


# Spécifie le chemin vers les logs d’accès créé pour chaque page 
# visitée
access_log /var/log/squid3/access.log

# Indique à Squid d'attendre 4 secondes avant de se couper quand on 
# essaye de le stoper ou de le redémarrer. Par défaut c'est 30 secondes
shutdown_lifetime 4 secondes

Une fois que notre fichier squid.conf est édité, vous pouvez redémarrer Squid sans problème.

/etc/init.d/squid3  restart

Normalement vous avez une interface vers internet et une vers le lan. Pour que internet puisse répondre aux requêtes qui ne viennent pas du proxy, donc celle du Lan avec une IP 192.168.2.0/24, il faudra faire du nat. Et pour que le requêtes vers le proxy arrivent en transparent, il faut rediriger le port 80 vers le port 3128 quand elles arrivent.

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

De cette façon, toutes les requêtes vers un site en http depuis le Lan vers le Wan passerons par le proxy.

Il existe une multitude d'acl existante pour filtrer non pas juste l'adresse ip source mais aussi celle de destination, le domaine de destination, l'url, la mac adresse, l'heure de connexion ainsi que les jours. Bref, beaucoup de chose que vous pouvez utiliser pour gérer les connexions à internet. N'oubliez pas que pour rendre les règes d'Iptables persistante, il faut faire ceci

iptables-save > /etc/iptables
echo "post-up iptables-restore < /etc/iptables" >> /etc/network/interfaces

Tout devrait rouler maintenant. non ?