Могу ли я создать SSH для туннелирования HTTP через сервер, как через прокси?

Вопрос или проблема

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

Возможно ли это сделать, используя SSH туннель, или мне нужно установить на сервер какой-то прокси-сервис?

Вы можете сделать это, используя ssh

ssh -L 80:remotehost:80 user@myserver

У вас будет туннель от вашего локального порта 80 к порту 80 на remotehost. Это не обязательно должен быть тот же myserver.
Чтобы сделать это прозрачным, вам следует добавить запись в файл hosts. Если вы этого не сделаете, виртуальные хосты не будут работать.
Если вы хотите соединение через SOCKS-прокси, вы можете также использовать

ssh -D 5000 user@myserver

Это создаст SOCKS-прокси на локальном хосте на порту 5000, который будет направлять все запросы через myserver.

Да, это возможно.

Запустите ssh -D port user@host и настройте вашего клиента использовать ваш компьютер в качестве SOCKS-прокси.

Если вам нужен именно HTTP прокси, вы можете использовать Proxychains и направить его через предыдущий SOCKS.

sshuttle работает как VPN, но через SSH.

Прозрачный прокси-сервер, который работает как VPN для бедных. Пересылает через ssh. Не требует прав администратора. Работает с Linux и MacOS. Поддерживает туннелирование DNS.

https://github.com/sshuttle/sshuttle

Putty тоже довольно хорошо с этим справляется.

В SSH перейдите в Tunnels. Внизу в поле для порта введите 8080, оставьте поле для адресата пустым и выберите радио-кнопку “Dynamic”. Все, что вам нужно сделать, это подключиться к серверу, используя Putty.

После подключения у вас будет прокси-сервер, работающий на вашем локальном хосте на порту 8080, который будет проксировать все запросы через ваш сервер.

Теперь используйте веб-браузер и настройте прокси, указав host=localhost и port=8080, убедитесь, что вы выбираете SOCKS-прокси. Я делаю это все время, поэтому если вы используете Firefox, убедитесь, что вы установили плагин FoxyProxy, поскольку он делает включение/выключение прокси одним щелчком мыши.

Предупреждение: Помните, что по умолчанию ваши DNS-запросы не проксируются. Таким образом, веб-сайт, который вы посещаете через прокси, все равно будет зарегистрирован (если они это записывают). Вы можете настроить Firefox на проксирование DNS-запросов, просто это не делается по умолчанию.

Для того чтобы разрешить запуск прокси на компьютере и позволить другим клиентам подключаться, вам потребуется опция -g. Например, вы можете выполнить следующую команду на сервере с именем foo:

ssh -g -ND 9191 root@remotehost

Затем вы можете установить прокси в браузере клиента для использования сервера foo и порта 9191 в качестве SOCKS-прокси. Клиенты будут отправлять свои запросы на foo, который, в свою очередь, будет переадресовывать запрос через ssh на remotehost. Таким образом, в интернете будет казаться, что они используют remotehost.

Если вы хотите также перенаправлять DNS-запросы в Firefox, отредактируйте about:config в Firefox и установите network.proxy.socks_remote_dns в true.

Простая инструкция по HTTP-туннелированию с помощью SSH

Сначала мне не были понятны лучшие ответы, поэтому я поискал инструкцию. Вот что я узнал и достиг.

Настройка

Вы находитесь на вашей клиентской машине, это любой компьютер, на котором вы можете вводить команды.
Вы хотите подключиться к машине с названием remotehost, передавая ваш трафик через машину с названием proxyhost.
Вы можете подключиться через ssh к proxyhost.
remotehost недоступен из вашей клиентской машины, но доступен из proxyhost.

Шаги

  1. На вашем клиенте выполните эту команду:
  2. ssh -L <local-port>:<remotehost>:<remote-port> <username-on-proxy>@<proxyhost>
    Где
    • <local-port> — это свободный порт на вашем клиенте, например 8000;
    • <remotehost> — это доменное имя или IP-адрес машины remotehost. Заметьте, что это доменное имя или IP-адрес могут быть бесполезны или недоступны вашему клиенту. Важно, чтобы они были значимы и доступны для вашего proxyhost.
    • <remote-port> — это порт, который вы хотите достичь на remotehost, например 80 для http или 443 для https.
    • <username-on-proxy>@<proxyhost> — это способ доступа на proxyhost через ssh и вашего аккаунта на этой машине.
  3. На этом этапе вы можете перейти на localhost:<local-port> и пользоваться ресурсами remotehost.

