Как работает обратное SSH-туннелирование?

Как я понимаю, брандмауэры (при условии настроек по умолчанию) отрицают весь входящий трафик, у которого нет соответствующего соответствующего исходящего трафика.

На основе Отмена подключения ssh и TXH Tunneling Made Easy , обратное SSH-туннелирование можно использовать, чтобы обойти досадные ограничения брандмауэра.

Я хотел бы выполнить команды оболочки на удаленной машине. Удаленный компьютер имеет собственный брандмауэр и находится за дополнительным брандмауэром (маршрутизатором). Он имеет IP-адрес, такой как 192.168.1.126 (или что-то подобное). Я не за брандмауэром, и я знаю IP-адрес удаленной машины, как видно из Интернета (а не адрес 192.168.1.126). Кроме того, я могу попросить кого-то выполнить ssh (something) как root на удаленном компьютере.

Может ли кто-нибудь объяснить мне шаг за шагом, как обратное туннелирование SSH работает, чтобы обойти брандмауэры (межсетевые экраны локальных и удаленных компьютеров и дополнительный межсетевой экран между ними)?

Какова роль коммутаторов (-R, -f, -L, -N )?

279 голосов | спросил Ali 24 PM00000030000002431 2012, 15:02:24

4 ответа


328

Мне нравится объяснять это посредством визуализации. : -)

Подумайте о своих SSH-соединениях в качестве трубок. Большие трубки. Обычно вы пробираетесь через эти трубки, чтобы запускать оболочку на удаленном компьютере. Оболочка запускается в виртуальном терминале (tty). Но вы уже знаете эту часть.

Подумайте о своем туннеле в виде трубки внутри трубки. У вас все еще есть большое соединение SSH, но опция -L или -R позволяет вам установить в нем меньшую трубку.

Каждая трубка имеет начало и конец. Большая трубка, ваше SSH-соединение, началась с вашего SSH-клиента и попала на сервер SSH, к которому вы подключились. Все меньшие трубки имеют одинаковые конечные точки, за исключением того, что роль «старт» или «конец» определяется тем, использовали ли вы -L или -R (соответственно), чтобы создайте их.

(Вы не сказали, но я предполагаю, что упомянутая вами «удаленная» машина, одна из которых стоит за брандмауэром, может получить доступ к Интернету с помощью Network Address Translation (NAT). важно, поэтому, пожалуйста, исправьте это предположение, если оно ложно.)

Когда вы создаете туннель, вы указываете адрес и порт, на которые он будет отвечать, и адрес и порт, к которому он будет доставлен. Опция -L указывает туннелю отвечать на локальной стороне туннеля (хост, на котором запущен ваш клиент). Опция -R указывает туннелю отвечать на удаленной стороне (сервер SSH).

направления туннеля ssh

Итак ... Чтобы иметь доступ к SSH из Интернета в машину за брандмауэром, вам нужна машина, чтобы открыть SSH-соединение с внешним миром и включить туннель -R чья «точка входа» является «удаленной» стороной его соединения.

Из двух моделей, показанных выше, вы хотите тот, который находится справа.

От хоста брандмауэра:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com

Это говорит клиенту о создании туннеля с точкой входа emote -R. Все, что подключается к порту 22222 в дальнем конце туннеля, фактически достигнет «localhost port 22», где «localhost» находится с точки зрения точки выхода туннеля (т. Е. Вашего клиента ssh).

Другие варианты:

  • -f сообщает ssh о том, что сам фон после аутентификации, поэтому вам не нужно сидеть рядом с чем-то на удаленном сервере, чтобы туннель оставался в живых.
  • -N говорит, что вы хотите подключиться к SSH, но на самом деле вы не хотите запускать какие-либо удаленные команды. Если все, что вы создаете, это туннель, то включение этого параметра сохраняет ресурсы.
  • -T отключает распределение псевдо-tty, что подходит, потому что вы не пытаетесь создать интерактивную оболочку.

Будет вызов пароля, если вы не установили ключи DSA или RSA для входа в систему без пароля.

