Proxy transparent simplement avec linux et SQUID

Creer un proxy transparent avec SQUID : pourquoi ?

Par les temps qui courent, il n'est pas rare que les connections internet soient saturées par les téléchargements, lorsque plusieurs machines utilisent la meme connection internet.

Depuis longtemps déjà, on utilise des serveurs proxy (en général HTTP). L'utilisateur d'un réseau d'entreprise devait entrer dans son navigateur l'adresse du proxy pour ésperer acceder à internet.

On entend parler également de proxy universel , qui désigne les serveurs proxy de type SOCKS.et qui permet d'étendre les capacités d'un serveur proxy à un plus grand nombre d'applications.

Une autre solution pour partager une connection internet consiste a utiliser un routeur pratiquant ce que l'on appele du NAT (Network Address Translation). ceci ne nécessite pas de configuration supplémentaire , lorsque le réseau est configuré , mais permet a quasiment toute application de se connecter a internet …

C'est pourquoi, le proxy transparent apparait etre un bon compromis entre configuration et filtrage des applications. Celui ci agit sur le réseau comme s'il s'agissait d'un routeur (pas de configuration superflue de la part de l'utilisateur) , mais filtre comme un serveur proxy (bloque les applications autres que celles définies par l'administrateur).

Dans le cadre d'une entreprise, un proxy transparent est utile pour les raisons suivantes :

  • Mettre en cache les pages les plus visitées, afin d'eviter de recharger une page qui a déja été visitée
  • Forcer les utilisateurs du réseau à utiliser un proxy, qu'ils le veuillent ou non.
  • Faire utiliser un proxy a toutes les machines d'un réseau sans avoir a configurer chaque application.
  • Bloquer des applications internet (comme les utilitaires de chat, ou de peer2peer)
  • sécuriser un réseau qui accede a internet en limitant l'accès a certaines pages.

Le principe est relativement simple : Le réseau est configuré avec une passerelle par défaut et un serveur DNS. Lorsqu'une machine tente d'acceder à une page internet elle envoie une requête sur un serveur sur le port 80. Cette requête est automatiquement , et de manière invisible intercéptée par le proxy. Le serveur proxy relaye la requete sur le serveur de la page internet et stocke la page sur son disque dur. La machine du visiteur croit donc dialoguer avec le serveur internet , mais en réalité , elle ne dialogue qu'avec le serveur proxy. Si une autre machine a déjà demandé la meme page internet, le proxy va pouvoir lui fournir depuis son disque dur (après avoir tout de meme vérifié que la page internet n'a pas subi de modification) , évitant ainsi toute attente, et sans que l'utilisateur ne s'apercoive de quelque chose.

SQUID , c'est quoi exactement ?

(Traduction de la page officielle de la définition de squid)

Squid est un serveur proxy cache haute performance, qui supporte les protocoles HTTP, FTP, et gopher. Contrairement aux serveurs proxy traditionnel, Squid prend en compte toutes les requêtes demandées un seul processus qui est non-bloquant.

Squid conserve les données génériques et spécialement les objets très demandés en RAM, il met en cache les requêtes DNS, et implémente le cache négatif lors les requêtes demandées ont échoué.

Squid support le cryptage SSL (pour les pages internet sécurisées) , une gestion des accès évoluée, et une journalisation complète des requêtes. En utilisant le protocole ICP (Internet Cache Protocol), les caches de squid peuvent être ordonnés selon une hierarchie , ou par noeud visités pour minimiser la bande passante utilisée par les internautes.

Le packetage squid consiste en un programme principal nommé Squid , un système de DNS, des outils de réecriture de requêtes et d'authentification, et des outils de gestion.

Squid est basé sur le Projet Harvest fondé par l'ARPA.

Installation de SQUID

Pré-requis pour l'installation totale

  • Un noyau linux 2.4 minimum , avec support d'iptables et iptables_REDIRECT.
  • une carte réseau minimum (et eventuellement un modem).
  • 1 Go d'espace disque minimum pour le stockage des caches en cache.

Recuperer les packetages

Le serveur SQUID est disponible sous forme de packages (Assurez vous de télécharger une version STABLE de Squid) :

  • Pour Slackware sur linuxpackages.net
  • Pour Debian avec la comment apt-get install squid-cache pour via le site packages.debian.org
  • Mandrake et RedHat via le site RPMFind

