Вопрос или проблема
У меня есть следующая сеть:
___________ ___________ ===========================
| HostA | | HostB | || www.internetservice.com ||
|-----------| <===== |-----------| =====> ||=========================||
|10.11.12.13| |66.77.88.99| || 151.141.12.10:123 ||
|___________| |___________| ===========================
HostB
может получить доступ кHostA
(например,ping 10.11.12.13
выполняется успешно)HostB
может получить доступ кwww.internetservice.com
на151.141.12.10:123
(например,telnet www.internetservice.com 123
иtelnet 151.141.12.10 123
выполняются успешно)HostA
не может получить доступ кHostB
(например,ping 66.77.88.99
завершается неудачей)- и, конечно,
HostA
не может получить доступ кwww.internetservice.com
на151.141.12.10:123
(telnet www.internetservice.com 123
иtelnet 151.141.12.10 123
тоже не выполняются)
Конечно, я хочу сделать так, чтобы Интернет на 151.141.12.10:123
был доступен с HostA
!
У меня уже есть решение, но оно меня не совсем устраивает; я хотел бы, чтобы оно было лучше. Моё решение заключается в создании с HostB
обратного SSH-туннеля на HostA
к Интернет-сервису:
myuserB@HostB:~ ssh -N -R 123:www.internetservice.com:123 myuserA@HostA
Таким образом, myuserA на HostA
может открыть соединение с www.internetservice.com:123
, запустив:
myuserA@HostA:~ telnet localhost 123
Это работает хорошо; почти идеально… за исключением того, что я предпочел бы выполнить
myuserA@HostA:~ telnet www.internetservice.com 123
или хотя бы
myuserA@HostA:~ telnet 151.141.12.10 123
Чтобы добиться того, что я хочу, я пытался (без успеха) инициализировать SSH-туннель, запустив
myuserB@HostB:~ ssh -N -R www.internetservice.com:123:www.internetservice.com:123 myuserA@HostA
Я также пытался
myuserB@HostB:~ ssh -N -R 151.141.12.10:123:151.141.12.10:123 myuserA@HostA
но при этом я не могу выполнить telnet ни на www.internetservice.com:123
, ни на 151.141.12.10 123
с HostA
Какие-нибудь идеи, что мне следует сделать?
Прямые туннели OpenSSH могут слушать соединения только на машине, на которой они работают – они не могут автоматически перехватывать соединения, сделанные на внешние адреса. Однако есть несколько вариантов:
-
Измените файл /etc/hosts на
HostA
, чтобы перенастроитьwww.internetservice.com
на адрес127.0.0.1
.127.0.0.1 localhost 127.0.0.1 internetservice.com 127.0.0.1 www.internetservice.com
(Смотрите
man hosts
. Это повлияет на большинство программ, кроме dig/host/nslookup.) -
Используйте iptables на
HostA
, чтобы создать правилоREDIRECT
, которое перехватывает все соединения, сделанные к151.141.12.10:123
, и перенаправляет их на127.0.0.1:123
вместо. (Это также может изменить номер порта, если нужно.)iptables -t nat -I OUTPUT \ -d 151.141.12.10 -p tcp --dport 123 \ -j REDIRECT --to-ports 123
(Смотрите
man iptables-extensions
. Цель REDIRECT по сути такая же, как DNAT, только с 127.0.0.1, предполагаемым в качестве нового адреса назначения.) -
Вместо ‘простой’ туннель, используйте
-R 1234
, чтобы создать динамический туннель – указанный порт на удаленной стороне станет слушателем SOCKS-прокси, затем вы можете настроить ваш веб-браузер на использование SOCKS-прокси на127.0.0.1:1234
, и он будет туннелировать всё (включая посещенияhttp://www.internetservice.com
через SSH-соединение).Это работает лучше всего с браузерами, но есть инструменты “обертки SOCKS”, которые заставляют другие программы подключаться к SOCKS-прокси.
“Локальный” эквивалент –
-D 1234
(не-L
).
Ответ или решение
Использование реверсивного туннелирования для доступа к недоступным URL
В современных сетях зачастую необходимо обеспечить доступ к удалённым ресурсам, находящимся за пределами доступности. Рассмотрим ситуацию, когда два хоста, HostA и HostB, находятся в различных сетях, причем HostA не может напрямую обращаться к интернет-ресурсу www.internetservice.com по адресам 151.141.12.10:123. Однако HostB имеет возможность выхода в Интернет и доступ к HostA. В данной статье мы рассмотрим использование реверсивного SSH-туннелирования для достижения этой цели и предложим несколько альтернативных решений, чтобы обеспечить доступ к интернет-ресурсу с HostA.
Проблема
- Сетевые ограничения: HostA может пинговать HostB, но не может получить доступ к интернету, в то время как HostB может как пинговать HostA, так и подключаться к интернет-ресурсу.
-
Текущие решения: Ваша текущая реализация с использованием команды для создания реверсивного туннеля:
myuserB@HostB:~ ssh -N -R 123:www.internetservice.com:123 myuserA@HostA
успешно создает соединение, но требует, чтобы доступ к ресурсу осуществлялся через
telnet localhost 123
, что не является идеальным решением.
Реверсивное туннелирование
Реверсивное туннелирование позволяет установить SSH-соединение таким образом, чтобы клиент (в данном случае HostB) открывал порт для доступа к серверу (HostA). Тем не менее, использование простого SSH-туннеля имеет свои ограничения.
Рассмотрим несколько вариантов реализации:
-
Редирект через локальный файл hosts:
Измените файл/etc/hosts
на HostA, добавив запись для перенаправления запросов кwww.internetservice.com
на локальный адрес:127.0.0.1 localhost 127.0.0.1 internetservice.com 127.0.0.1 www.internetservice.com
Это позволит приложениям на HostA обращаться к
www.internetservice.com
как кlocalhost
, тем самым обеспечивая доступ к интернет-ресурсу через создание SSH-туннеля с HostB. -
Использование iptables для перенаправления трафика:
Создайте правило вiptables
на HostA для перенаправления запросов на151.141.12.10:123
в локальный порт:iptables -t nat -I OUTPUT -d 151.141.12.10 -p tcp --dport 123 -j REDIRECT --to-ports 123
Это позволяет перенаправлять все TCP-запросы с HostA, направленные на адрес
151.141.12.10
и порт123
, на127.0.0.1:123
, обеспечивая доступ к интернет-ресурсу без необходимости изменять команды подключения. -
Создание динамического SOCKS-прокси с SSH:
Используйте динамическое туннелирование с помощью ключа-D
, создавая SOCKS-прокси на HostB:myuserB@HostB:~ ssh -N -D 1234 myuserA@HostA
Затем настройте приложения на HostA (например, браузер) для использования SOCKS-прокси на
127.0.0.1:1234
, что позволит направлять все HTTP(S) запросы через SSH-туннель и обеспечивать доступ кwww.internetservice.com
.
Заключение
Использование реверсивного туннелирования предоставляет гибкие решения для доступа к недоступным интернет-ресурсам, обеспечивая при этом безопасность SSH-соединений. Выбор подхода зависит от специфики задач и ограничений сети. Отказ от простых методов туннелирования в пользу перенаправления трафика с помощью iptables
или создания SOCKS-прокси может значительно улучшить вашу работу с недоступными ресурсами. В этом контексте важно рассмотреть каждый вариант, чтобы выбрать наиболее оптимальное и безопасное решение для ваших нужд.