Le principe de base consiste à dire :
Lorsque je désire obtenir un document, je ne vais pas le demander à la source. Je vais le demander à mon serveur proxy. Celui-ci ira chercher le document à ma place et me le transmettra à sa réception. Au passage, il le gardera en mémoire « un certain temps », si bien que si un autre client redemande dans cette période le même document, le proxy n'aura pas besoin de retourner le chercher à la source. Ceci ne fonctionne correctement que pour les documents statiques, bien entendu. Pour les documents de type ASP, JSP ou PHP, la mise en tampon est beaucoup plus problématique.
Ce type de fonctionnement, où le client s'adresse systématiquement au proxy pour obtenir une page quelconque sur le web a fait traduire « proxy server » par « serveur mandataire ».
Notez que dans cette démarche, le client est au courant de l'existence du proxy, il va donc envoyer une requête adaptée à la situation, qui n'est pas tout à fait la même que dans le cas où il s'adresserait directement à la cible. Nous le verrons en détail un peu plus loin.
Imaginons un cas simple :
Nous remplaçons le routeur NAT par un serveur Proxy. Dans ce cas :
Un seul transfert de page depuis le serveur Texas Instruments vers le réseau local en remplace 14.
Parmi nos 14 élèves, il y en aura bien un qui aura l'idée, en passant, d'aller faire un petit tour sur par exemple http://www.canalcharme.com ou pire. N'y voyez pas de puritanisme de ma part, juste un souci d'efficacité dans le travail et une obligation légale de protection des mineurs…
Parce qu'il y en a tout de même…
Il faut commencer par paramétrer son navigateur Internet pour qu'il fasse appel à un proxy. Nous comprendrons mieux pourquoi en analysant le réseau.
Pour Firefox, c'est assez simple :
Menu « Edition » sous GNU/Linux ou « Outils » sous Windows, commande « Préférences… », Option « Avancé », onglet « Réseau » : Utilisez le bouton « Paramètres » de la connexion.
Ne faites pas confiance aux systèmes automatisés dans la mesure du possible et indiquez plutôt explicitement les paramètres du proxy :
Vous pouvez éventuellement spécifier des proxy différents suivant les protocoles et dans quelles conditions vous voulez éviter le proxy.
Voilà. Si le proxy est bien configuré, ça devrait fonctionner…
Un proxy est placé entre un réseau local privé et un accès Internet. La configuration est alors la suivante :
Le proxy dispose de deux adresses :
Le proxy isole complètement le réseau privé de l'internet. Il ne servira que de serveur mandataire pour les requêtes HTTP (éventuellement aussi FTP). Avec la floraison de services webmail proposée par les fournisseurs de services, cette configuration peut permettre l'accès aux trois services les plus utilisés sur le Net :
Si l'on se contente de ces trois services, il n'est alors pas nécessaire d'installer de routeur NAT, le proxy suffit. Mais comprenons nous bien : Seuls les protocoles HTTP et FTP passeront, sauf cas de proxy plus particuliers, ce qui n'est pas l'objet de cette présentation.
Le montage adopté n'est pas obligatoirement le plus utile. Il n'y a d'ailleurs pas de connexion Internet mise en œuvre ici. Ce montage est juste fait pour illustrer le travail du proxy, lorsqu'il est utilisé.
Notez bien que 192.168.0.251 (qui est en fait ma passerelle NAT vers le Net, bien que cette fonction ne serve pas ici), est également mon DNS, ça va se voir dans l'exemple.
Le client va demander la page d'accueil du site hébergé sur le serveur HTTP. Il va le faire directement :
No. Source Destination Protocol Info 4 192.168.0.10 192.168.0.251 HTTP GET / HTTP/1.1 6 192.168.0.251 192.168.0.10 HTTP HTTP/1.1 200 OK 7 192.168.0.10 192.168.0.251 HTTP GET /tbm.htm HTTP/1.1 8 192.168.0.251 192.168.0.10 HTTP HTTP/1.1 200 OK 9 192.168.0.251 192.168.0.10 HTTP Continuation 11 192.168.0.251 192.168.0.10 HTTP Continuation 16 192.168.0.10 192.168.0.251 HTTP GET /home.htm HTTP/1.1 18 192.168.0.251 192.168.0.10 HTTP HTTP/1.1 200 OK 19 192.168.0.251 192.168.0.10 HTTP Continuation 23 192.168.0.10 192.168.0.251 HTTP GET /banniere.htm HTTP/1.1 24 192.168.0.251 192.168.0.10 HTTP HTTP/1.1 200 OK 25 192.168.0.251 192.168.0.10 HTTP Continuation etc...
J'ai volontairement fait disparaître les trames SYN, ACK de TCP, qui ne nous apportent rien dans la compréhension de l'échange. Nous voyons clairement que l'échange se fait entre le client et le serveur HTTP.
Nous paramétrons maintenant notre client pour qu'il utilise le proxy 192.168.0.253. Nous vidons le cache du navigateur et refaisons notre requête. Le proxy est également “tout neuf” son cache est parfaitement vide.
No. Source Destination Protocol Info 4 192.168.0.10 192.168.0.253 HTTP GET http://gw2.maison.mrs/ HTTP/1.0 La requête a été faite au proxy et non pas à la cible qui est 192.168.0.251... Le proxy, cherche alors l'IP de la cible : (192.168.0.251 est aussi DNS dans l'exemple). Notez que le client envoie ici dans sa requête l'URI complet de la cible convoitée 6 192.168.0.253 192.168.0.251 DNS Standard query A gw2.maison.mrs 7 192.168.0.251 192.168.0.253 DNS Standard query response A 192.168.0.251 Puis transmet la requête à la cible... 11 192.168.0.253 192.168.0.251 HTTP GET / HTTP/1.0 La cible répond au proxy : 13 192.168.0.251 192.168.0.253 HTTP HTTP/1.1 200 OK qui retransmet au client: 15 192.168.0.253 192.168.0.10 HTTP HTTP/1.0 200 OK et ainsi de suite... 16 192.168.0.10 192.168.0.253 HTTP GET http://gw2.maison.mrs/tbm.htm HTTP/1.0 18 192.168.0.253 192.168.0.251 HTTP GET /tbm.htm HTTP/1.0 20 192.168.0.251 192.168.0.253 HTTP HTTP/1.1 200 OK 22 192.168.0.253 192.168.0.10 HTTP HTTP/1.0 200 OK 23 192.168.0.251 192.168.0.253 HTTP Continuation 25 192.168.0.253 192.168.0.10 HTTP Continuation 26 192.168.0.251 192.168.0.253 HTTP Continuation 28 192.168.0.251 192.168.0.253 HTTP Continuation 31 192.168.0.253 192.168.0.10 HTTP Continuation 35 192.168.0.10 192.168.0.253 HTTP GET http://gw2.maison.mrs/banniere.htm HTTP/1.0 37 192.168.0.253 192.168.0.251 HTTP GET /banniere.htm HTTP/1.0 41 192.168.0.10 192.168.0.253 HTTP GET http://gw2.maison.mrs/home.htm HTTP/1.0 46 192.168.0.253 192.168.0.251 HTTP GET /home.htm HTTP/1.0 48 192.168.0.251 192.168.0.253 HTTP HTTP/1.1 200 OK 49 192.168.0.251 192.168.0.253 HTTP Continuation 51 192.168.0.253 192.168.0.10 HTTP HTTP/1.0 200 OK 52 192.168.0.253 192.168.0.10 HTTP Continuation 54 192.168.0.251 192.168.0.253 HTTP HTTP/1.1 200 OK 56 192.168.0.253 192.168.0.10 HTTP HTTP/1.0 200 OK 57 192.168.0.251 192.168.0.253 HTTP Continuation etc...
Bien. Pour l'instant, c'est plutôt nettement plus compliqué et plus lourd qu'une requête directe. Notez au passage que le proxy (Squid dans ce cas), cause HTTP 1.0 et non HTTP 1.1.
Nous pouvons suivre les évènements à travers les logs du serveur SQUID :
192.168.0.10 TCP_MISS/200 1421 GET http://gw2.maison.mrs/ - DIRECT/192.168.0.251 text/html 192.168.0.10 TCP_MISS/200 4365 GET http://gw2.maison.mrs/tbm.htm - DIRECT/192.168.0.251 text/html 192.168.0.10 TCP_MISS/200 1513 GET http://gw2.maison.mrs/banniere.htm - DIRECT/192.168.0.251 text/html 192.168.0.10 TCP_MISS/200 4228 GET http://gw2.maison.mrs/home.htm - DIRECT/192.168.0.251 text/html etc...Le
TCP_MISS
indique que le proxy n'a pas la réponse en cache et qu'il va donc la chercher à la source (DIRECT
)
Mais maintenant, le cache du proxy n'est pas vide, il contient désormais ces documents. Nous allons le vérifier immédiatement en :
No. Source Destination Protocol Info 4 192.168.0.10 192.168.0.253 HTTP GET http://gw2.maison.mrs/ HTTP/1.0 6 192.168.0.253 192.168.0.10 HTTP HTTP/1.0 200 OK 7 192.168.0.10 192.168.0.253 HTTP GET http://gw2.maison.mrs/tbm.htm HTTP/1.0 8 192.168.0.253 192.168.0.10 HTTP HTTP/1.0 200 OK 9 192.168.0.253 192.168.0.10 HTTP Continuation 11 192.168.0.253 192.168.0.10 HTTP Continuation 16 192.168.0.10 192.168.0.253 HTTP GET http://gw2.maison.mrs/banniere.htm HTTP/1.0 18 192.168.0.253 192.168.0.10 HTTP HTTP/1.0 200 OK 19 192.168.0.253 192.168.0.10 HTTP Continuation 24 192.168.0.10 192.168.0.253 HTTP GET http://gw2.maison.mrs/home.htm HTTP/1.0 26 192.168.0.253 192.168.0.10 HTTP HTTP/1.0 200 OK 27 192.168.0.253 192.168.0.10 HTTP Continuation etc...
Et là, nous constatons que le dialogue s'effectue uniquement entre le client et le proxy. Autrement dit, le proxy sert au client la totalité des requêtes, il n'y a plus aucun échange entre le proxy et le serveur HTTP.
Vérifions les logs :
192.168.0.10 TCP_MEM_HIT/200 1430 GET http://gw2.maison.mrs/ - NONE/- text/html 192.168.0.10 TCP_MEM_HIT/200 4374 GET http://gw2.maison.mrs/tbm.htm - NONE/- text/html 192.168.0.10 TCP_MEM_HIT/200 1522 GET http://gw2.maison.mrs/banniere.htm - **NONE/- text/html 192.168.0.10 TCP_MEM_HIT/200 4237 GET http://gw2.maison.mrs/home.htm - NONE/- text/html etc...
TCP_MEM_HIT
veut dire que non seulement la réponse est en cache (HIT) mais qu'elle est en mémoire (MEM). Il n'y a donc pas d'interrogation en amont (NONE
).
Notez qu'il aurait pu se passer autre chose. Ici, la requête initiale et la seconde requête du client étaient séparées par un intervalle de temps très court. Si cet intervalle avait augmenté, le document ne se serait peut-être plus trouvé dans le cache mémoire, mais dans le cache disque, et il aurait pu se faire que le proxy aille s'assurer auprès du serveur source que son contenu local était encore valide. La stratégie est assez logique :
Les notions de « vient d'être », « il y a déjà quelques temps » et « il y a trop longtemps » sont bien entendu subjectives et c'est à l'administrateur du proxy de les évaluer efficacement.
Il y a tout de même quelques exceptions à ces règles :
Lorsque la connexion entre le réseau local et le Net se fait par un lien facturé à la durée ou au volume transmis, le gain financier peut être appréciable.
Lorsque la connexion au Net se fait par un lien à faible débit, le gain en temps peut également être très appréciable.
Nous ne le verrons pas ici dans le détail, mais les possibilités de contrôle d'accès au Net sont plus grandes et plus simples à mettre en œuvre avec un proxy qu'avec un routeur. De même, la sécurité du réseau local est plus facilement assurée, si le serveur proxy n'est vraiment qu'un proxy. La solution du proxy n'est cependant pas la panacée et il convient de bien analyser toutes les solutions possibles à un problème donné avant d'en choisir une.
Dans ce que nous avons vu, la présence du proxy est connue des utilisateurs du réseau, ils doivent configurer leur navigateur pour pouvoir l'utiliser.
Il est possible de forcer les utilisateurs à passer par le proxy en bloquant le port 80 sur la passerelle par défaut. L'expérience montre qu'il n'est pas toujours simple de l'expliquer aux utilisateurs, surtout lorsqu'ils sont visiteurs occasionnels.
Techniquement, nous l'avons vu dans les analyses des trames, le client HTTP s'adresse explicitement au proxy et place dans sa requête GET
l'URI complet de la cible visée. C'est pour forcer ce type de comportement qu'il faut paramétrer correctement le client HTTP.
L'autre méthode, c'est de laisser le client HTTP dans l'ignorance de l'existence du proxy. Il va alors exécuter un GET « normal » sur l'adresse IP de la cible visée. Pour forcer le passage par le proxy, la passerelle devra alors rediriger cette requête sur le serveur proxy et ce dernier devra savoir retrouver l'adresse de la cible, ailleurs que dans la commande GET
, surtout si le client parle HTTP 1.0. La configuration du proxy doit donc tenir compte de ce mode de fonctionnement.
Squid sait fonctionner en mode « transparent », il suffit de le lui demander poliment.
Plus de configuration du client HTTP, donc plus rien de technique à expliquer aux utilisateurs.
L'utilisateur occasionnel (visiteur par exemple), n'aura pas à « bricoler » son client HTTP en entrant et en sortant de votre réseau. Même si pour lui, cette opération est triviale, elle reste tout de même contraignante.
La tentation est grande alors d'oublier de prévenir les utilisateurs qu'ils passent par un proxy et que donc, outre les éventuels décalages entre les pages servies et les pages à jour, toute leur activité se trouve enregistrée dans les logs.
Un proxy transparent ne peut fonctionner que sur un seul port et uniquement pour HTTP :
Le serveur proxy peut être une très bonne solution pour partager un accès internet au niveau application
, ce qui permet d'effectuer un filtrage au niveau du protocole lui-même. Indispensable lorsque l'on doit donner l'accès à des mineurs, dans le cadre scolaire par exemple.
Une mise en pratique est analysée dans le chapitre « Squid et SquidGuard » dans ce but.