Использование обратного туннеля для доступа к URL, недоступному напрямую

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

У меня есть следующая сеть:

 ___________          ___________          ===========================
|   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.

Проблема

  1. Сетевые ограничения: HostA может пинговать HostB, но не может получить доступ к интернету, в то время как HostB может как пинговать HostA, так и подключаться к интернет-ресурсу.
  2. Текущие решения: Ваша текущая реализация с использованием команды для создания реверсивного туннеля:

    myuserB@HostB:~ ssh -N -R 123:www.internetservice.com:123 myuserA@HostA

    успешно создает соединение, но требует, чтобы доступ к ресурсу осуществлялся через telnet localhost 123, что не является идеальным решением.

Реверсивное туннелирование

Реверсивное туннелирование позволяет установить SSH-соединение таким образом, чтобы клиент (в данном случае HostB) открывал порт для доступа к серверу (HostA). Тем не менее, использование простого SSH-туннеля имеет свои ограничения.

Рассмотрим несколько вариантов реализации:
  1. Редирект через локальный файл 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.

  2. Использование 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, обеспечивая доступ к интернет-ресурсу без необходимости изменять команды подключения.

  3. Создание динамического 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-прокси может значительно улучшить вашу работу с недоступными ресурсами. В этом контексте важно рассмотреть каждый вариант, чтобы выбрать наиболее оптимальное и безопасное решение для ваших нужд.

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

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