Обзор очень высокого уровня:
Опция -D
говорит ssh прослушивать соединения на этом порту с помощью протокола SOCKS. Вы настраиваете Firefox на соединение с ssh и говорите по протоколу SOCKS.
Введите http://www.google.com в браузере.
Firefox подключается к этому порту SOCKS. SOCKS может делать кучу вещей, но нас интересует вот это: Firefox спрашивает SOCKS сервер (ssh) "эй, не могли бы вы поговорить с www.google.com, и дать ему этот HTTP запрос? И скажите мне (Firefox), что www.google.com говорит в ответ на это?". (Firefox не знает и не заботится о том, чтобы ssh пересылал этот запрос через SSH туннель)
ssh пересылает этот запрос по ssh соединению на что-то, запущенное на удаленной машине (возможно sshd)
программа, запущенная на удаленной машине, делает соединение, посылает данные в Google и получает ответ обратно.
программа на удаленной машине, в ответ на запрос, сообщает ssh на вашей машине, что это за ответ.
ssh на вашей машине, в ответ на запрос, сообщает Firefox, что это такое, и что это за ответ.
Firefox знает свою веб-страницу, поэтому начинает работать над ее отображением.
Повторяйте много раз, для всех изображений, JavaScript, CSS и т.д.
Когда вы посещаете веб-сайт (тот, который не заблокирован корпоративным брандмауэром), ваш браузер отправляет запрос на сервер, указанный в URL-адресе, через порт 80 (по умолчанию). Например, чтобы посетить этот сайт, наши браузеры связываются с портом 80 сервера unix.stackexchange.com
. Когда вы устанавливаете настройки прокси-сервера, вы указываете своему браузеру отправлять все на localhost
порт 7070 независимо от URL-адреса. Прокси-сервер предназначен для простой выборки данных от имени клиента. Доступны различные прокси-серверы (быстрый поиск в репозитории вашего disto покажет несколько - squid
- это один, и веб-серверы apache
и nginx
также могут работать в качестве прокси), но установка одного из них не поможет вашему сценарию, поскольку прокси будет пытаться получить доступ к веб-сайту от вашего имени и по-прежнему будет заблокирован вашим корпоративным брандмауэром.
Однако ssh
с параметром -D в сочетании с демоном sshd
на удаленном сайте ( yourserver.com
) действует как прокси-сервер, за исключением того, что этот разделен на две половины - локальный ssh
и удаленный sshd
.
Запрос вашего браузера для http://unix.stackexchange.com
отправляется клиенту ssh
на вашем компьютере, который прослушивает порт 7070
]. Это зашифровывает запрос и отправляет его на удаленный sshd
сервер. Это расшифровывает запрос и отправляет его на соответствующий сервер (снова unix.stackexchange.com
, порт 80) с обратным путем (IP-адрес и порт, на который сервер должен возвращать свой ответ), измененный так, чтобы соответствовать пути сервера sshd
( yourserver.com
]).
Веб-сервер Stack Exchange ничего не знает об этом проксировании и отвечает любой запрашиваемой страницей на IP-адрес и порт сервера sshd
(из-за этой небольшой модификации). Однако этот сервер знает, что запрос исходит от ssh
, запущенного на вашем компьютере (он поддерживает таблицу этого типа информации), поэтому он шифрует его и отправляет обратно вам. ssh
на вашем компьютере отправляет ответ обратно в ваш браузер, который послушно отображает вашу веб-страницу для вас.
ssh
действует как распределенный прокси. «Туннелирование» здесь заключается в том, что прокси-сервер состоит из двух половин, и они разговаривают друг с другом через зашифрованный туннель, который никто не может отслеживать, и (в вашем случае) использует порт, который не заблокирован вашим брандмауэром (порт 22 ).