Autrement par l'intermédiaire du code source (Version 2.5) sur le site www.squid-cache.org

Installer !

Voici les différentes commandes permettant d'installer squid sur votre système :

  • installpkg squid-*.tgz sous Slackware (ou slapt-get -install squid si vos sources sont correctement configurées)
  • apt-get install squid ou dpkg -i squid-*.deb sous Debian
  • urpmi squid ou rpm -i squid-*.rpm sous Mandrake / Redhat

Dans le cas d'un packetage de distribution, les fichiers de configuration se trouvent en général dans /etc/squid

Avec la version source nous procederons de la manière suivante :

tar zxf squid-*.tar gz -C /usr/src 

ou

tar jxf squid-*.tar.bz2 -C /usr/src
cd /usr/src/squid*
./configure
make
make install 

dans ce cas , les repertoires de configuration et de binaires se trouveront dans /usr/local/squid

Parametrer squid

le fichier de config de squid se nomme squid.conf … il se trouve dans /etc/, /etc/squid/ ou /usr/local/squid/etc suivant la distribution utilisée

Le fichier de configuration est très complet , pour le personnaliser, editez le et décommentez les lignes concernée par les variables et utilisez les valeurs suivantes :

Si vous utilisez une version de SQUID > 2.6

http_port :3128 transparent

Si vous utilisez une version plus ancienne de SQUID

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

et autorisez les utilisateurs du réseau a utiliser le proxy en utilisant la variable http_access

http_access allow all

Nous verrons par la suite comment parametrer les applications …

Une fois cette configuration faite , initialisez les caches de squid en utilisant la commande (inutile sur debian car fait au moment de l'installation).

root@proxy # > squid -z

Lancer le serveur proxy.

root@proxy # > squid

A ce stade , vous êtes en mesure d'utiliser squid comme proxy HTTP par votre navigateur internet. :)

Sur la distribution debian le script d'initialisation est créé dès l'installation du packetage. sur la slackware il faut le creer , un point de départ serait de faire le script suivant /etc/rc.d/rc.squid :

#!/bin/sh
# script de lancement de slackware
case "$1" in
   'start')
     /bin/echo "Lancement de Squid"
     /usr/sbin/squid ;;
   'stop')
     /bin/echo "Arret de Squid"
     /bin/killall squid  ;;
   'restart')
     echo "Redemarrage de Squid"
     /bin/killall squid
     /usr/sbin/squid
     ;;
    *)
     echo "usage $0 start|stop|restart" ;;
 esac

Utiliser Iptables pour utiliser SQUID en tant que proxy transparent

Ou comment obliger vos machines a utiliser le proxy pour aller sur internet

J'attire votre attention sur le fait qu'un serveur dns (relayant les requêtes DNS locales sur internet ) est nécessaire sur le réseau local afin que les 'machines visiteuses' connaissent le chemin a emprunter , et qu'elles passent donc par le routeur par défaut , qui sera bientôt notre proxy transparent. Ce serveur DNS peut etre le meme que le proxy pour simplifier les choses.

Une configuration rapide de dnsmasq permet de monter un relai DNS en un rien de temps

Première solution : Squid et iptables sur la meme machine

Cette première methode est la plus simple a mettre en oeuvre : Elle tient en une ligne, par contre , elle est moins sécurisée car le serveur proxy est accessible directement via le port TCP 3128. un petit malin peut parfaitement utiliser un tunnel http pour utiliser ses applications favorites …

pour activer le proxy transparent il suffit de taper la ligne suivante :

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

Cette ligne indique a la machine d'intercepter toutes les requêtes sur un port 80 , et de les rediriger vers le proxy.

afin d'eviter les problemes si un serveur web accessible depuis internet tourne sur la machine en question d'utiliser la ligne suivante (le réseau est en 192.168.6.x)

iptables -t nat -A PREROUTING -i eth0 -s 192.168.6.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

Cette ligne provoque le même effet que la ligne précédente , a la différence qu'elle restreint son action uniquement au réseau local.

Avec les deux lignes citées précedemment , les machines clientes de notre réseau local qui tentent d'acceder par exemple à www.google.fr sur le port 80 seront tout simplement redirigées sur le serveur proxy http.