Вы можете использовать SSHUTTLE, вот инструкция, как его использовать,

https://etherarp.net/sshuttle-a-vpn-for-the-lazy/

вот инструкция, как настроить его для работы в качестве сервиса,

https://medium.com/@mike.reider/using-sshuttle-as-a-service-bec2684a65fe

Я столкнулся с некоторыми трудностями при попытке пересылки сокетов. Особенно в ситуации, когда nginx использует сокет для обслуживания сайта на основе flask:
Вот мой опыт:

Пересылка сокетов может быть записана так:

ssh -R /run/temp1.sock:/run/temp2.sock somehost -N

temp1.sock относится к сокету на удаленном сайте.
ssh не принимает использование существующего удаленного сокета, но должен его создать. Он создается с разрешением 600, поэтому после создания, его нужно сделать доступным для nginx, добавив права на запись/чтение для пользователя www-data.

Ответ или решение

Создание SSH туннеля для проксирования HTTP через сервер

Теоретическая часть

SSH (Secure Shell) не только обеспечивает безопасное удаленное управление серверами, но и обладает возможностями для создания туннелей между клиентскими и серверными машинами. Один из основных способов использовать SSH для туннелирования — это создание прокси-соединений, таких как SOCKS-прокси, которое позволяет маршрутизировать HTTP/HTTPS-трафик через промежуточный сервер. Такой подход помогает повысить безопасность соединений, обходить географические ограничения или использовать полноценные возможности удаленного сервера.

Примеры использования SSH туннеля

  1. Локальный перенаправляемый порт (Local Port Forwarding)

    Если необходимо напрямую соединить клиентскую машину с удаленным хостом через промежуточный сервер, можно использовать следующий подход:

    ssh -L <локальный_порт>:<удаленный_хост>:<порт_удаленного_хоста> <пользователь_на_прокси>@<хост_прокси>
    • <локальный_порт>: свободный порт на вашей клиентской машине, например, 8000.
    • <удаленный_хост>: имя домена или IP адрес удаленного хоста, который находится вне досягаемости клиента, но доступен из сети прокси-сервера.
    • <порт_удаленного_хоста>: порт, к которому осуществляется подключение на удаленном хосте, например, 80 для HTTP или 443 для HTTPS.
    • <пользователь_на_прокси>@<хост_прокси>: учетные данные для SSH-подключения на промежуточный сервер.
  2. SOCKS-прокси

    Для более универсального подхода вы можете воспользоваться SOCKS-прокси:

    ssh -D <порт> <пользователь>@<сервис>
    • <порт>: локальный порт для создания SOCKS-прокси, например, 5000.

    В браузере или другом ПО необходимо настроить использование локального SOCKS-прокси: добавить новый прокси-сервер с хостом localhost и вышеуказанным портом. Это позволит маршрутизировать трафик через сервер, к которому подключаетесь.

  3. SSHUTTLE

    SSHuttle позволяет создавать туннели, которые ведут себя как VPN, но используют SSH, что не требует прав суперпользователя. Соединения с интернет-ресурсами через такой туннель выполняются так же, как при VPN-подключении, причем весь трафик проходит через прокси-сервер. Это удобно для работы в сетях с ограниченными правами доступа. Более подробную информацию о реализации можно найти в документации SSHuttle.

Практическое применение

Использование SSH для создания туннелей особенно актуально для специалистов в условиях работы с различными удаленными сервисами. Например:

  • Безопасный доступ к внутренним корпоративным сетям или серверам с ограниченным интернет-доступом.
  • Защита трафика при работе в недоверенных сетях, например, в публичных Wi-Fi-точках.
  • Обход географических ограничений при доступе к ресурсам, доступным лишь с определенных IP-адресов.

При настройке туннеля через SSH важно помнить, что в отличие от специализированных инструментов VPN, SSH-туннель может не передавать DNS-запросы через прокси по умолчанию, чего можно добиться дополнительной настройкой браузера (например, установкой параметра network.proxy.socks_remote_dns в Firefox на значение true).

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

Оцените материал
Добавить комментарий

Капча загружается...