Я люблю объяснять такие вещи с помощью визуализации. :-)
Думайте о своих соединениях SSH как о трубках. Большие трубы. Обычно через эти пробирки вы запускаете оболочку на удаленном компьютере. Оболочка работает в виртуальном терминале (tty). Но вы уже знаете эту часть.
Думайте о своем туннеле как о трубе внутри трубы. У вас все еще есть большое SSH-соединение, но опция -L или -R позволяет вам установить меньшую трубку внутри него.
У каждой трубки есть начало и конец. Большая трубка, ваше SSH-соединение, начиналась с вашего SSH-клиента и заканчивалась на SSH-сервере, к которому вы подключены. Все небольшие трубки имеют одни и те же конечные точки, за исключением того, что роль «Пуск» или «конец» определяется используется ли вы -L
или -R
(соответственно) для их создания.
(Вы не сказали, но я предполагаю, что упомянутая вами «удаленная» машина, находящаяся за брандмауэром, может выходить в Интернет с помощью трансляции сетевых адресов (NAT). Это очень важно, поэтому пожалуйста, исправьте это предположение, если оно неверно.)
Когда вы создаете туннель, вы указываете адрес и порт, на который он будет отвечать, а также адрес и порт, на который он будет доставлен. -L
Опция указывает туннель , чтобы ответить на локальной стороне туннеля (хозяин работает ваш клиент). -R
Опция указывает туннель , чтобы ответить на удаленной стороне (сервер SSH).
Итак ... Чтобы иметь возможность SSH из Интернета на машину за брандмауэром, вам нужна рассматриваемая машина, чтобы открыть соединение SSH с внешним миром и включить -R
туннель, точка «входа» которого является «удаленной» стороной его связь.
Из двух моделей, показанных выше, вам нужна модель справа.
От хозяина с огненными стенами:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
Это говорит вашему клиенту установить туннель с -R
точкой входа emote. Все, что подключается к порту 22222 в дальнем конце туннеля, фактически достигнет «порта 22 локального хоста», где «локальный хост» находится с точки зрения точки выхода из туннеля (т. Е. Вашего клиента ssh).
Другие варианты:
-f
говорит ssh самому фону после его аутентификации, так что вам не нужно сидеть и запускать что-то на удаленном сервере, чтобы туннель оставался живым.
-N
говорит, что вы хотите SSH-соединение, но на самом деле вы не хотите запускать какие-либо удаленные команды. Если все, что вы создаете, это туннель, то включение этой опции экономит ресурсы.
-T
отключает псевдо-tty распределение, которое подходит, потому что вы не пытаетесь создать интерактивную оболочку.
Будет проблема с паролем, если вы не настроили ключи DSA или RSA для входа без пароля.
Обратите внимание, что НАСТОЯТЕЛЬНО рекомендуется использовать одноразовую учетную запись (не свою учетную запись), которую вы настроили только для этого туннеля / клиента / сервера.
Теперь из вашей оболочки на вашем публичном хосте установите соединение с брандмауэром через туннель:
ssh -p 22222 username@localhost
Вы получите вызов ключа хоста, так как вы, вероятно, никогда не заходили на этот хост раньше. Затем вы получите запрос пароля для username
учетной записи (если вы не настроили ключи для входа без пароля).
Если вы собираетесь получать доступ к этому хосту на регулярной основе, вы также можете упростить доступ, добавив несколько строк в ваш ~/.ssh/config
файл:
host remotehostname
User remoteusername
Hostname localhost
Port 22222
Отрегулируйте remotehostname
и remoteusername
подойдет. remoteusername
Поле должно соответствовать своему имени пользователя на удаленном сервере, но remotehostname
может быть любым именем хоста , который подходит вам, он не должен соответствовать ничего разрешимого.
(Чтобы выставить обратную конечную точку на нелокальном IP -адресе , прочитайте этот пост )