Comment fonctionne exactement un proxy?

12

Si je veux me connecter pour dire, IP 100.100.100.100, Port 80, mon ordinateur enverra un paquet TCP avec cette adresse dans le fil.

Maintenant, si j'utilise un serveur proxy, par exemple, 200.200.200.200 Port 8080 (ce type de proxy que vous pouvez configurer dans Internet Explorer) comment ce processus est-il modifié?

Lorsque je veux toujours me connecter à la même IP, l'en-tête IP inclura-t-il l'IP de destination ou l'IP proxy ou les deux?

J'ai déjà googlé, il y a des centaines de pages qui vous expliquent comment configurer un proxy mais aucune n'explique comment cela fonctionne sous le capot.

cody
la source

Réponses:

13

La demande HTTP est envoyée du client au port 8080 du serveur proxy. Le serveur proxy envoie ensuite une nouvelle demande HTTP au site de destination. Le proxy, selon la configuration, ajoute souvent un en-tête "X-Forwarded-For" à la requête HTTP. Les fichiers journaux sur le site Web de destination afficheront l'adresse IP du proxy, mais peuvent ou non être configurés pour enregistrer l'adresse «X-Forwarded-For».

C'est la configuration typique, mais le logiciel proxy vous permettra toutes sortes de personnalisations.

EDIT: Je dois noter que lorsque j'ai lu votre question à l'origine, j'ai eu l'idée que vous posiez sur un proxy HTTP en particulier, comme squid ou nginx. Il existe de nombreux types de procurations différents. Dans Internet Explorer, vous utiliserez très probablement un proxy HTTP, mais il existe également de nombreux autres types.

emgee
la source
Oui, cela dépend beaucoup du logiciel que vous utilisez comme serveur proxy et de sa configuration. Voir, par exemple, le HttpProxyModule pour Nginx: wiki.nginx.org/HttpProxyModule
entropo
3
Si la demande est envoyée uniquement au serveur proxy, comment le proxy sait-il à quelle adresse de destination je veux me connecter? Le proxy fonctionne-t-il au niveau http ou au niveau tcp?
cody
Le navigateur qui fait la demande au proxy demande l'URI complet. Le serveur proxy effectue ensuite la recherche DNS et envoie sa propre requête HTTP au site cible.
emgee
1
Un proxy http, comme Squid (sur lequel j'ai basé ma réponse) fonctionne au niveau de la couche application.
emgee
1
@emgee: Le protocole HTTP a également une méthode CONNECT, il est donc possible de se connecter via un proxy HTTP à un serveur TCP (si le proxy le permet) et ce serveur TCP n'a pas à être un serveur qui parle HTTP.
vtest
2

HTTP est un protocole de couche 7, donc ne vous trompez pas. lorsque vous utilisez un proxy HTTP et que vous tapez, par exemple, google.com, l'en-tête HTTP est toujours le même google.com, mais l'adresse IP de destination sera l'adresse IP du proxy, la source sera l'adresse IP des hôtes vers le numéro de port personnalisé 8080.

user205246
la source
1

Pour utiliser un proxy HTTP, la demande est envoyée du client à l'adresse IP du serveur proxy plutôt qu'au serveur de destination. Le proxy doit ensuite lire l'en-tête HTTP pour extraire l' URI de demande . L'URI de demande inclut le nom ou l'IP du serveur de destination, et le serveur proxy utilise ces informations pour transmettre la demande.

La spécification HTTP permet à la ligne de demande d'exclure le nom et le port du serveur lorsqu'un proxy n'est pas utilisé (car ils ne seraient pas nécessaires si la demande était envoyée directement à ce serveur). Mais, selon les spécifications ...

Le formulaire absoluteURI est OBLIGATOIRE lorsque la demande est adressée à un mandataire.

Ainsi, lorsque vous n'utilisez pas de proxy, la ligne de demande peut ressembler à:

GET /robots.txt HTTP/1.1

mais pour utiliser un proxy, la ligne doit inclure le nom du serveur (et le port sinon 80):

GET http://httpbin.org:80/robots.txt HTTP/1.1

Le côté réponse si l'opération peut être plus simple puisque le serveur proxy peut simplement relayer la réponse textuelle via le socket de requête préétabli.

nobar
la source
Tiré de "HTTP The Definitive Guide", p. 145: "HTTP / 1.1 nécessite désormais que les serveurs gèrent les URI complets pour les requêtes de proxy et de serveur, mais dans la pratique, de nombreux serveurs déployés n'acceptent toujours que des URI partiels."
nobar
Ce n'est pas l'approche standard, mais un proxy peut également être en mesure d'utiliser l'en- Hosttête pour compléter un URI partiel si un URI absolu n'est pas fourni dans la ligne de demande.
nobar
Cette approche ne peut pas fonctionner si la connexion est chiffrée de bout en bout (HTTPS). security.stackexchange.com/questions/101721/…
nobar
-7

Il n'y a pas de "paquet TCP". TCP fonctionne avec des flux de données. Il existe des paquets IP.

Vous semblez manquer de connaissances de base sur la mise en réseau, je vous suggère de vous procurer un bon livre sur TCP / IP. Le favori de tous semble être "TCP / IP illustré" par W. Richard Stevens.

Revenons à votre question.

Un proxy est un intermédiaire:

[vous] - [proxy] - [serveur que vous souhaitez connecter]

Maintenant, il existe deux connexions différentes:

[vous] - (votre connexion au proxy) - [proxy] - (la connexion du proxy au serveur) - [le serveur que vous souhaitez connecter]

Lorsque vous pensez que vous vous connectez à un serveur via un proxy, vous vous connectez réellement au proxy et lui dites que vous souhaitez atteindre un certain serveur. Ensuite, le proxy ouvre une seconde connexion de lui-même à ce serveur et agit comme un intermédiaire transmettant les données dans les deux sens.

vtest
la source
13
Un paquet TCP est un paquet IP contenant des informations d'en-tête TCP. C'est un langage courant. S'il vous plaît, ne soyez pas si impoli avec condescendance; cela ne fait que mal réfléchir sur vous, car vous avez également tort en même temps.
Phil P