Время от времени мне приходится подключаться к серверу, доступ к которому сильно ограничен.
Брандмауэр DMZ разрешает только входящий SSH.
Исходящие HTTP-соединения заблокированы.
Я ищу простой способ туннелирования доступа в Интернет через сеанс SSH, чтобы я мог устанавливать обновления и программное обеспечение через yum / apt-get. В идеале я бы хотел избежать установки дополнительных программ / сервисов в защищенной области.
Что делать в такой ситуации?
SSH имеет -D <port>
Опция прокси SOCKS. Но, к сожалению, от клиента к серверу только в одну сторону, и обратного варианта нет.
Мне наконец удалось добиться этого с помощью ssh
только:
ssh -D
)ssh -R
) на ваш локальный прокси-сервер SOCKS1. Запустите локальный прокси-сервер 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