Обратите внимание, что настоятельно рекомендуется использовать учетную запись (не свой собственный логин), настроенную для этого туннеля /клиента /сервера.

Теперь из вашей оболочки в yourpublichost установите соединение с файловым сервером через туннель:

ssh -p 22222 [email protected]

Вы получите вызов главного ключа, поскольку вы, вероятно, никогда не ударили этого хоста раньше. Затем вы получите пароль для учетной записи username (если вы не настроили ключи для входа в систему без пароля).

Если вы собираетесь получать доступ к этому хосту на регулярной основе, вы также можете упростить доступ, добавив несколько строк в ваш файл ~/.ssh/config:

host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

Откорректируйте remotehostname и remoteusername, чтобы соответствовать. Поле remoteusername должно соответствовать вашему имени пользователя на удаленном сервере, но remotehostname может быть любым именем хоста, которое вам подходит, оно не должно соответствовать чему-либо разрешимому.

(Чтобы открыть обратную конечную точку на не-localhost IP, проверьте этот пост ).

ответил ghoti 24 PM00000090000003131 2012, 21:56:31
279

Я нарисовал несколько эскизов

Машина, на которой печатается команда туннеля ssh, называется Â »вашего хоста« .

ssh tunnel, начиная с локального


ssh tuning from remote

Введение

  1. local: -L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHost означает: подключиться с помощью ssh к connectToHost и перенаправить все попытки подключения на локальный code> sourcePort в порт sourcePort на машине с именем onPort, который можно найти на машине forwardToHost.

  2. remote: connectToHost

    -R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side. означает: connect with ssh to ssh -R sourcePort:forwardToHost:onPort connectToHost и перенаправить все попытки подключения на удаленный sourcePort в порт connectToHost на машине с именем sourcePort, который можно получить с вашей локальной машины.

Дополнительные параметры

  • onPort сообщает ssh о том, что сам фон после аутентификации, поэтому вам не нужно сидеть рядом с чем-то на удаленном сервере, чтобы туннель оставался в живых.
  • forwardToHost говорит, что вы хотите подключиться к SSH, но на самом деле вы не хотите запускать какие-либо удаленные команды. Если все, что вы создаете, это туннель, то включение этого параметра сохраняет ресурсы.
  • -f отключает распределение псевдо-tty, что подходит, потому что вы не пытаетесь создать интерактивную оболочку.

Ваш пример

Третье изображение представляет этот туннель. Но синий компьютер, называемый «ваш хост», представляет собой компьютер, на котором кто-то запускает туннель ssh, в этом случае брандмауэр.

Итак, попросите кого-то запустить туннельное соединение ssh на вашем компьютере. Команда должна выглядеть в основном как

-N

Теперь туннель открывается. Теперь вы можете подключиться через ssh к файловой системе через туннель с помощью команды

-T

, который будет подключаться к вашему собственному ssh -R 12345:localhost:22 YOURIP (ваш аппарат) на порту ssh -p 12345 localhost , но порт localhost отправляется через туннель в порт 22 локального компьютера брандмауэра (т.е. самого компьютера с межсетевым экраном).

ответил erik 8 MaramSat, 08 Mar 2014 02:37:25 +04002014-03-08T02:37:25+04:0002 2014, 02:37:25
17

ssh-туннелирование работает с использованием уже установленного ssh-соединения для отправки дополнительного трафика.

Когда вы подключаетесь к удаленному серверу, у вас обычно есть только 1 канал для обычного взаимодействия с пользователем (или 3 канала, если вы рассматриваете STDIN /STDOUT /STDERR отдельно). В любой момент локальный или удаленный процесс ssh может открыть дополнительные каналы в существующем соединении. Затем эти каналы отправляют /получают туннельный трафик. При отправке или получении какого-либо трафика процесс ssh просто говорит: «Этот трафик для канала foobar».

