У меня две машины. Обе за NAT. Также у меня есть доступ к SERVER с каждой машины. Есть ли способ сделать ssh-туннель с machine1 на machine2 через SERVER?
Клиентские машины — linux mint. СЕРВЕР — debian. У меня есть только права доступа пользователя на всех машинах.
решение1
Я понимаю, как это можно сделать.
Итак, у вас есть 3 компьютера. A,B,C
A, B находятся за NAT. Допустим, B — посредник.
Метод 1
2 туннеля
Таким образом, вы можете создать SSH-соединение из A в B (Туннель 1). И из C в B (Туннель 2). И перенаправить Туннель 1 в туннель 2.
Компьютер A подключается по SSH -L
Компьютер C подключается по SSH -R
-L или -R определяет, какая сторона туннеля слушает, а какая — передает сигнал.
Итак, если я не ошибся, вы можете сделать что-то вроде...
A$ ssh -L 1234:127.0.0.1:2345 user@compB
C$ ssh -R 2345:127.0.0.1:3456 user@compB
Но я не уверен, что вы сможете создать два подключения к одному и тому же SSH-серверу, поэтому попробуйте это. Создание двух разных SSH-серверов.
Отредактируйте sshd_config на CompB, и вы увидите, что там указано «Порт 22». Добавьте под ним строку «Порт 222». Затем CompB запустит SSH-сервер на двух портах.
Затем вы можете подключиться к серверам SSH через два разных порта 22 и 222.
A$ ssh -L 1234:127.0.0.1:2345 user@compB -p22
C$ ssh -R 2345:127.0.0.1:3456 user@compB -p222
Порт 1234 — это порт на компьютере A, к которому вы подключаете свою клиентскую программу. Это вход в туннель 1.
Порт 2345 — это порт на компьютере B и вход в туннель 2.
Порт 3456 — это порт, на котором вы запускаете серверную программу на CompC.
Таким образом, CompA может подключиться к серверу на CompC через CompB.
Метод 2
один туннель
Один из вариантов — использовать только один туннель, но тогда вы получите шифрование только на половине маршрута. 5.6.7.8 — это IP-адрес CompC, порт 3456 — это сервер на CompC, а порт 1234 — это порт прослушивания для туннеля.
A$ ssh -L 1234:5.6.7.8:3456 user@compB
Затем на CompA подключите клиентскую программу к порту 1234 на CompA, и все данные будут переданы на CompC.
решение2
на основе ответабарлоп
У меня есть A и B за NAT. И C, к которому есть доступ из A и B.
На CI должен быть только ssh доступ. Больше ничего не требуется.
на машине A добавить задачу в crontab
$crontab -e
TUNCMDR='ssh -f -N -R 1144:localhost:22 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDR" || ($TUNCMDR && echo "`date`: Land remote port to localhost:22" >> ~/ssh-world.log) &>/dev/null
TUNCMDL='ssh -f -N -L 1234:localhost:1143 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDL" || ($TUNCMDL && echo "`date`: Forward local 1234 port to remote" >> ~/ssh-world.log) &>/dev/null
на машине B добавить задачу в crontab
$crontab -e
TUNCMDR='ssh -f -N -R 1143:localhost:22 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDR" || ($TUNCMDR && echo "`date`: Land remote port to localhost:22" >> ~/ssh-world.log) &>/dev/null
TUNCMDL='ssh -f -N -L 1234:localhost:1144 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDL" || ($TUNCMDL && echo "`date`: Forward local 1234 port to remote" >> ~/ssh-world.log) &>/dev/null
ВНИМАНИЕ: порты 1143 и 1144 изменены на хосте B по сравнению с хостом A
на хосте A
для подключения к B
вам запустить ssh -p 1234 Buser@localhost
на хосте B
для подключения к A
вам запустить ssh -p 1234 Auser@localhost
на хосте C
для подключения к A
вам запустить ssh -p 1144 Auser@localhost
на хосте C
для подключения к B
вам запуститьssh -p 1143 Buser@localhost
Вы можете увидеть информацию о повторном подключенииcat ~/ssh-world.log
ОБНОВЛЕНИЕ
Остановите отключения/зависания сеанса, добавив в ~/.ssh/config
Host *
ServerAliveInterval 15