it-swarm-ru.tech

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

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

Основываясь на реверсирование ssh-соединения и SSH-туннелирование стало проще , обратное SSH-туннелирование можно использовать, чтобы обойти надоедливые ограничения брандмауэра.

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

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

Какова роль переключателей (-R, -f, -L, -N)?

376
Ali

Я люблю объяснять подобные вещи с помощью визуализации. :-)

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

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

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

(Вы не сказали, но я собираюсь предположить, что упомянутая вами "удаленная" машина, находящаяся за брандмауэром, может выходить в Интернет с помощью трансляции сетевых адресов (NAT). Это очень важно, поэтому пожалуйста, исправьте это предположение, если оно неверно.)

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

ssh tunnel directions

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

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

От Огненного Стража:

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

Это говорит вашему клиенту установить туннель с точкой входа -R. Все, что подключено к порту 22222 в дальнем конце туннеля, фактически достигнет "порта localhost 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 может быть любым именем хоста, которое вам подходит, оно не должно совпадать ни с чем разрешаемым.

Смотрите также:

433
ghoti

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

Машина, на которой набрана команда ssh tunnel, называется "ваш хост".

ssh tunnel starting from local


ssh tunnel starting from remote

Введение

  1. местный: -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 и ​​перенаправить все попытки подключения на локальноsourcePort на порт onPort на компьютере называется forwardToHost, доступ к которому можно получить с машины connectToHost.

  2. удаленный: -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.

    _ssh -R sourcePort:forwardToHost:onPort connectToHost_ означает: подключиться с помощью ssh к connectToHost и ​​перенаправить все попытки подключения на удаленныйsourcePort на порт onPort на компьютере называется forwardToHost, к которому можно обратиться с вашего локального компьютера.

Дополнительные опции

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

Ваш пример

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

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

_ssh -R 12345:localhost:22 YOURIP
_

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

_ssh -p 12345 localhost
_

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

389
erik

туннелирование 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 и отправляет обратно "ОК, канал открыт"
  6. Теперь любой трафик, отправляемый по соединению с портом XXXX на локальном компьютере, передается по ssh через Y.Y.Y.Y: ZZZZ.

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

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

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

24
Patrick

Это объясняется в руководстве по SSH, особенно различия между -L (местный) и -R (дистанционный пульт).


-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 [~ # ~] . server.com)

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

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

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

18
kenorb