Как именно работает прокси?


12

Если я хочу подключиться, чтобы сказать, IP 100.100.100.100, порт 80, мой компьютер отправит пакет tcp с этим адресом в провод.

Теперь, если я использую прокси-сервер, скажем, 200.200.200.200 Порт 8080 (такой тип прокси, который вы можете настроить в Internet Explorer), как этот процесс изменяется?

Если я все еще хочу подключиться к тому же IP-адресу, будет ли в заголовке IP-адреса указан IP-адрес назначения или IP-адрес прокси-сервера или оба этих параметра?

Я уже погуглил, есть сотни страниц, которые рассказывают, как настроить прокси, но ни одна не объясняет, как это работает под капотом.

Ответы:


12

HTTP-запрос отправляется с клиента на порт 8080 прокси-сервера. Затем прокси-сервер отправляет новый HTTP-запрос на конечный сайт. Прокси-сервер, в зависимости от конфигурации, часто добавляет заголовок «X-Forwarded-For» к HTTP-запросу. В файлах журнала на целевом веб-сайте будет отображаться IP-адрес прокси-сервера, но он может или не может быть настроен для регистрации адреса «X-Forwarded-For».

Это типичная конфигурация, но прокси-программное обеспечение позволит вам все виды настройки.

РЕДАКТИРОВАТЬ: я должен отметить, что когда я первоначально прочитал ваш вопрос, я понял, что вы спрашивали об HTTP-прокси, в частности, например, Squid или Nginx. Есть много различных типов доступных прокси. В Internet Explorer вы, скорее всего, будете использовать HTTP-прокси, но есть и много других типов.


Да, это очень сильно зависит от программного обеспечения, которое вы используете в качестве прокси-сервера, и от того, как оно настроено. См., Например, HttpProxyModule для Nginx: wiki.nginx.org/HttpProxyModule
entropo

3
Если запрос отправлен только на прокси-сервер, как прокси узнает, к какому адресу назначения я хочу подключиться? Прокси работает на уровне http или на уровне tcp?
cody

Браузер, выполняющий запрос к прокси, запрашивает полный URI. Затем прокси-сервер выполняет поиск DNS и отправляет собственный HTTP-запрос на целевой сайт.
Emgee

1
Прокси-сервер http, такой как Squid (на котором я основывал свой ответ), работает на прикладном уровне.
Emgee

1
@emgee: HTTP-протокол также имеет метод CONNECT, поэтому можно подключаться через HTTP-прокси к TCP-серверу (если это разрешено прокси-сервером), и этот TCP-сервер не обязательно должен быть сервером, который говорит по HTTP.
Вторник

2

HTTP - протокол уровня 7, так что не запутайтесь. когда вы используете прокси-сервер HTTP и вводите google.com, заголовок HTTP остается тем же google.com, но конечным IP-адресом будет IP-адрес прокси-сервера, а источником будет IP-адрес хоста для настроенного номера порта 8080.


0

Чтобы использовать HTTP-прокси, запрос отправляется от клиента на IP-адрес прокси-сервера, а не на конечный сервер. Затем прокси должен прочитать HTTP-заголовок, чтобы извлечь запрос-URI . URI запроса включает в себя имя или IP-адрес конечного сервера, и прокси-сервер использует эту информацию для пересылки запроса.

Спецификация HTTP позволяет строке запроса исключать имя и порт сервера, когда прокси-сервер не используется (так как в этом нет необходимости, если запрос был отправлен непосредственно на этот сервер). Но согласно спецификации ...

Форма absoluteURI ТРЕБУЕТСЯ, когда выполняется запрос к прокси.

Поэтому, когда прокси не используется, строка запроса может выглядеть следующим образом:

GET /robots.txt HTTP/1.1

но чтобы использовать прокси, строка должна содержать имя сервера (и порт, если не 80):

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

Сторона ответа, если операция может быть более простой, поскольку прокси-сервер может просто ретранслировать дословный ответ через предварительно установленный сокет запроса.


Из «HTTP The Definition Guide», стр. 145: «HTTP / 1.1 теперь требует, чтобы серверы обрабатывали полные URI для запросов прокси и серверов, но на практике многие развернутые серверы по-прежнему принимают только частичные URI».
nobar

Это не стандартный подход, но прокси-сервер также может использовать Hostзаголовок для завершения частичного URI, если в строке запроса не указан абсолютный URI.
nobar

Этот подход не может работать, если соединение является сквозным зашифрованным (HTTPS). security.stackexchange.com/questions/101721/...
nobar

-7

Там нет такого понятия, как "пакет TCP". TCP работает с потоками данных. Есть IP-пакеты.

Кажется, вам не хватает базовых знаний о работе с сетями, я предлагаю вам получить хорошую книгу о TCP / IP. Всеми любимым кажется «проиллюстрированный TCP / IP» У. Ричарда Стивенса.

Вернемся к вашему вопросу.

Прокси посредник:

[вы] - [прокси] - [сервер, к которому вы хотите подключиться]

Теперь есть два разных соединения:

[вы] - (ваше соединение с прокси) - [прокси] - (соединение прокси с сервером) - [сервер, к которому вы хотите подключиться]

Когда вы думаете, что подключаетесь к серверу через прокси-сервер, вы фактически подключаетесь к прокси-серверу и говорите, что хотите подключиться к определенному серверу. Затем прокси-сервер открывает второе соединение от себя с этим сервером и действует как посредник, передавая данные в обоих направлениях.


13
TCP-пакет - это IP-пакет с информацией заголовка TCP. Это обычный язык. Пожалуйста, не будь таким снисходительно грубым; это только плохо отражается на тебе, поскольку ты тоже ошибаешься одновременно.
Фил П
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.