Он по существу работает следующим образом:

  1. Вы скажите ssh начать прослушивание на порту XXXX и что любой полученный трафик должен быть туннелирован, а затем установить на Y.Y.Y.Y на порт ZZZZ.
  2. Локальный ssh ​​начинает прослушивать порт XXXX (обычно на 127.0.0.1, но может быть изменен).
  3. Некоторое приложение открывает подключение к порту XXXX на локальной машине.
  4. Местный ssh ​​открывает канал для удаленного ssh и говорит, что «любой трафик на этом канале переходит к Y.Y.Y.Y: ZZZZ
  5. Удаленный ssh ​​подключается к Y.Y.Y.Y: ZZZZ и отправляет обратно «OK, канал открыт»
  6. Теперь любой трафик, отправленный по соединению с портом XXXX на локальном компьютере, проксируется ssh по Y.Y.Y.Y: ZZZZ.

Этот процесс является точным для прямого и обратного туннелирования (просто поменяйте слова «local» и «remote» в приведенной выше процедуре). Любая сторона может начать туннель. Это даже не должно быть, когда вы начинаете ssh. Вы можете открыть туннели, пока ssh уже запущен (см. ESCAPE CHARACTERS, в частности ~C).

Для роли -R, -f, -L и -N, вы действительно должен просто проконсультироваться с man-страницей, это даст вам наилучшее объяснение. Но я упомянул -R и -L.
-R сообщает удаленному ssh прослушивать подключения и что локальный ssh должен подключиться к реальному месту назначения. -L указывает местному ssh прослушивать подключения и удаленный ssh ​​должен подключаться к реальному адресату.

Заметьте, это очень грубое описание, но оно должно дать вам достаточно информации, чтобы знать, что происходит.

ответил Patrick 24 PM00000040000003731 2012, 16:31:37
9

Это объясняется в руководстве SSH, особенно о различиях между -L (local) и -R (remote).


-L

  

-L [bind_address:]port:host:hostport

     

Указывает, что данный порт на локальном (клиентском) хосте должен быть перенаправлен на данный хост и порт на удаленной стороне .

     

Это работает, выделяя сокет для прослушивания порта на локальной стороне, необязательно связанного с указанным bind_address.

     

При каждом подключении к этому порту соединение пересылается по защищенному каналу, а соединение выполняется на host порт hostport с удаленного компьютера .

Следующий пример туннелирует сеанс IRC с клиентского компьютера 127.0.0.1 (localhost), используя порт 1234, на удаленный сервер server.example.com:

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10

Примечание. Для фона службы -f ssh и удаленной команды sleep 10 задано количество времени для запуска службы, которая должна быть туннелировано.

Пример:

ssh `-N` -L 22000:localhost:11000 remote.server.com
  • -N После того, как вы подключитесь, просто повесьте там (вы не получите приглашение оболочки)

      

    Не выполнять удаленную команду.

  • -L 22000 Соединение будет происходить на порту 22000 вашего личного, L ocal machine

  • localhost:11000 - remote.server.com, убедитесь, что другой конец туннеля localhost, порт 11000 код>

 ssh -N -L 22000: 192.168.1.2: 11000 remote.server.com

Источник: Иллюстрированный путеводитель, учебник, инструкции по ssh туннелирование .


-R

  

-R [bind_address:]port:host:hostport

     

Указывает, что данный порт на удаленном (серверном) хосте должен быть перенаправлен на данный хост и порт на локальной стороне .

     

Это работает, выделяя сокет для прослушивания port на удаленной стороне, и всякий раз, когда делается соединение с этим портом, соединение пересылается по защищенному каналу , а соединение установлено на host порт hostport с локальной машины .

Пример:

ssh -N -R 22000:localhost:11000 remote.server.com
  • -N После того, как вы подключитесь, просто повесьте там (вы не получите приглашение оболочки)

      

    Не выполнять удаленную команду.

  • -R 22000 Соединение будет происходить на порту 22000 компьютера R emote (в данном случае на remote.server.com)

  • localhost:11000 ваш персональный локальный компьютер будет следить за тем, чтобы другой конец туннеля был localhost, порт 11000

 ssh -N -R 22000: localhost: 11000 remote.server.com

Источник: Иллюстрированный путеводитель, учебник, инструкции по ssh туннелирование .

ответил kenorb 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 15 Sep 2017 12:48:03 +0300 2017, 12:48:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132