Назад | Перейти на главную страницу

только с SSH: обратный туннельный веб-доступ через ssh SOCKS прокси

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

Я ищу простой способ туннелирования доступа в Интернет через сеанс SSH, чтобы я мог устанавливать обновления и программное обеспечение через yum / apt-get. В идеале я бы хотел избежать установки дополнительных программ / сервисов в защищенной области.

Что делать в такой ситуации?

SSH имеет -D <port> Опция прокси SOCKS. Но, к сожалению, от клиента к серверу только в одну сторону, и обратного варианта нет.

Мне наконец удалось добиться этого с помощью ssh только:

  1. запустите локальный прокси-сервер SOCKS на вашем клиентском компьютере (используя ssh -D)
  2. подключиться к удаленному серверу и настроить обратную переадресацию портов (ssh -R) на ваш локальный прокси-сервер SOCKS
  3. настроить серверное программное обеспечение для использования перенаправленного прокси

1. Запустите локальный прокси-сервер socks в фоновом режиме.

Подключитесь к localhost через SSH и откройте прокси-сервер SOCKS на порту 54321.

$ ssh -f -N -D 54321 localhost

-f запускает SSH в фоновом режиме.

Примечание: Если вы закроете терминал, с которого вы запустили команду, прокси-процесс будет убит. Также не забывайте убирать за собой, закрыв окно терминала, когда вы закончите, или убив процесс самостоятельно!

2. подключиться к удаленному серверу и настроить обратную переадресацию портов

Свяжите удаленный порт 6666 с локальным портом 54321. Это сделает ваш локальный прокси-сервер socks доступным для удаленного сайта через порт 6666.

$ ssh root@target -R6666:localhost:54321

3. настроить серверное программное обеспечение для использования перенаправленного прокси.

Просто настройте yum, apt, curl, wget или любой другой инструмент, поддерживающий SOCKS, для использования прокси. 127.0.0.1:6666.

Вуаля! Удачного туннелирования!


4. Необязательно: установите прокси-цепи, чтобы упростить задачу.

proxychains установленный на целевом сервере позволяет любой программное обеспечение для использования перенаправленного прокси-сервера SOCKS (даже telnet). Он использует LD_PRELOAD трюк для перенаправления запросов TCP и DNS от произвольных команд в прокси-сервер, и это действительно удобно.

Настроить /etc/proxychains.conf для использования перенаправленного прокси-сервера socks:

[ProxyList]
# SSH reverse proxy
socks5  127.0.0.1 6666

Туннелируйте произвольные инструменты (использующие TCP) с proxychains:

$ proxychains telnet google.com 80
$ proxychains yum update
$ proxychains apt-get update

Новые версии SSH позволяют использовать очень простой вариант: ssh-R <[bind_address:]port>. Использование только порта на хосте и, возможно, адреса привязки, но без указания порта на стороне клиента, создаст обратный прокси-сервер SOCKS.

Об этом также говорится на справочных страницах новых версий SSH:

[...] если не был указан явный пункт назначения, ssh будет действовать как прокси-сервер SOCKS 4/5 и перенаправлять соединения в пункты назначения, запрошенные удаленным клиентом SOCKS.

Вы можете проверить это с помощью curl, подключившись к простому API-интерфейсу "дай мне мой IP" http://ifconfig.io.

$ curl ifconfig.io

против

$ curl --socks5 localhost:<PORT> ifconfig.io