
Я с трудом понимаю, возможно ли следующее и как это сделать.
Допустим, у меня есть машина T
(цель), к которой я хочу получить удаленный доступ (в идеале через ssh
).
T
находится за маршрутизатором/брандмауэром R
и я не могу перенаправить порт (например) 22
на R
порт 22
. T
Одним словом, прямой ssh
доступ к T
невозможен.
Теперь скажи, что
У меня есть машина,
A
над которой я имею полный контроль.Я могу подключиться по ssh из
T
,A
т.е.T: ssh user@A
преуспевает.
В1:могу ли я использовать это для доступа к оболочке из T
? A
Т.е. могу ли я использовать соединение, созданное из T
для A
, чтобы использовать T
из A
?
T ---> ssh ----> A # this is possible
T <--- ? shell ? <---- A # is this possible?
В2:ЕслиQ1возможно:
Допустим, у меня есть третья машина L
(например, мой ноутбук), и я хочу получить доступ к оболочке из T
. Могу ли я получить доступ к L
ssh-туннелю ?A
L
T ----> ssh ----> A <---- ssh < ---- L
T <------- ?? %&£€ ?? <------- L # is this possible?
любая помощь приветствуется.
решение1
Конечно, это возможно.
Q1: возможно ли обратное туннелирование через ssh?
Да. Вот несколько ответов о резервном туннелировании:
Q2: возможно ли туннелирование зарезервированного туннеля?
Да, это по сути ssh туннель через туннель. Вот несколько ответов относительно туннеля в туннель:
решение2
Я делаю это все время, в другую сторону. Сначала установите обратный туннель SSH от T до localhost на A, затем туннель от L до стороны A туннеля AT, затем используйте ssh для подключения к локальной части туннеля LA, и вы подключитесь удаленно через LAT.
В моем примере A прослушивает ssh-соединения на порту 22123.
Локально я использую имя пользователя user, удаленно — user.name.
У меня есть ключи локально с именами ~/.ssh/A_id_rsa и ~/.ssh/T_id_rsa для подключения к 2 машинам A и T соответственно как user.name.
Вот скрипт для подключения туннеля TA, который следует запустить на T.
#!/bin/баш SSH_KEY="-i /home/имя.пользователя/.ssh/A_id_rsa" REMOTE_USER="имя.пользователя" GATEWAY_MACHINE="A.domain.com" GATEWAY_SSH_PORT="22123" ssh -N -R2201:127.0.0.1:22 -p ${GATEWAY_SSH_PORT} ${SSH_KEY} ${REMOTE_USER}@${GATEWAY_MACHINE}
Вот скрипт для подключения туннеля LA, который следует запустить на L.
#!/bin/баш SSH_KEY="-i /home/user/.ssh/A_id_rsa" REMOTE_USER="имя.пользователя" GATEWAY_MACHINE="A.domain.com" GATEWAY_SSH_PORT="22123" ssh -N -L2201:127.0.0.1:2201 -p ${GATEWAY_SSH_PORT} ${SSH_KEY} ${REMOTE_USER}@${GATEWAY_MACHINE}
Затем я добавляю следующее в файл /etc/hosts моего локального хоста, чтобы я мог ссылаться на локальную сторону туннеля как на T:-
127.0.0.1 Т
Затем у меня есть этот скрипт, в нашем примере называемый /usr/local/bin/T, для подключения к нему
#!/bin/баш SSH_KEY="-i /home/user/.ssh/T_id_rsa" REMOTE_USER="имя.пользователя" ssh -p 2201 ${SSH_KEY} ${REMOTE_USER}@T
Туннель TA является обратным, поэтому -R, туннелер LA является локальным, поэтому -L. -N в скриптах не позволяет им запускать оболочку для A, поэтому я обычно запускаю его либо с помощью &, чтобы запустить его в фоновом режиме, либо нажимаю ctrl+Z и запускаю bg, чтобы сделать это, после ввода пароля для разблокировки A_id_rsa, если он еще не загружен в мою связку ключей.