
У меня следующая настройка: я хотел бы получить доступ к машине A с машины C, но ни у одной из них нет публичного IP-адреса. Однако машина C находится в той же сети, что и машина B, у которой есть публичный IP-адрес, поэтому я могу получить доступ к машине C из любой точки мира, сначала подключившись по ssh к машине B, а оттуда по ssh к машине C. У меня нет доступа root к машине B, тогда как у A и CI он есть. Для пояснения см. следующую схему:
machine A machine B machine C
no public IP public IP no public IP
root access no root access root access
how to access? '---------------------------'
same network
hence both accessible
Глупым решением было бы заставить машину A регулярно прослушивать файл на машине C (с помощью двухэтапного доступа по ssh, описанного выше) и всякий раз, когда в этом файле появляется команда, выполнять ее и записывать выходные данные по ssh куда-нибудь на машину C. Мне, однако, интересно, может ли ssh как-то «обратить» соединение, так чтобы машина A подключалась за два шага к машине C, а затем соединение «обратилось», так что машина C на самом деле имела удаленную оболочку машины A? И если да, как мне это сделать?
решение1
Вам может потребоваться machineA
открыть SSH-туннель к machineB
с опцией удаленной пересылки, что позволит вам подключаться по SSH machineA
к machineB
.
Если у вас есть права root на machineB
, установите GatewayPorts
параметр конфигурации на yes
in /etc/ssh/sshd_config
, затем выполните следующую команду на machineA
:
ssh -N -R 0.0.0.0:2222:127.0.0.1:22 the_public_ip_of_machine_B
Это откроет порт 2222 на machineB
и перенаправит любой трафик с этого порта на себя, на порт 22. Обратите внимание, что это будет прослушиваться на всех интерфейсах, включая публичный, поэтому вы можете захотеть заблокировать порт 2222 (но, вероятно, у вас machineB
и так включен брандмауэр). Пока этот туннель активен, вы можете подключиться по SSH к machineB
порту 2222, и это приведет вас к machineA
. Поскольку machineB
и machineC
находятся в одной подсети, вы можете войти в , machineA
за machineC
один шаг.
Если у вас нет доступа root на machineB
, то процесс тот же самый, за исключением адреса прослушивания. Если GatewayPorts
установлено значение no
(что является значением по умолчанию), то первый аргумент ( 0.0.0.0
) будет просто проигнорирован, а адрес прослушивания будет привязан к 127.0.0.1
. В этом случае вы все равно можете использовать команду выше, и переадресация будет работать так же, но открытый порт будет доступен только из machineB
. Поэтому вы должны подключиться по SSH к machineB
, затем по SSH к localhost
, порт 2222, что приведет вас к machineA
.
Однако вы можете рассмотреть возможность использования чего-то более надежного, например VPN.