Mais par contre , des programmes comme ping , telnet , ou autres ssh ne fonctionnent pas , et donc par conséquent , toutes les applications de type peer2peer sont également bloquées.

Par défaut , SQUID ne permet pas de faire du proxy transparent avec du ftp. Pour cela je vous propose l'utilitaire frox

Deuxième solution : Linux et Squid sur deux machines différentes :

Cette methode permet d'augmenter la sécurité car le proxy n'est plus accessible directement par les machines clientes

Imaginons donc que le routeur iptables possède l'adresse IP 192.168.6.2 du coté des machines clientes , et l'adresse IP 172.16.0.4 du coté proxy; et que le proxy possède l'adresse IP 172.16.0.1. Nous devrons configurer la table iptables du routeur de la facon suivante :

iptables -t nat -A PREROUTING -i eth0 -s ! 172.16.0.1 -p tcp --dport 80 -j DNAT --to 172.16.0.1:3128
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.6.0/24 -d 172.16.0.1 -j SNAT --to 172.16.0.4
iptables -A FORWARD -s 192.168.6.0/24 -d 172.16.0.1 -i eth0 -o eth1 -p tcp --dport 3128 -j ACCEPT

ce qui signifie que les paquets ne provenant pas du proxy mais étant a destination du port 80 seront redirigés vers le proxy ; que les paquets revenant depuis le proxy, passeront obligatoirement par le routeur ; et que nous autorisons les paquets provenant du réseau local à être redirigés vers le proxy.

Une mise en place récente m'a amené à n'utiliser qu'une seule ligne.

iptables -t nat -A PREROUTING -i eth0 -s ! 172.16.0.1 -p tcp --dport 80 -j DNAT --to 172.16.0.1:3128

Seulement dans ces deux dernières configurations , des problèmes peuvent se poser si le proxy est directement connecté à internet (utilisation du proxy par d'autres internautes externes au réseau), auquel cas nous allons avoir recours aux Access Control Lists (acl) de Squid

Dans le dernier cas cité, nous opererons de la manière suivante : en editant le fichier squid.conf :

acl machines_locales src 172.16.0.0/16

http_access allow machines_locales
http_access deny !machines_locales

et dans le premier cas :

acl machines_locales src 192.168.6.0/24
http_access allow machines_locales
http_access deny !machines_locales

Ou en ajoutant un firewall entre le proxy et l'accès internet (Solution recommandée … d'autant plus si il réside une faille de sécurité dans votre version de squid).

Utiliser PF pour utiliser SQUID en tant que proxy transparent

Dans ce cas, les mots clés rdr-to et divert-to s'avèrent être d'une grande utilité :

Si Squid est installé sur la même machine que PF, le mot-clé divert-to s'applique :

pass in on $int_if from $lan_net to any divert-to 127.0.0.1 port 3128

Si Squid est sur une autre machine :

pass in on $int_if from $lan_net to any rdr-to $transparent_proxy port 3128 

Exemples de configurations

Utiliser Squid en proxy transparent en plus d'un routage internet standard

si vous souhaitez conserver vos accès internet aux services standard (telnet, ssh, Peer2peer, etc.) mais profiter des avantages du proxy cache pour l'accès aux pages internet , cela est possible.

il suffit d'utiliser la configuration de la page précédente

et d'utiliser la ligne magique permettant d'utiliser votre linux en routeur NAT (ppp0 etant votre interface connectée au net)

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Filtrer au maximum l'accès internet

Il faut pour cela utiliser deux machines qui auront pour fonction de filtrer : un routeur et un proxy

pour un maximum de sécurité, en entreprise, les services de type mail sont gérés par des serveurs locaux, afin d'eviter que les utilisateurs du réseau utilisent leurs comptes existants sur internet et ainsi importer des virus et autres spywares issus de leurs comptes mail mal ou pas du tout protégés.

Et l'acces internet se limite exclusivement à la consultation de sites web. et la est tout l'avantage d'utiliser un proxy pour non seulement filtrer l'accès au sites , mais egalement pour éviter de perdre de la bande passante sur le reseau internet, car les pages les plus demandées sont mises a disposition directement a partir du proxy.

Pages relatives

 
unix/linux/proxy-transparent-linux-squid.txt · Dernière modification: 2017/07/27 16:08 (édition externe)
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki