Насколько я понимаю, брандмауэры (при условии настроек по умолчанию) запрещают весь входящий трафик, у которого нет предшествующего соответствующего исходящего трафика.
Основанный на обратном ssh-соединении и SSH-туннелировании Made Easy , обратное SSH-туннелирование может использоваться, чтобы обойти надоедливые ограничения брандмауэра.
Я хотел бы выполнять команды оболочки на удаленной машине. Удаленная машина имеет собственный брандмауэр и находится за дополнительным брандмауэром (маршрутизатором). У него есть IP-адрес, например 192.168.1.126 (или что-то подобное). Я не за брандмауэром, и я знаю IP-адрес удаленного компьютера, как видно из Интернета (не адрес 192.168.1.126). Кроме того, я могу попросить кого-нибудь выполнить ssh (something)
сначала как root на удаленной машине.
Может ли кто-нибудь объяснить мне, шаг за шагом, как работает обратное туннелирование SSH, чтобы обойти брандмауэры (брандмауэры локальных и удаленных машин и дополнительный брандмауэр между ними)?
Какова роль переключателей ( -R
, -f
, -L
, -N
)?
Ответы:
Я люблю объяснять такие вещи с помощью визуализации. :-)
Думайте о своих соединениях SSH как о трубках. Большие трубы. Обычно через эти пробирки вы запускаете оболочку на удаленном компьютере. Оболочка работает в виртуальном терминале (tty). Но вы уже знаете эту часть.
Думайте о своем туннеле как о трубе внутри трубы. У вас все еще есть большое SSH-соединение, но опция -L или -R позволяет вам установить меньшую трубку внутри него.
У каждой трубки есть начало и конец. Большая трубка, ваше SSH-соединение, начиналась с вашего SSH-клиента и заканчивалась на SSH-сервере, к которому вы подключены. Все небольшие трубки имеют одни и те же конечные точки, за исключением того, что роль «Пуск» или «конец» определяется используется ли вы
-L
или-R
(соответственно) для их создания.(Вы не сказали, но я предполагаю, что упомянутая вами «удаленная» машина, находящаяся за брандмауэром, может выходить в Интернет с помощью трансляции сетевых адресов (NAT). Это очень важно, поэтому пожалуйста, исправьте это предположение, если оно неверно.)
Когда вы создаете туннель, вы указываете адрес и порт, на который он будет отвечать, а также адрес и порт, на который он будет доставлен.
-L
Опция указывает туннель , чтобы ответить на локальной стороне туннеля (хозяин работает ваш клиент).-R
Опция указывает туннель , чтобы ответить на удаленной стороне (сервер SSH).Итак ... Чтобы иметь возможность SSH из Интернета на машину за брандмауэром, вам нужна рассматриваемая машина, чтобы открыть соединение SSH с внешним миром и включить
-R
туннель, точка «входа» которого является «удаленной» стороной его связь.Из двух моделей, показанных выше, вам нужна модель справа.
От хозяина с огненными стенами:
Это говорит вашему клиенту установить туннель с
-R
точкой входа emote. Все, что подключается к порту 22222 в дальнем конце туннеля, фактически достигнет «порта 22 локального хоста», где «локальный хост» находится с точки зрения точки выхода из туннеля (т. Е. Вашего клиента ssh).Другие варианты:
-f
говорит ssh самому фону после его аутентификации, так что вам не нужно сидеть и запускать что-то на удаленном сервере, чтобы туннель оставался живым.-N
говорит, что вы хотите SSH-соединение, но на самом деле вы не хотите запускать какие-либо удаленные команды. Если все, что вы создаете, это туннель, то включение этой опции экономит ресурсы.-T
отключает псевдо-tty распределение, которое подходит, потому что вы не пытаетесь создать интерактивную оболочку.Будет проблема с паролем, если вы не настроили ключи DSA или RSA для входа без пароля.
Обратите внимание, что НАСТОЯТЕЛЬНО рекомендуется использовать одноразовую учетную запись (не свою учетную запись), которую вы настроили только для этого туннеля / клиента / сервера.
Теперь из вашей оболочки на вашем публичном хосте установите соединение с брандмауэром через туннель:
Вы получите вызов ключа хоста, так как вы, вероятно, никогда не заходили на этот хост раньше. Затем вы получите запрос пароля для
username
учетной записи (если вы не настроили ключи для входа без пароля).Если вы собираетесь получать доступ к этому хосту на регулярной основе, вы также можете упростить доступ, добавив несколько строк в ваш
~/.ssh/config
файл:Отрегулируйте
remotehostname
иremoteusername
подойдет.remoteusername
Поле должно соответствовать своему имени пользователя на удаленном сервере, ноremotehostname
может быть любым именем хоста , который подходит вам, он не должен соответствовать ничего разрешимого.(Чтобы выставить обратную конечную точку на нелокальном IP -адресе , прочитайте этот пост )
источник
Я нарисовал несколько эскизов
Компьютер, на котором набрана команда ssh tunnel, называется « ваш хост» .
Введение
местный:
-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
означает: подключиться с помощью sshconnectToHost
и перенаправить все попытки подключения на локальныйsourcePort
портonPort
на вызываемом компьютере, доступ кforwardToHost
которому можно получить с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.
ssh -R sourcePort:forwardToHost:onPort connectToHost
означает: подключиться через sshconnectToHost
и перенаправить все попытки подключения к удаленномуsourcePort
портуonPort
на вызываемую машину, доступ кforwardToHost
которой можно получить с локальной машины.Дополнительные опции
-f
говорит ssh самому фону после его аутентификации, так что вам не нужно сидеть и запускать что-то на удаленном сервере, чтобы туннель оставался живым.-N
говорит, что вы хотите SSH-соединение, но на самом деле вы не хотите запускать какие-либо удаленные команды. Если все, что вы создаете, это туннель, то включение этой опции экономит ресурсы.-T
отключает псевдо-tty распределение, которое подходит, потому что вы не пытаетесь создать интерактивную оболочку.Ваш пример
Третье изображение представляет этот туннель. Но синий компьютер, называемый «ваш хост», представляет собой компьютер, на котором кто-то запускает туннель ssh, в данном случае это машина с брандмауэром.
Поэтому попросите кого-нибудь запустить туннельное соединение ssh с вашей машиной. Команда должна в основном выглядеть
Теперь туннель открыт. Теперь вы можете подключиться через ssh к брандмауэру через туннель с помощью команды
который будет подключаться к вашему
localhost
(вашей машине) через порт12345
, но12345
через туннель порт будет перенаправлен на порт 22 локального хоста компьютера с брандмауэром (то есть самого компьютера с брандмауэром).источник
Туннелирование ssh работает с использованием уже установленного ssh-соединения для отправки дополнительного трафика.
Когда вы подключаетесь к удаленному серверу, у вас обычно есть только 1 канал для обычного взаимодействия с пользователем (или 3 канала, если вы считаете STDIN / STDOUT / STDERR отдельным). В любое время локальный или удаленный процесс ssh может открыть дополнительные каналы в существующем соединении. Эти каналы затем отправляют / получают туннельный трафик. При отправке или получении любого трафика процесс ssh просто говорит: «Этот трафик предназначен для канала foobar».
По сути, это работает так:
127.0.0.1
, но может быть изменен).Этот процесс одинаков как для прямого, так и для обратного туннелирования (просто поменяйте местами слова «локальный» и «удаленный» в вышеописанной процедуре). Любая сторона может начать туннель. Это даже не должно быть при первом запуске ssh. Вы можете открывать туннели, пока ssh уже запущен (см.
ESCAPE CHARACTERS
, В частности~C
).Для роли
-R
,-f
,-L
и-N
вы на самом деле нужно просто обратиться к странице, это дает вам самое лучшее возможное объяснение. Но я упомяну-R
и-L
.-R
говорит удаленному ssh прослушивать соединения и что локальный ssh должен подключаться к реальному месту назначения.-L
говорит локальному SSH прослушивать соединения, и что удаленный SSH должен подключиться к реальному месту назначения.Обратите внимание, это очень грубое описание, но оно должно дать вам достаточно информации, чтобы знать, что происходит
источник
Это объясняется в руководстве по SSH, особенно различия между
-L
(локальным) и-R
(удаленным).-L
В следующем примере туннелируется сеанс IRC с клиентского компьютера
127.0.0.1
(localhost
) через порт 1234 на удаленный серверserver.example.com
:Примечание:
-f
Опция фоны ssh и удаленная командаsleep 10
указываются, чтобы дать время для запуска службы, которая должна быть туннелирована.Пример:
-N
После подключения просто повесьте туда (вы не получите приглашение оболочки)-L 22000
Соединение будет происходить на порт 22000 вашей личной, L Öçal машиныlocalhost:11000
-remote.server.com
убедитесь, что другой конец туннеляlocalhost
, порт11000
Источник: иллюстрированное руководство, учебное пособие, инструкции по туннелированию ssh .
-R
Пример:
-N
После подключения просто повесьте туда (вы не получите приглашение оболочки)-R
22000 Соединение будет инициировано через порт 22000 компьютера R emote (в данном случае remote.server.com).localhost:11000
Ваш персональный локальный компьютер позаботится о том, чтобы на другом конце туннеля былlocalhost
порт11000
Источник: иллюстрированное руководство, учебное пособие, инструкции по туннелированию ssh .
источник