Вопрос или проблема
Предположим, у меня есть сервер
и клиент
. Мне нужно установить соединение от клиента
к веб-сайту
через сервер
, как будто это прокси.
Возможно ли это сделать, используя 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.
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
.
Шаги
- На вашем
клиенте
выполните эту команду: 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 и вашего аккаунта на этой машине.
- На этом этапе вы можете перейти на
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 туннеля
-
Локальный перенаправляемый порт (Local Port Forwarding)
Если необходимо напрямую соединить клиентскую машину с удаленным хостом через промежуточный сервер, можно использовать следующий подход:
ssh -L <локальный_порт>:<удаленный_хост>:<порт_удаленного_хоста> <пользователь_на_прокси>@<хост_прокси>
<локальный_порт>
: свободный порт на вашей клиентской машине, например, 8000.<удаленный_хост>
: имя домена или IP адрес удаленного хоста, который находится вне досягаемости клиента, но доступен из сети прокси-сервера.<порт_удаленного_хоста>
: порт, к которому осуществляется подключение на удаленном хосте, например, 80 для HTTP или 443 для HTTPS.<пользователь_на_прокси>@<хост_прокси>
: учетные данные для SSH-подключения на промежуточный сервер.
-
SOCKS-прокси
Для более универсального подхода вы можете воспользоваться SOCKS-прокси:
ssh -D <порт> <пользователь>@<сервис>
<порт>
: локальный порт для создания SOCKS-прокси, например, 5000.
В браузере или другом ПО необходимо настроить использование локального SOCKS-прокси: добавить новый прокси-сервер с хостом
localhost
и вышеуказанным портом. Это позволит маршрутизировать трафик через сервер, к которому подключаетесь. -
SSHUTTLE
SSHuttle позволяет создавать туннели, которые ведут себя как VPN, но используют SSH, что не требует прав суперпользователя. Соединения с интернет-ресурсами через такой туннель выполняются так же, как при VPN-подключении, причем весь трафик проходит через прокси-сервер. Это удобно для работы в сетях с ограниченными правами доступа. Более подробную информацию о реализации можно найти в документации SSHuttle.
Практическое применение
Использование SSH для создания туннелей особенно актуально для специалистов в условиях работы с различными удаленными сервисами. Например:
- Безопасный доступ к внутренним корпоративным сетям или серверам с ограниченным интернет-доступом.
- Защита трафика при работе в недоверенных сетях, например, в публичных Wi-Fi-точках.
- Обход географических ограничений при доступе к ресурсам, доступным лишь с определенных IP-адресов.
При настройке туннеля через SSH важно помнить, что в отличие от специализированных инструментов VPN, SSH-туннель может не передавать DNS-запросы через прокси по умолчанию, чего можно добиться дополнительной настройкой браузера (например, установкой параметра network.proxy.socks_remote_dns
в Firefox на значение true
).
В заключение, использование SSH-туннелей предоставляет большую гибкость и мощные возможности для управления сетевыми подключениями, открывая доступ к обширным внутренним сетям через один промежуточный сервер. Это идеальный инструмент для специалистов, которым необходимо управлять множеством удаленных ресурсов, сохраняя высокий уровень безопасности данных.