связать машины, которые находятся за NAT, через туннель ssh

связать машины, которые находятся за NAT, через туннель ssh

У меня две машины. Обе за 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

Связанный контент